NEWS - Tsidiho ny tranonkala
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 ...
Fianarana sy fiarovana ara-pinoana ara-pinoana sy fiarovana amin'ny alàlan'ny ohatra

Практично веб -базирано длабоко учење и безбедност на пример Трето издание Шарлот Харпер 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 Крајниот корисник кој сака да убие време или да заврши нешто на Интернет, обично на уредот за паметни телефони на екранот на допир. Повеќето луѓе дури и не би знаеле од каде да започнат кога сакаат да изградат веб -страница од нула, би имале тенденција да започнат на веб -страницата на друго лице и да изградат нешто ограничено во функционалноста, зависноста, леснотијата на употреба и особено креативноста кога би можеле да ги имаат сите најнови алатки за нивна на располагање, со цел да се изградат нешто корисно, без да губат време за притискање на копчињата, а особено да трошат пари што плаќаат за скапи претплати за софтвер за да ги искористат, како и да е, да ги искористат ограничувањата. Ако имате неколку минути да прочитате низ оваа книга и да научите што сакам да ве научам, па дури и да зборувам со мене лично за вашите цели и да добиете некои насоки во вистинската насока, и се мотивирани да научите да кодирате и да напишете свој софтвер, да ја однесете оваа книга дома и да издвоите некое време да научите да ги градите следните, моќни, моќни, рационализирани и важни веб -апликации, веб -страница што е сè на вас и прави токму она што го сакате и ги исполнува потребите на вашата публика.

За мене: Јас сум развивач на софтвер со широк спектар на искуство во C/C ++, Java, Python, HTML, CSS и JavaScript. Јас градам веб -страници што луѓето сакаат да ги користат, сакаат да ги посетуваат, па дури и да бидат зависни од користење само за да научам, рекреираат и убиваат време, и што е најважно, продавам софтвер. Ако имавте идеја за точно како сакате веб-страница да изгледа и да функционира, бевте подготвени да ме поддржувате за да можам да ги задоволам моите потреби додека ги исполнувам вашите, и вие сте подготвени сами да ги покриете трошоците за водење веб-страница, ќе ви ги изградам следните YouTube, Tiktok, Twitter, Google, па дури и со високо-технолошка безбедносна апликација за безбедност само што можете да пристапите. Наместо да се обидам да ви го продадам моето време, јас се обидувам да го купам вашето: Сакам да ви зборувам за градење апликација (веб -страница) со информациите што веќе постојат и да ве научам што ви треба за да бидете независен развивач на софтвер, претприемач, водејќи успешна кариера во кое било поле што сакате. И, дозволете ми да бидам јасно, образованието што ви го давам ќе биде неформално. Може да одите на училиште и да го научите сето ова со официјално образование, па дури и да ја прочитате оваа книга во училиште, да ги завршите вашите задачи и да однесете многу од вашето образование, но јас нема официјално да ве ставам на жешкото место и да ве замолам да завршите задачи. Јас не сум твојот професор, можеш да мислиш на мене како пријател кој сака да ве води кон кариера управувана од вашиот личен успех. И јас не ви продавам успех, ќе треба да го купите со вашето време. Учењето за код има стрмна крива на учење и никогаш не беше лесно, па дури и требаше да биде. Треба да работите колку што е можно и да продолжите да се обидувате и да не успеете и да пробате повторно дури и кога сте фрустрирани за да научите и да градите апликации сами. Тоа е во природата на самиот код. Кодот го води компајлерот кој е дизајниран да им даде на програмските пораки за грешка, и овие ќе ве научат како да кодирате, дури и ако едноставно ја копирате грешката во вашиот пребарувач и читате примери на други луѓе. И морам да кажам, не треба да бидете екстремно богати, паметни, успешни, па дури и детали ориентирани или организирани за да изградите апликација. Компјутерот се грижи за таа организација за вас. Само треба да истраете преку проба и грешка, да одржувате фокус и напорно да работите на она што го правите и ќе имате многу успешна кариера во целост на она што го правите.

Кој сум јас: Сфаќам дека последниот дел беше повеќе за учење и за вашите начини од оваа книга. Кој сум точно? Тоа е комплицирано прашање. Јас сум нејасен за тоа, бидејќи страдам од медицински состојби што можат да ми го отежнат дури и да ја кодирам или пишувам оваа книга на моменти, истовремено презентирам предизвици со социјализација и идентитет што го отежнуваат мојот живот кога станува збор за воведување себеси. Накратко, ако ја читате оваа книга, ја донесовте дома затоа што се превртевте низ неа и мислевте дека е корисно, или дури и ако само го прочитавте ова далеку, за вас, јас сум сличен ум индивидуа која сака да види дека успеете во сè што правите. Јас сум самиот инженер, развивач на софтвер и студент, и ја пишувам оваа книга за други студенти кои сакаат да ги олеснат своите животи со тоа што имаат прирачник за софтверот што им е потребно да го олеснат својот живот со давање примери за копирање на кои се вклопуваат заедно како голема загатка во работна, корисна, голема, функционална, кохезивна и ангажирана апликација што може да вози успех без оглед на линијата на бизнисот. Во голема мера, ова е она што го правам: Јас градам апликации за да им помогнам на себе и на другите луѓе да успеат. Јас сум и автор, иако ова е моја прва публикација што имам намера да ја завршам за да го ставам моето портфолио заедно во корисен документ, и јас сум и уметник. Thisе ти признаам ова, јас сум еден вид чудна личност. Јас не сум совршен, имав водечки инс со законот дури и ме натера да ги напуштам колеџи и универзитети и да ги напуштам државите со цел да се обидам да направам име за себе со поголем успех. Јас сум жена по раѓање, носам шминка, се фотографирам со себе, носам фустани и друга женска облека и останувам свесен за себеси како жена по природа. Имав проблеми со други луѓе во минатото што водат до борби со пишување и градење веб -страници и се извинувам што не успеав да ја добијам оваа книга во ваши раце порано: ти требаше ова. Wantе сакате да прочитате и да напишете код што изгледа како мој и работи како мое и го прави истото, но уште подобро, затоа што ако можете да си дозволите да ја купите оваа книга наместо да ја мешате тастатурата, како што правам само за да создадете книга сами барајќи пари за тоа, ги имате ресурсите што ви требаат за да бидете успешни во вашиот живот. Имав секакви прашања со растењето на семејството, здравствените состојби, лекарите, медиумите и законот, а мојот код длабоко ја одразува борбата што е феминизам и женска природа во поделен и фрустриран свет. Како и да е, оваа книга е нешто за што длабоко се грижам, моето бебе, моето портфолио и мојата егзистенција, па затоа го ценам вашето размислување кога ќе го земете текстот дома и внимателно го поривате за да научам од мене. Ве молиме, имајте на ум дека не сум совршена, оваа книга ќе има грешки, ревизии и нови изданија и ќе треба да размислите со вашиот логичен мозок како најдобро што можете за да имате успешно искуство со моето пишување. Исто така, разберете дека мислам добро за вас дури и кога се соочувате со предизвици кога пишувате. Размислете за тоа вака: Кога можете само да изнајмите компјутерски систем за да направите нешто што можете да замислите во дигиталниот простор, да ги чувате сите информации со кои се соочувате, анализирате и организирате и ќе го разберете, неизбежно ќе наидете на потешкотии со информациите што ги внесувате, па дури и објавувате. Јас ти го кажувам ова затоа што наидувам на исти потешкотии. 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 ќе работи, Интернет. Можеби не сте многу запознаени со кого сум со само неколку зборови, но ве охрабрувам да прочитате, ќе ме запознаете додека продолжувате да ме читате и разбирате додека градите свои проекти за да ја завршите вашата работа. Нема да има домашна задача со оваа книга, сè додека вашите професори или наставници не ви доделуваат, но јас многу ве охрабрувам да изградите портфолио на проекти сами како што читате заедно, како и проект за највисок премин, кој покажува како можете да го примените она што го научивте. 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.

Што е оваа книга: Оваа книга е упатство по пример. 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 Софтвер што го градите во апсолутно најдобро светло за да бидете најатрактивни што е можно повеќе за вашите крајни корисници, посетителите на вашата веб -страница. Во оваа книга, ќе демонстрирам голем број примери на дизајн на софтвер со фокус на Интернет како платформа, како и безбедност. Willе го иницираме искуството за учење со изградба на основен проект користејќи ја школка Unix, со карактеристики на резервна копија и скриптирање. Потоа, ќе испитаме основна веб -страница на блогот, ќе го надополниме нашиот блог со карактеристики на фотографии и видео, како и ќе ги користиме овие карактеристики за да употребиме безбедносни решенија користејќи бесплатен софтвер и да го обезбедиме нашиот сервер користејќи модул за автентикација што може да се приклучи (ПАМ). Потоа ќе го разгледаме ракувањето и обработката на датотеките, да истражуваме видео уредување, донацијата на глас, скенирањето на баркодовите и препознавањето на оптичкото значење, меѓу другите концепти. На патот, ќе ги испитаме API што ќе ни помогнат да го направиме нашиот софтвер покорисен и безбеден, со бесплатни и платени опции. На патот, ние ќе истражиме физичка безбедност и милитантни алатки, како што се огнено оружје и муниција, дизајн и производство, вклучувајќи дизајн на барел и повторувач, дизајн на бедем и беспилотни летала и други директори што ќе ги интегрираме со нашиот софтвер на постојната мрежа со цел да го заштитиме нашиот софтвер и да демонстрираме самоодбрана и рестартираност. Takingе преземеме паузи на патот за да изградиме игри, 2Д и 3Д мотори за рендерирање и да работиме со вграден хардвер во примери на студија на случај на основен димензионален софтвер за рендерирање и електронски масаџер за вибрации, фрлени во силиконска гума, соодветно. На патот, ние исто така ќе користиме решенија за машинско учење веќе достапни со цел подобро да го обезбедиме нашиот софтвер. Исто така, ќе користиме алатки за акции достапни за Интернет со цел да го насочиме и обезбедиме процесот. Оваа книга е водич за вашиот успех во градењето на веб -апликација и интегрирање со професионална мрежа на компјутер и вградени механички системи и во целост упатство за градење софтвер и вграден хардвер без знаење во позадина или претходно искуство.

Што не е оваа книга: Ако навистина сакате да имате веб -страница, само би можеле да поставите едноставна продавница и да продадете што ви треба, да објавите блог, да објавувате фотографии или видеа, или на друг начин, без воопшто да напишете ниту една линија на код. Оваа книга не е така. Оваа книга ќе ве научи како да изградите софтвер кој е покорисен, целосно прикажан, функционален и безбеден од кој било софтвер што веќе можете да го најдете, затоа што го распоредува најновиот софтвер кој сè уште е прототипови, може да биде скап за да работи во скала постари компании кои работат, и не апелира наназад, згрчени компании поставени за да заработат пари за луѓе кои не прават ништо. Ако внимателно ја следите оваа книга, ќе сакате да напишете код, код за истражување, да изградите свои апликации и ќе заработите пари од она што го правите. Willе заработам пари од оваа книга, дури и во рани фази, затоа што содржи информации што луѓето им се потребни и сакаат да ги прочитаат, и веќе купуваат кога купуваат или користат моите апликации. Оваа книга нема да изгради апликација за вас, но ќе ве насочи во вистинската насока и ќе ве вооружи со алатките што ви се потребни и вештини и совети што ќе го олеснат вашиот сопствен успех во градењето софтвер за веб, со секоја линија на код што ќе треба да ги напишете како пример, подготвени да бидат разгледани во софтвер вас и вашите поддржувачи, гости, муштеци, клиенти, пријатели, посети, изведувачи, изведувачи и луѓе и на луѓето од Интернет сакаат да ја користат и поддршката.

Што ќе научите: Оваа книга ќе ве научи како да градите и продавате софтвер, навистина функционален, корисен софтвер, снимање на медиуми, безбедносни карактеристики како што се препознавање на лицето, скенирање на баркодови што може да се читнат во машината, веб -API -овите за автентикација, снимање и рендерирање на видео и фотографии и размена на пораки како Bluetooth и блиско поле (NFC) комуникација. This book will teach you how to use a networked computer, focusing on debian linux, how to build bash code to make installing and backing up your software a seamless, automated breeze, how to build python code as a backend to serve dynamic messages, style things nicely using CSS styles with Bootstrap, enable user logins and interactivity through networked devices, build interactive media and network with other websites to offer security features like text messages for Верификација или други цели, скенирање на лична карта, умереност на слика и видео, микро -трансакции со податоци за да го задржите вашиот софтвер безбеден, обработка на плаќање, тргување со криптоцентрали, асинхрони задачи и многу повеќе. Learnе научите како да изградите свои Bluetooth уреди, со батерии, полначи, микроконтролери, кола, мотори и сензори, користејќи лемење, жица и 3Д печатени, како и кастиран материјали. Willе демонстрирам директори на 3Д дизајн што се применуваат на производство на додатоци и алатки и правење умирање, така што можете да произведете свои вградени, хардверски уреди со интегрирани батерии, полначи, електронски кола и функционални излези. и мрежи ги со Bluetooth и веб. Поточно, ќе испитаме две студии на случаи, вибрирачки масажер и домашно огнено оружје, и двете програмирани во OpenScad, кој е достапен како графички интерфејс или командна линија алатка и може да се интегрира во веб за побрзи резултати. Learnе научите како да изградите и распоредите веб -страница од земја без претходно искуство, да го направите тоа функционално, безбедно, убаво, корисно и што е најважно практично. Learnе научите како да користите машинско учење и компјутерска визија за да направите веб -страница безбедна и попрактична, снимајте видео и аудио од вашата веб -страница, да го донирате вашиот глас, да направите музика и да го модулирате аудио за да создадете корисни примероци и како да ја пробиете бучавата со искористување на други веб -страници за да ја изградите најдобрата можна мрежа на веб -страници што можете директно да ги поврзете со вашите, со цел да ги споделите сите корисни информации што ги нудите, и уште поважно да ги донесат луѓето во вашиот софтвер и бизнис. Оваа книга најмногу ќе биде фокусирана на медиуми, безбедносно и машинско учење, кои се најголемите три компоненти кои ќе ви помогнат да изградите корисен софтвер за Интернет преку ангажирање на вистинските корисници и да ги исклучите погрешните на начин што е реален, практичен, рацете и ангажирани додека исто така автоматски и цврсти. Оваа книга учи Unix, конкретно Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript и голем број на корисни софтверски пакети за барањата на Python, како и корисен баш софтвер како Git и FFMPEG. Исто така, ќе ве научам како автоматски да тргувате со cryptocurrency и да земате плаќања во cryptocurrency или од редовни дебитни картички, додека дури и им плаќате на вашите посетители дел од вашите приходи ако изберете да го сторите тоа. Јас ќе ве научам како да заработите пари од вашата веб -страница преку рекламирање, исто така, како да ја подготвите вашата апликација за пребарувачи и да ја направите брзо, рангирана на првиот ранг за она што вашите клиенти ќе го пребаруваат за да ве најдат и да се рангираат во што е можно повеќе вообичаени пребарувања. Јас ќе ве научам како да го продадете вашиот софтвер, да го рекламирате, да им се допаднете на клиентите кои ги бараат вашите услуги и да направите име за себе на Интернет преку патиштата што веќе постојат, се ефтини и работат добро. Youе ве научам како да ги зачувате вашите податоци на облачни компјутери кои работат за вас и да ги зачувате вашите податоци ефтино, како да испланирате и да изградите веб -страница што го прави она што го сакаат вашите корисници и што сакате, и како да ги задржите вашите корисници ангажирани со ставање на вашата страница да се допрете на нивните телефони со известувања, е -пошта, текстуални пораки, телефонски повици и повеќе поштеди за да ги вратат вашите корисници на вашата веб -страница на вашиот делот зад кликнувањето на копчето за време на копчето. Оваа книга ќе се фокусира на практичноста на објавување и дистрибуирање на медиуми во големи количини, од текст до фотографии до видеа до аудио, правење добар впечаток на крајните корисници (вашата муштерија) и ќе се продавате на кој било начин што го правите за да создадете веб -страница, апликација што е репрезентативна за вас и вие само, и ве прави само вас, вашиот софтвер и вашата компанија да изгледате добро на најдобриот начин. Исто така, ќе научите неколку совети и трикови од мене, од совети за кодирање, практична суета како шминка и фотографија, моделирање и дејствување, и повеќе, што ќе биде важно за прикажување на себе си и вашата компанија во најдобро можно светло, користејќи ги сите алатки што ви се достапни, додека дистрибуирате колку што ви е потребна содржина колку што ви требаат во здравството преку здрава рамнотежа на платформите за да го донесете вашиот софтвер за да се подели без повеќе напор, или пари од е потребно. Оваа книга се нарекува „практичнаWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Зајакнување, објавување на слика и други задачи како што се метрика за предвидување, добиени од слики, како што е природата на сликата како автентична, компјутерска пренесена слика или оптичка копија (фотографија од слика или печатена фотографија). Со вашето лице. употреба). Секој што гради софтвер што е беспрекорно безбеден има чувство за тоа што подразбира ова. Софтверот е инхерентно несигурен затоа што уредите и сметките што ги користиме за пристап до него не се секогаш на располагање, тие би можеле да бидат во рацете на секој со лоша намера за софтверот и затоа може да претставуваат ризик за самиот софтвер. Ова е нешто во фокусот на оваа книга. Вмрежен компјутер е стандардно обезбеден со долг клуч, наречен и SSH или безбеден клуч за школка, и инаку е најдобро обезбеден со веб -сервер, затоа што веб -серверот обезбедува отворен пристап, како и состојба на алатките за уметност безбедност што работат на самиот сервер. Веб -серверот има пристап до веб -прелистувачот на корисникот, кој е веројатно најмоќниот дел од уредот на корисникот, затоа што тоа е местото каде што корисникот може да пристапи до мрежен софтвер. This toolkit can render text, the webpages you see, and can also record images, audio and video (like a photo of a face or a state ID), can read and write to Bluetooth radio devices, and can read and write to near field transponder tags, inexpensive key cards, fobs, stickers, rings and even chip implants with unique serial numbers that can be read and written to with data generated and validated by a web server tied to the web site. Користејќи ги сите алатки што ви стојат на располагање, со оваа книга ќе се опремите со знаење за да изградите безбедна веб -страница и во целост безбеден мрежен компјутерски систем што работи за вас, го прави вашето наддавање и изгледа и се чувствува

Од каде да се започне: Вие сте добредојдени да го прескокнете пред делот што ја започнувам оваа книга со, или кој било дел, на точниот код што ви треба, особено ако имате искуство со кодирање пред или која било од споменатите алатки што ќе ги опишам детално во оваа книга, како и документирање на случаи на употреба и практични примери за нив. Ако немате искуство во код за пишување, препорачувам да ја прочитате целата оваа книга, а особено препорачувам да ги прочитате претходните делови, за да бидете сигурни дека оваа книга е соодветна за вас. Ако оваа книга не е соодветна за вас, размислете да му ја надаете на пријател или роднина кој би можел да биде заинтересиран да научи за самите развој на веб, па дури и да размислиме да ја позајмите и да научите од нив за да ги пополните празнините каде што не успеав како наставник, или други наставници пред мене. Започнете каде што сакате, секој дел од оваа книга ќе биде корисен ако имате намера да изградите корисна апликација и сметате дека најдобрите апликации се изградени со крајниот корисник на ум: познајте го вашиот клиент. Сега ме познавате, ја знаете оваа книга и подготвени сте да започнете. За да започнете, зграпчете компјутер (дури и најевтиниот лаптоп од продавница за кутии, Амазон или стара работна површина работи и поставете го на начин што работи за вас.

Како да ја прочитате оваа книга: Нагласен текст, означува дека текстот припаѓа во командна линија, каде ќе го напишете кодот што го извршувате. Командната линија е силно фокусирана на тастатурата и бара малку или без кликнување, забрзување на вашиот проток на работа и ги олеснува работите на вас.

Започнување: Ајде да се нурнеме. Startе започнеме со градење код на локална машина и ќе започнеме без да градиме веб -страница поврзана на Интернет. Ова е побезбедно да се започне со, не чини ништо и е лесно за вас. Во зависност од вашиот оперативен систем, влегувањето во баш школка ќе биде малку поразлично. За Mac OS, препорачувам да инсталирате виртуелна машина во овој момент, бидејќи ќе добиете најголема компатибилност со виртуелна машина. Различни даватели на услуги, како што се VirtualBox и Paralells, можат да извршат виртуелна машина за вас, иако е исто така можно да се инсталира Ubuntu директно на машината, доколку сакате да користите домашна околина што се препорачува за да создадете брзо, рационално искуство. Ако користите Linux или Windows, што ги препорачувам, треба да биде лесно да се создаде проект. Отворете го вашиот терминал, прилагодете ја големината како што сметате дека е соодветно и започнете да го следите Чекор 2. Ако користите Windows, следете го Чекор 1.

Чекор 1: - Само корисници на Виндоус Во Windows, отворете ја командата како администратор и напишете WSL - INSTALL

Чекор 2: - Продолжете овде или прескокнете чекор 1 до овде ако не користите Windows Во отворен терминал, (во зависност од вашиот оперативен систем, наречен Ubuntu во Windows, терминал во Mac или Linux, или слично име), започнете со создавање проект. Ова го правиме со командата mkdir, што создава директориум. Ако треба да креирате директориум за да го чувате вашиот проект, кој се препорачува, користете ја командата ЦД за да се смените во директориумот и и и

ЦД/патека/до/директориум - Патеката е папки (датотеки) кои му претходат на вашиот дестинација, вашата стандардна патека е ~ или/дома/корисничко име (каде корисничкото име е вашето корисничко име). За да се смените во стандардниот директориум, напишете ЦД или ЦД Пример за mkdir - Заменете го „Пример" со името на директориумот

Сега имате работен директориум за вашиот проект. Бидејќи е толку важно да го зачувате овој директориум во случај да треба да се префрлите на друга машина или да го распоредите кодот што го пишувате, така што е подготвен за веб, ние ќе изградиме скрипта за да го вратиме вашиот директориум во следните неколку чекори. Но, градењето скрипта трае малку код, а кодот треба да се автоматизира за да биде што е можно корисно. Па, ајде да изградиме скрипта за да изградиме скрипти прво. Да започнеме со создавање на сценариото и да го направиме извршен. Useе користиме sudo, chmod и допираме за ова и ќе го наречеме скриптата „Аскрипт".

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

Сега ја создадовме скриптата, ја направивме извршна и подготвени сме да ја уредуваат. Нано е уредник на текст што ќе ви овозможи да уредувате текст без да кликнете, што е многу полесно отколку да користите графички кориснички интерфејс. За да уредувате датотека со нано, користете нано и потоа патеката до датотеката. Да се ​​направи скрипта што прави скрипта, тоа е прилично слично на правењето на нашата скрипта на прво место. Ние ќе го користиме истиот код како погоре, заменувајќи го името на скриптата, „аскрипт" со параметар за аргументи, 1 $. Ова ни овозможува да ја наречеме скриптата со внесување едноставно Sudo Ascript Newscript, во кој момент можеме да создадеме каква било нова скрипта со замена на „вести" со името на вашата скрипта. Кодот во Нано треба да изгледа:

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

И да го затвориме Нано, можеме да го задржиме контролното копче и да притиснеме x, а потоа y за да означиме дека ја зачувуваме датотеката и ќе го погодиме враќањето. Сега, наместо да ги внесуваме овие три команди за да уредиме скрипта, ќе можеме да напишеме аскрипт на аскриптите на судо за повторно да ја уреди скриптата. Ова работи! И секоја нова скрипта може да се изврши лесно со тоа што ќе ја повикате во школка. Ајде да ја зачуваме нашата работа сега: Ајде да напишеме резервна скрипта за да ја зачуваме нашата нова скрипта и потоа да ја вратиме во нашиот проект Директориум, истовремено и да ја поддржуваме резервната скрипта.

sudo ascript backup

Сега, во Нано:

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

Каде/патеката/до/директориумот е патот до проектот што го создадовте со mkdir. Подоцна ќе научиме како да копираме повторени патеки како ова со јамка и список, што е помалку код, но за сега да го задржиме едноставно и да имаме неколку реда. За да ја извршите оваа скрипта и да го направите резервна копија на вашиот код, зачувајте ја датотеката во нано со контрола+x, y и вратете се и внесете го подолу во вашата обвивка

backup

Ако воопшто ве прашаа за лозинка додека ја читате оваа книга и следете ја школка, внесете ја вашата лозинка за корисникот правилно, ќе имате три обиди пред да треба повторно да ја извршите командата. Можете да ги користите стрелките нагоре и надолу за да ги направите командите и да ги уредувате, доколку треба да извршите нешто двапати. Едноставно притиснете нагоре и надолу наизменично за да изберете команда, пред да ја уредувате командата со десно, лево стрели и избришете го копчето, како и тастатурата, и да ја стартувате со враќање.

Честитки! Успеавте да создадете прекрасна резервна скрипта што поддржува две важни скрипти за школка во вашиот работен директориум. Можеби ќе ги придвижиме работите подоцна, бидејќи проектот станува поголем, но ова функционира засега. Ајде да преминеме на резервна копија во облакот, ќе го користиме GitHub за ова (иако има бројни други решенија за резервна копија, сите тие се околу истите.) Git е софтвер за контрола на веродостојноста што ви овозможува да ги направите уредувањата на вашиот софтвер бидејќи ги правите на сервер, додека исто така ви овозможуваат да преземете цели копии на вашиот софтвер зад лозинка или клуч. Инструментално е во зачувувањето на вашиот софтвер, особено затоа што мигрираме во обезбедените примери на Linux кои понекогаш се кршат кога не успее една линија на код, оставајќи ве заклучен додека вашиот код може да не биде поткрепен ако не добиете шанса автоматски да го поддржите, што ќе го покриеме.

Ако веќе не користите виртуелна машина Ubuntu во овој момент, јас препорачувам да користите виртуелна машина Ubuntu во овој момент затоа што тоа ќе ви го олесни животот кога ги инсталирате сите потребни пакети за да изградите работна веб -страница и да ги пренасочувате операциите за длабоко учење на вашиот компјутер. Willе го преместиме кодот на веб -сервер во блиска иднина, но сакаме да се осигураме дека има барем неколку слоеви на безбедност зад нашиот веб -сервер кои се отпорни на фишинг и ќе вработиме голем број пакети на Linux со цел да го сторат тоа. Ако сè уште сакате да користите Mac OS, добредојдени сте да ги пребарувате и инсталирате потребните пакети на Интернет, но можеби нема да има алтернативи за секој пакет што ќе го покрие оваа книга или серија.

Ајде да додадеме неколку команди за да ја извршиме нашата работа со резервната скрипта со извршување на резервната командна командна резервна копија.

# …

Уште еднаш, контролирајте X за да заштедите.

Сега треба да направиме некое време конфигурација за овој проект. Бидејќи наскоро ќе биде проект за 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)

Сега можете да се вратите назад во вашето складиште со ЦД, ќе бидете запознаени со ова. Пробајте ја вашата резервна скрипта сега со резервна копија

Одлично! Сега навистина можеме да добиеме кодирање. Ајде да го инсталираме angoанго сега кога имаме добро разбирање на Баш и ГИТ. Djанго ќе ни дозволи автоматски да го копираме нашиот софтвер, Баш може да го стори тоа, но angoанго треба да има поедноставна побезбедна имплементација (може полесно да се оневозможи и да се конфигурира).

За да инсталираме софтвер во Ubuntu, ќе ја користиме командата Sudo Apt-Get. Прво, да го ажурираме и надградуваме софтверот што веќе го имавме. Ова може да се направи со ажурирање на Sudo Apt-Get и Sudo Apt-Get Autgrade -y. Следно, ајде да инсталираме Пајтон и нашата виртуелна околина, домот на нашиот код, со следнава команда: Sudo apt-get install python-is-python3 python3-venv

Ова е сè што ви треба за да одите со angoанго во однос на инсталациите на софтвер во пример во Убунту. За Windows и Linux ова треба да биде прилично јасно, но за Mac можеби ќе сакате да инсталирате виртуелна машина и Linux на неа користејќи бесплатна или платена виртуелна околина како VirtualBox или Paralells Desktop и да ги рекреирате чекорите погоре со цел да поставите околина на Ubuntu. Убунту е клучен во овој случај затоа што е софтвер што го водат веб -страниците и им овозможува да бидат домаќини на веб -страници со целиот споменато софтвер.

Ајде да копаме во angoанго.

Во нашиот директориум повторно, со ЦД:

python -m venv venv # Создава виртуелна околина каде се чува кодот
source venv/bin/activate # Ја активира виртуелната околина
django-admin startproject mysite . # Каде што е mySite е проектот, започнувам во мојот сегашен директориум.

Djанго само нè започнува, затоа што angoанго е домаќин на веб -серверот и прави сè што ни треба за да добиеме основна локална веб -страница. Сега кога го инсталиравме angoанго, ајде малку да ги уредиме поставките за да работиме како ни треба. Прво, ајде да создадеме нова апликација

python manage.py startapp feed

Noticeе забележите дека првата апликација се нарекува добиточна храна. Апликацијата треба да се нарече што сакате, и ние ќе создадеме нови апликации, но името на секоја апликација мора да биде конзистентно секој пат кога апликацијата се повикува во кодот. За да додадеме нова апликација, ние секогаш ќе ги уредуваме поставките.py во другиот директориум апликацијата креирана, именувана во апликацијата StartProject, понатаму. Користејќи нано,

nano app/settings.py

Во поставките, пронајдете Installed_Apps и одделете го [] во 3 реда. Користејќи четири простори на празната централна линија, додадете „добиточна храна" или името на вашата апликација. Овој дел од поставките.py треба да изгледа:

INSTALLED_APPS = [
    'feed',
]

Пред да заборавиме, да тестираме дека работи angoанго. Користејќи го Command Python Manage.py Runserver 0.0.0.0:8000, можеме да го извршиме серверот и потоа да се движиме во веб -прелистувач на компјутерот што го извршува кодот до http: // localhost: 8000 и да видиме пример на веб -страница (работи!) Да се ​​откаже од серверот со контрола C, исто како и секоја друга команда.

Сега, ајде да копаме да напишеме некој код на Пајтон. Djанго има три главни компоненти, сите во целост ги водат кодот. Компонентите се нарекуваат модел, преглед и урнек, и секоја е на повисоко и пониско ниво, соодветно пред да се достави веб -страницата на корисникот.

Моделот е код што чува информации во базата на податоци за пребарување, сортирање и рендерирање.

Погледот одлучува како моделот се дава, манипулира и модифицира, скоро секој поглед ќе користи модел директно.

Шаблонот е HTML код со некои дополнителни sвона и свирки наречени образец јазик. Шаблонот се дава со погледот каде е исполнет со питон код и контекст, како што се модели и информации (usuall жици и цели броеви) од погледот.

Djанго има и други компоненти, вклучително и, но не ограничувајќи се на:

Поставки, кои ја конфигурираат апликацијата како што разговаравме.

УРЛ -адреси, кои се модели што корисникот ги следи за да добие пристап до специфични делови од веб -апликацијата.

Формите, кои дефинираат како информациите што се испраќаат до серверот се ракуваат и даваат до базата на податоци, како и на корисникот. Овие се основа за обработка на информации од страната на серверот и можат да прифатат секаков вид на информации што компјутерите ги чуваат, особено низите на текст, броевите и вистинските/лажните були (обично поле за избор).

Шаблони, кои се HTML код и образец јазик и го премостуваат јазот помеѓу Python и HTML, што значи дека информациите за Python можат да се сервираат како HTML код на кој секој може да пристапи и може да обезбеди веб -страница со ограничен пристап, додека го прави кодот на Пајтон достапен за веб -страницата и корисни за разновидност на цели на далечински уред што не треба да биде близу до серверот.

Статички датотеки, кои обично се JavaScript и се библиотеки кои серверот им служи и се поврзани со образецот.

Медиумски датотеки, на кои серверот им служи или е надворешно хостиран, или само напишани на серверот пред да бидат обработени и објавени на друг сервер (корпа) за хостинг.

Middleware, кој е парчиња код што се извршуваат во исто време со секој поглед и се сметаат за „вклучени" во погледот.

Контекстични процесори, кои го обработуваат контекстот на секој поглед и се користат за додавање дополнителен контекст.

Тестовите, кои потврдуваат дека корисникот или барањето поминуваат одредени барања пред да се даде прегледот.

Потрошувачите, кои диктираат како се справуваат со мрежни мрежи и реагираат на комуникацијата.

Администратор, кој се користи за регистрација на модели за да можат детално да се манипулираат во рамките на страницата администратор на angoанго, каде што базата на податоци може да се администрира преку графички интерфејс.

Целер, кој ги дефинира асинхроните задачи Делови од кодот на angoанго можат да започнат да работат пред веднаш да продолжат со следната задача или линија на код.

Djанго може да има многу други компоненти, за кои детално ќе разговараме овде. Постојат многу начини да го направите Django пофункционално, додавајќи веб -пречки, кои се брзи, рационализирани комуникациски канали, целер, кои извршуваат асинхрони задачи и мноштво други парчиња софтвер за проширување на django, особено во View Functions, каде што се извршуваат повеќето од кодот. Функциите за прегледување се клучни затоа што тие обично го прогласуваат секое парче код што е специфично за специфична шема на URL или дел од серверот.

Прво, ајде да ги истражиме функциите за прегледување. Функциите за прегледување започнуваат со увозот што означува код што ќе се користи во погледот и се дефинираат со употреба на редовните дефиниции или класи на функција. Наједноставните погледи се дефинирани со дефиницијата на функцијата DEF и вратете httpresponse со основен образец. Да започнеме со дефинирање на основен поглед за враќање на текстот „Здраво свет". Запомнете дека секој пат кога ќе додадете код по изјава како DEF, ако, додека, за, итн, ќе треба да додадете 4 простори за секоја од претходните дефиниции што сакате да ги примените на вашата функција. Soonе навлеземе во она што секое од овие значи наскоро.

Од директориумот на нашата страница, изменете ја датотеката Feed/Views.py користејќи Nano и додадете ги следниве редови до крајот на датотеката.

from django.http import HttpResponse

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

Httpresponse на angoанго реагира со низа на текст, означена со отворање и затворање ". Секој пат кога ќе пренесете информации на функција или класа, како барање или низа, ќе треба да користите заграда (, отворање и затворање).

Ова не е сè што треба да го видиме нашиот став сè уште. Се разбира, не сме му кажале на серверот каде што е точно погледот, сè уште треба да дефинираме патека со која треба да се направи погледот. Да започнеме со дефинирање на основна патека во апликации/urls.py, и подоцна ќе влеземе во групи на патеки.

Во App/urls.py, додадете линија по изјавите за увоз по почетокот увоз на погледот што штотуку го создадовме.

from feed import views as feed_views

Сега, ајде да ја дефинираме шемата за преглед. View patterns have three components, the path component, which tells the server where the view exists within the server (the URL path that the user types into the navigation bar to enter the webpage), the view component where the view is specified, and a friendly name for the view so it's easy to retrieve it's pattern when working with a template, especially so it's name can be changed and updated if necessary to make space for another view or take on a more logical name. Има смисла да се прават работите на овој начин и да бидат флексибилни, затоа што вашата база на кодови ќе биде постојано менување на околината на која и треба флексибилност и импровизација за да биде вредна и лесна за работа. Еве како ќе изгледа вашето гледиште, можете да го додадете ова на urlpatterns = [дел од апликацијата/urls.py. Моделот на преглед е дефиниран со трите компоненти опишани погоре и функција наречена патека. Вашите обрасци на URL се список, затоа проверете дали секогаш ќе ја завршувате секоја ставка во нив со запирка, затоа што ова ја одделува секоја од нив. Секоја ставка исто така треба да оди на нова линија, уште еднаш со четири простори пред неа, исто како и апликацијата во Поставки.py. Ние ќе ја дефинираме првата компонента на погледот со празна функција на стринг, со цел да создадеме преглед што работи на коренот директориум на веб -серверот. Вашите URL -то сега треба да изгледаат вака:

from feed import views as feed_views

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

Ова е основа за создавање веб -страница со angoанго што е целосно статично. За да направиме подинамична веб -страница каде можеме да започнеме со зачувување на информации, како слики, видеа, аудио и многу повеќе, ќе треба да користиме модели, кои ќе ги истражиме следно. Засега, ајде да го провериме нашиот код и да го извршиме серверот. За да го проверите кодот за грешки, извршете:

python manage.py check

Ако има какви било пораки за грешка, треба внимателно да ги разгледате промените што ги направивте во вашата апликација и да видите дали има нешто што треба да се поправи, како необичен или недостаток на простор, дополнителен карактер, неоткриен стринг, какво било пишување, било случајно избришан карактер или што било друго. Читајќи преку пораката за грешка (ако имате), треба да бидете во можност да ја видите патеката до датотеката што сте ја создале или уредувате заедно со број на линија, па погледнете во таа датотека и линија и да видите дали можете да поправите нешто што е таму. Ако сте го решиле проблемот, повторно извршете ја горенаведената команда. Кога вашиот софтвер е подготвен да работи и работи, ќе видите дека излезот „проверка на системот не идентификуваше проблеми". Сега сте подготвени да одите. Извршете го серверот со:

python manage.py runserver 0.0.0.0:8000

Сега отворете веб прелистувач и движете се на http: // localhost: 8000. Треба да го видите текстот вратен во заграда и цитати на функцијата httpresponse според вашиот поглед. Ова е само основен пример, но ако го направивте ова досега, ги разбирате основите за тоа како функционираат Linux, Bash, Python и Django. Ајде да ископаме подлабоко во некои моделирање на базата на податоци и да ја истражиме моќта на класата Пајтон во складирање на информации. Потоа, ќе започнеме да добиваме зафат на HTML и CSS пред да ја направиме нашата страница целосно прикажана, флексибилна и безбедна со употреба на JavaScript и машинско учење.

Часовите се чуваат во моделите.py на вашата апликација. Користејќи нано, изменете ја апликацијата/моделите.py и додадете нова класа. Класа е дефинирана со дефиницијата на часот и се пренесува суперкласа од која ја наследува, во овој случај модели.Модел. Името на часот доаѓа по дефиницијата на часот, а по дефиницијата на класата А: (дебелото црево) се користи, пред да се означат атрибутите и дефинициите на функцијата врзани за класата подолу. На нашата класа му е потребна лична карта што можеме да ја користиме за да ја добиеме и да ја задржиме уникатна, а исто така треба и текстуално поле за да складира некои информации. Подоцна можеме да додадеме временска ознака, датотеки, булеанци (вистински или лажни дефиниции што можат да му помогнат на нашиот код да донесе одлуки за тоа што да правиме со моделот и може да се искористи за да се сортира), пример за врзување на моделот со корисник најавен во серверот и многу повеќе. Ајде да го отпакуваме кодот подолу:

from django.db import models # Увозот што се користи за дефинирање на нашата класа и тоа е атрибути
class Post(models.Model): # Дефиницијата за самата нашата класа
    id = models.AutoField(primary_key=True) # ID на нашиот модел, автоматски генериран клуч што ќе ни овозможи да го пребаруваме моделот, да го одржуваме уникатно и е корисно кога треба да комуницираме со моделот откако ќе се создаде.
    text = models.TextField(default='') # Атрибутот на нашите продавници во класа, во овој случај, некој текст, стандардно на празна низа.

Затворете ја и зачувајте ја датотеката како што направивме пред да завршиме.

Постојат многу други полиња и опции што ќе ги истражиме кога ќе ја ажурираме оваа класа како што се развива нашата апликација, но ова се основните потреби за создавање апликација за објавување на некој текст. Сепак, овој модел нема да работи сам. Како што е опишано претходно, ќе ни треба сопствен преглед и прилагодена образец на URL за да го направиме овој модел да работи, а исто така ќе ни треба форма заедно со урнек. Ајде прво да ја истражиме формата.

За да дефинирате формулар, изменете ја апликацијата/формата.py со нано и додадете ги следниве редови. Needе ни требаат два увоз, нашата класа на форми, како и моделот што го создадовме (Feed.Models.Post), класа дефиниција слична на моделот и поле заедно со подкласата наречена Meta што ќе го дефинира моделот со кој се работи со формата. Образецот исто така може да има функција за иницијализација што ја поставува врз основа на информации во барањето, моделот или на друг начин, ќе го истражиме ова подоцна.

Формите на моделот се толку корисни затоа што можат да создадат модел или исто така да уредуваат модел, така што ќе ги користиме и за обајцата. Ајде да дефинираме еден во форма.py подолу.

from django import forms
from feed.models import Post

class PostForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Post
        fields = ('text',)

Ова се основите на тоа како изгледаат форма и модел. Оваа форма на модел може да се користи за инстант или уредување на објава, промена на текстот што го содржи. Lookе погледнеме во интегрирањето на оваа форма во поглед следно. Прво, да ги направиме миграциите и да ја мигрираме базата на податоци за да може нашиот код да комуницира со моделот кога работи. За да го направите ова, извршете ги следниве команди:

python manage.py makemigrations
python manage.py migrate

Ова ќе потрае една минута за извршување, но штом ќе го стори тоа, ќе ви овозможи да пристапите до моделот во прегледите, Middleware или на кое било друго место во софтверот. Да продолжиме со преглед каде можеме да го видиме нашиот модел. Уредете ги добиточна храна/прегледи.py и додадете го следниот код, како што е наведено. Нема да треба да додадете ништо по знакот #, тој код е коментари што се користат за означување на информации за кодот. Startе започнеме со увоз на нашиот модел во погледот и ќе го додадеме во контекст каде што можеме да го направиме во урнек како список за приказ. Следно, ќе додадеме образец каде можеме да ја направиме формата и моделот со копче за да создадеме нов предмет заснован на моделот и да го објавиме на серверот. Ова звучи комплицирано, па ајде само да го направиме чекор по чекор. Пред да го завршиме погледот, ајде да создадеме образец што само го прави моделот и да се осигураме дека можеме да го видиме со создавање на нов пост во школка. Еве како треба да изгледа тој поглед:

    posts = Post.objects.all() # Пребарувајте ги сите објави во базата на податоци досега

Сето ова изгледа прилично едноставно додека не стигнеме до дното. Рендер, вредноста вратена од функцијата наместо во одговор на HTTP како претходниот пример, секогаш зема барање како прв влез, прифаќа контекст (во овој случај објавите во базата на податоци), кои сега можат да се дадат во образецот и го враќаат образецот дефинирана во функцијата. Шаблонот ќе биде документ HTML со малку јазик наречен Jinja2, кој ги прави информациите за Пајтон во HTML.

За да започнете да создавате шаблони, направете две директориуми во добиточна храна.

mkdir feed/templates
mkdir feed/templates/feed

Следно, изменете образец во горенаведениот директориум, нахрани/шаблони/извори и додадете го кодот за овој пример. Ајде да го разгледаме образецот за овој пример.

Ова е многу едноставен образец. Дефинира отворање и затворање на HTML ознаки, ознака од типот на документ, ознака за тело со наслов на легендата, ознака за пауза што додава мала линија низ екранот и за јамка што ја прави секоја објава во списокот на натписи како параграф во образецот. Ова е сè што е потребно за да се дадат натписи, но сè уште нема во базата на податоци. Ајде да создадеме некои со школка. Можеме да ја водиме школка со управување.py

python manage.py shell

Сега, ајде да го увезуваме нашиот пост модел

from feed.models import Post

Следно, ќе создадеме едноставен пост со низа и ќе излеземе од школка. Низата може да биде сè, сè додека е валиден текст.

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

На крај, ќе треба да додадеме образец на URL во нашата храна. Бидејќи нашата апликација за добиточна храна ќе користи повеќе URL -адреси и ние сакаме да ги задржиме големините на датотеките мали, ајде да создадеме локални URL -то.

from django.urls import path
from . import views

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

Исто така, ќе треба да ги уредиме URL -то. Уредете ја апликацијата/апликацијата.py и додадете го следново на обрасците на URL -то

from django.urls import include # на врвот
    # ... Претходен код овде

Сега, кога ќе го извршиме серверот со Python Manage.py Runserver, ќе ја видиме страницата што ја создадовме затоа што го имаме моделот, прегледот и образецот, како и моделот на URL, заедно со предметите во базата на податоци. Следно, да ја спроведеме формата што ја создадовме и да започнеме да создаваме свои натписи. Но, пред да напишеме премногу код, ајде да направиме резервна копија со помош на сценариото што го напишавме порано, резервна копија. Извршете ја оваа скрипта во школка, почекајте неколку моменти и целиот код ќе биде поткрепен со нашето складиште за git.

backup

Спроведувањето на формата е релативно едноставно. Willе го увеземе нашиот формулар, ќе додадеме управувач со барање за пост на погледот и ќе го зачуваме објавувањето во базата на податоци пред да се пренасочиме кон истиот поглед. Можеме да ја користиме функцијата Rvenirect што веќе ја увезувавме, а друга функција наречена Обратна за да ја добиеме URL -то за моделот на преглед. Ова ќе го побараме со жицата „добиточна храна" затоа што именскиот простор на вклучената шема е добиточна храна, а погледот се нарекува и добиточна храна.

    posts = Post.objects.all() # Пребарувајте ги сите објави во базата на податоци досега
    if request.method == 'POST': # Се справи со барањето за пост
        form = PostForm(request.POST) # Создадете пример на формуларот и зачувајте ги податоците на неа
        if form.is_valid(): # Потврдете ја формата
            form.save() # Зачувајте го новиот предмет
        return redirect(reverse('feed:feed')) # Пренасочете кон истата URL со барање за добивање
        'form': PostForm(), # Осигурете се да ја пренесете формата во контекст за да можеме да ја направиме.

Сега, ќе треба да го ажурираме образецот за да дадеме сметка за новата форма. Можеме да го сториме тоа со користење на

Означете во HTML и да ја рендерирате формата во образецот HTML со копче за поднесување. Исто така, ќе ни треба CSRF знак, знак кој спречува надворешни места да објавуваат до формуларот без претходно да вчитате страница.

Ајде да го срушиме ова. Постои нова класа на форма, знак, самата форма и копче за поднесување. Прилично едноставно, но кога ќе го разгледаме, можеби ќе сакаме да направиме да изгледа подобро. Работи, можеме да објавуваме нови натписи со формата и тие сега се зачувани во базата на податоци. Тука се случуваат неколку работи. Ние користиме HTML ознаки за да прогласиме дека документот е документ HTML, ние користиме ознака за образец ({ %… %}) за да го направиме токенот за формата, а друг, {{…}} да го направиме формуларот. Исто така, имаме јамка за да го направиме текстот користејќи блок -ознаки и ознака за урнек. Блок -ознаките се навистина важни затоа што можеме да дефинираме како се даваат делови од образецот со нив, а ознаките за шаблони се основа за тоа како ги ставаме променливите во нашиот код.

Сега треба да ја направиме нашата апликација да изгледа подобро, затоа што за сега изгледа навистина основно. Можеме да го сториме тоа со користење на CSS, или вметната, или во класи врзани за секој предмет во документот. CSS е навистина убав затоа што кажува сè на страницата како треба да изгледа и може да направи да изгледа навистина добро. Постојат неколку библиотеки што можат да го сторат тоа, но моето лично одење е подигање.

Bootstrap може да се преземе од нивната веб -страница,getbootsstrap.com/. Откако таму, притиснете го копчето за да ги прочитате документите за инсталација и копирајте го кодот од делот вклучете го преку CDN. Thisе ви треба овој код на горниот дел од вашиот HTML документ, во ознака наречена Head. Исто така, да одиме напред и да создадеме основен образец, така што не треба да ги рекреираме овие врски во секој урнек.

Направете нов директориум наречен шаблони со шаблони за mkdir, а потоа изменете ги шаблоните/base.html.

Треба да изгледа вака:

Осигурете се да ги копирате датотеките CSS и JavaScript, датотеките .CSS и .JS, затоа што ќе ни треба JavaScript за да ја направиме нашата страница пофункционална во иднина.

Сега, да се вратиме во школка за баш и да извршиме брза команда. Запомнете, ако некогаш треба да пристапите до виртуелното опкружување, напишете извор VENV/BIN/ACTIVE. Ова ќе ви овозможи да инсталирате пакети Python локално на начин што ќе му овозможи на angoанго да им пристапи. За да ги дадеме нашите форми генерирани од часовите за подигање на angoанго, ќе користиме пакет за питон наречен крцкави форми. Можеме да го преземеме ова со следната команда

pip install django-crispy-forms

Откако ќе се инсталира ова, додадете го во поставките.py

    # … Претходен код овде

Сега, назад во нашиот образец за добиточна храна, можеме да отстраниме некои работи. Ајде да ги отстраниме почетокот и крајот на документот и да го замениме со наследство од нашиот основен образец, користејќи ги проширувањата и дефиницијата за блок. Исто така, ќе додадеме увоз на филтер за шаблони со оптоварување и филтер за образец во формата. На крај, ајде да додадеме класа за подигање на копчето на формуларот за да изгледа повеќе како копче. Тоа треба да изгледа вака:

Убава! Веќе е доста код. Следно, треба да го испробаме и да се осигураме дека можеме да видиме дека сè изгледа убаво, а исто така да бидеме сигурни дека сè работи правилно. Извршете го серверот според претходните упатства и проверете дали страницата изгледа и работи добро. Одлична работа! Подготвени сте да преминете на следниот чекор, во кој ќе додадеме функционалност за најавување на корисникот користејќи слични URL -адреси, форми, прегледи и шаблони. Основниот образец е важен, и ние ќе продолжиме да го менуваме и да направиме промени по потреба, но за сега да се фокусираме на тоа да ја направиме нашата веб -страница посигурна, со тоа што ќе им овозможиме на корисниците да се најават со корисничко име и код за пас, и на крајот уште поважни информации што ќе ви помогнат да ја задржите вашата апликација безбедна и вашата сопствена сметка достапна само од вас.

За да го направите ова, ќе треба да го користиме корисничкиот модел вграден во angoанго. Моделот на корисникот е модел на база на податоци, како нашиот пост, кој може да се даде за да се најавите корисник на веб -страницата. Во иднина, пред да ја распоредиме страницата на Интернет, ќе го прошириме овој модел со други модели што му се припишуваат и ќе изградиме дополнителни безбедносни мерки за најавување кои се отпорни на фишинг. Beginе започнеме со користење на некои вградени формулари за најава што ги обезбедува angoанго. Прво, да создадеме нова апликација што ќе ја користиме за да ги направиме шаблоните и прегледите за основната страница за најавување. Ние, исто така, ќе создадеме и други апликации за да ги претставуваме континуираните предизвици за најавување со цел да ја обезбедиме апликацијата, вклучително и PINCODE, препознавање на лицето, во близина на комуникација на терен, надворешни уреди, автентикација на повеќе фактори и препознавање на отпечатоци.

Веќе разговаравме за започнување апликација. Од нашиот директориум, во рамките на виртуелната околина, поминете управувајте. Поставете ги овие аргументи

python manage.py startapp users

Сега, треба да имаме директориум за новата апликација. Да започнеме со создавање преглед во тој директориум што одговара на најавувањето на корисникот. Djанго има изградено во поглед на најавување на корисници, но овие нема да бидат погодни за нас затоа што ни треба сопствен преглед, што по можност се прави со дефиниција.

Според ова гледиште, ќе започнеме со проверка на барање за објавување, барање за барање.

Во корисниците/Views.py, додадете го следниот код

        username = request.POST['username'] # Добијте го корисничкото име и лозинката од барањето за објавување
        password = request.POST['password'] # Автентицирајте го корисникот

Ова е сè што ви треба за основен преглед на најава. Сега, ајде да создадеме форма за погледот со проширување на основниот образец. Startе започнеме со создавање на нов директориум за шаблони во папката за корисници.

mkdir users/templates
mkdir users/templates/users

Сега, треба да бидеме во можност да ги уредуваме корисниците/шаблоните/корисниците/login.html. Додека сме на тоа, ќе создадеме образец за да му овозможиме на корисникот да се регистрира.

nano users/templates/users/login.html

Сега, во образецот,

Ова се основите на образецот за најавување. Навистина е исто како и другиот образец во структурата, но изгледа малку поразлично кога е изречена. Можеме да го копираме овој код за да изградиме уште еден многу сличен образец наречен Register.html, каде ќе го промениме текстот и ќе користиме нова форма што ја градиме. Ајде прво да го направиме образецот. Уредете ги корисниците/шаблоните/корисниците/Регистрирај се.html и додадете го следниот код:

Сега, ајде да изградиме формулар за нашата регистрација на корисници и да се вратиме на прегледите пред да ги надополниме најавите на нашите корисници со модел. Thisе го направиме овој формулар основен за почеток, но да вклучиме повеќе детали и безбедносни карактеристики, како што се договори и 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']

Значи, имаме друга форма овде, која работи прилично едноставно. Тоа е формулар за регистар на корисници со корисничко име, е -пошта и лозинка, како и поле за потврда за лозинка. Забележете дека оваа форма не ги проширува редовните форми. Едно поле е дефинирано исто, а класата мета го дефинира моделот, формуларот одговара на остатокот од информациите што ќе бидат напишани на формуларот. Повеќето од ова веќе постојат во вградениот angoанго во корисникот на реакција, така што ќе го искористиме тоа како основа за часот (донесено во заграда).

Следно, ќе го испитаме прегледот за да регистрираме корисник, сега кога имаме образец и образец. Ова е Modelform, исто како онаа во новиот пост. Уредете ги корисниците/прегледите.py и додадете го следниов код:

# … Увоз

Ова е сè што треба да го регистрираме корисникот, но треба да имаме повеќе информации. Ние сакаме да го знаеме времето кога корисникот го регистрираше, во кое време последен пат беа на страницата, некои информации за нив, како биографија, временска зона, итн. Исто така, ќе треба да го ажурираме нашиот модел за добиточна храна, да објавуваме, да одговараме на моделот на корисникот и да ги припишуваме објавувањата на секој корисник. За да го сториме тоа, ќе ги ажурираме моделите.py во двете апликации. Да започнеме со уредување на моделот на добиточна храна. Сега треба да изгледа вака:

from django.db import models # … Увоз
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Додадете во оваа линија

Обрнете внимание на втората линија што е додадена во датотеката. Ова е странски клуч, кој ќе го припише секој пост на еден корисник по објава, за да можеме да се осигураме дека ги зачувуваме објавите врз основа на корисникот по корисник и не може да се направи ниту еден пост без да се припише на корисник. Ние го дефинираме овој странски клуч со класата што ја претставува, аргумент за бришење за да се обезбеди бришење на натписите со корисници, нула и празни аргументи за да се осигураме дека можеме да го отстраниме корисникот доколку е потребно, и да се сместиме за недостаток на корисник на објавувања што веќе ги создадовме и поврзано име, што можеме да го користиме за да се однесуваме на пост -објектите што ги создава корисникот. Ова поврзано име, за разлика од објавата. Автор, авторот на објавата, ни дава корисник кој го објави самиот пост. Сега можеме да ги добиеме објавите корисник направен со извршување на корисникот.

Сега, ајде да ги направиме нашите најавувања поотпорни. Веќе можеме да ја направиме нашата страница многу помалку ранлива на фишинг со едноставно ограничување на бројот на пати што ќе дозволиме најавување на страницата, ова е прилично лесно. Да започнеме да чуваме некои информации за секој корисник пред тоа, бидејќи ние продолжуваме да ја развиваме нашата апликација. Уредување на корисници/модели.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='')

Забележете дека овој модел е прилично сличен на моделот Пост. Имаме дополнителен увоз, временска зона, што ќе ни овозможи да поставиме стандардно на полињата за дата, а исто така имаме и знак на знаци и текстуално поле како „Пост". Користењето на сите овие временски ознаки ни помага да ја обезбедиме страницата и да ја разбереме неговата употреба, а полињата со текст ни дозволуваат да даваме информации за секој корисник, или автор на веб -страницата. OneToonEfield треба да биде единствено мало размислување, се однесува точно исто како и претходницата, но со само еден по последователен модел. На овој начин, корисникот има само еден профил, додека тие може да имаат многу објави.

Сега, ајде да ги подобриме нашите прегледи и да ги регистрираме погледите за да го дадеме профилот. Прво, изменете ги корисниците/прегледите.py и фокусирајте се на прегледот на регистарот:

# … Увоз
            Profile.objects.create(user=user) # Осигурете се да ја додадете оваа линија, за да креирате профил за корисникот

Ова едноставно создава профил за корисникот, без да се пополни ниту една од информациите. Сега, сакаме да се осигураме дека корисничката сметка не може да се најавува премногу често, или барем лозинките не можат да се испробаат премногу често, па ајде да го ажурираме прегледот на најава.

# … Увоз
        if user and user.profile.can_login < timezone.now(): # Забележете дека сега проверуваме дали корисникот може да се најави
        else: # Ако најавата не беше успешно,
            user = User.objects.filter(username=username).first() # Ова е делот каде што го ажурираме профилот на корисниците
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Значи, тие не можат повторно да се најават неколку секунди

Ова е основната фундаментална безбедност. Осигурете се дека страницата не е ранлива на некој што едноставно ја обидува секоја можна комбинација на лозинка, па дури и неколку од нив во исто време. Ова нема да биде фрустрирачки за обичниот корисник кој го знае својот код и само се најавува на неколку уреди, но ќе задржи бројни роботи за фишинг надвор од апликацијата. Забележете дека додадовме изјава IF со променлива, CAN_LOGIN, што треба да биде време во минатото и да ја ажурираме со секое неуспешно најавување користејќи го истото корисничко име. На овој начин, злонамерниот корисник нема да може да погоди лозинка каде било близу. Бројот на секунди во DateTime.Timedelta () може да се ажурира исто така, а веб -страницата ќе биде поотпорна, но сепак малку помалку употреблива со повеќе секунди. Препорачувам 15 за да започнете со.

Запомнете, ние изградивме резервна скрипта за да ја спасиме нашата работа, па ајде да одиме напред и да го вратиме она што го имаме досега за да се осигураме дека имаме заштедено сè. Извршете ја командата:

sudo backup

Уште еднаш, ова ќе ја зачува вашата работа досега. Препорачувам да извршите чести резервни копии за да ја зачувате вашата работа, па дури и можеби ќе сакате автоматски да извршите резервна работа. Можете да го направите ова со помош на алатка Unix наречена Cron. За да ја активирате оваа алатка, извршете ја следната команда и внесете ја вашата лозинка:

sudo crontab -e

Ако веќе не сте ја одбрале опцијата 1 за Нано, уредникот за текст со кој веќе треба да бидете запознаени и движете се на дното на датотеката користејќи ги копчињата со стрела. Додадете ја следната линија:

0 * * * * sudo backup

Крон го користи форматот минута, час, ден на месец, месец, ден во недела, каде што * или број претставува кога да ја изврши командата. Користејќи 0 за минута и * за остатокот од опциите, можеме да извршиме команда во првата минута од секој час на почетокот на минута. Ова ни овозможува автоматски да го вратиме кодот. Сите работни места на Крон кога се извршени со судо трчање како root, така што нема да треба да внесуваме лозинка секој час.

За полесно да се направи резервна копија на нашиот код без да се користи лозинка, ајде да ја оневозможиме лозинката за нашата команда за резервна копија. Willе го сториме тоа со извршување на следнава команда и внесување лозинка:

sudo visudo

Сега, ајде да се движиме до дното на датотеката и да додадеме друга линија:

ALL ALL=NOPASSWD: /bin/backup

Ова ни овозможува да ја извршиме командата „резервна копија" како и секој корисник, без лозинка. Форматот за ова е лесен, само префиксот на линијата со "сите = nopasswd:/bin/" и завршете со командата, на пример/канта/резервна копија, која постои во/usr/bin/.

Сега, да почнеме да работиме со е -пошта. Е -поштата е навистина важна за веб -страниците, затоа што е начин да се задржи веб -страницата посигурна, да се потврдат дека корисниците се вистински луѓе, па дури и производи на пазарот или услуги на клиентите. Многу луѓе кои секојдневно ја проверуваат својата е -пошта и добиваат секаков вид маркетинг -е -пошта за производи и услуги за кои се заинтересирани. Постојат неколку опции кога станува збор за овозможување е -пошта на веб -страница на angoанго, и вие сте добредојдени да одберете кој и да е најдобро за вас.

Прво, можете да платите за е -пошта услуга што ќе ви овозможи да испраќате е -пошта од вашиот домен и бара минимален код. Постојат многу услуги што го нудат ова, како што се 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) треба да се постави на лозинката што ја генерирате за серверот. Ја вчитувам лозинката од конфигурациската датотека за да ја чувам надвор од кодот користејќи ја следната логика, над овие редови во поставките.py:

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

Потоа, поставив датотека JSON со конфигурацијата во /etc/config.json користејќи го Нано на следниов начин.

Да ја уредувате датотеката:

sudo nano /etc/config.json

Додадете ги следниве редови:

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

Continueе продолжиме да ја уредуваме датотеката за конфигурација и да ги додадеме сите лозинки и клучеви што ќе ги користиме во апликацијата. Засега, ајде брзо да испитаме како да испратиме е -пошта со помош на Пајтон. Прво, ајде да создадеме образец за е -пошта за верификација што можеме да им ја испратиме на нашите корисници и да го ставиме во директориумот за шаблони за корисници. Овој образец ќе биде напишан во HTML.

nano users/templates/users/verification_email.html

Оваа е -пошта е прилично едноставна. Потребно е контекст на корисник, основна URL за веб -страницата и кориснички идентификација и токен што се користи за да се провери е -поштата на корисникот. Осигурете се да ја дефинирате основната URL -адреса во поставките.py Пред да напишеме некој код на питон за да го направиме образецот. Одете напред и додадете ги следниве редови во апликацијата/поставките.py, близу почетокот.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

На крајот, кога вашата страница е подготвена за Интернет и ќе ја распоредите, ќе сакате да го дефинирате вашиот домен како име на домен што го купувате за да ја претставува страницата. Ова е името што ќе го напишете во Navbar за да пристапите до вашата страница. Засега, можете да го оставите доменот празен или да користите чувар на место. Исто така, ќе сакате да го промените Site_Name на име што сакате да ја дадете вашата страница, по ваш избор.

Пред да испратиме е -пошта, ајде да создадеме генератор на токени за да можеме да имаме знак за активирање на сметката што никогаш не истекува. Можеме да го сториме тоа со градење и увоз на токен за активирање на сметка што изгледа како следново. Уредете ја датотеката:

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 -то и корисникот може да го користи за да ја провери нивната е -пошта и да ја активира нивната сметка.

Следно, да видиме како да испратиме е -пошта. Користејќи нано, уредувајте корисници/е -пошта.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)

Ова е прилично едноставно. Ние ги увезуваме функциите што треба да ја испратиме е -поштата, да ја направиме е -поштата со шаблони и нашите поставки, а потоа ја дефинираме е -поштата според името на образецот и ја испраќаме до корисникот користејќи функција. Notе забележите дека не сме ја дефинирале функцијата за да ја испратиме поштата, send_html_email, сепак, па ајде да го напишеме ова под кодот што веќе го додадовме на корисниците/е -пошта.py

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

Ова е малку покомплексно и ние сè уште не сме подготвени да го извршиме целиот овој код. Забележете дека дефинираме Unsub_link, врската што корисникот може да ја користи за да се откаже од нашите е -пошта. Ова е важно, затоа што корисниците ќе треба да можат да се откажат од нашите е -пошта, освен ако не сакаат да ги видат, во кое било време. Ние, исто така, додаваме алтернатива за текст на нашата порака, што е HTML пораката одземена од ознаки HTML. И на крај, проверуваме дали е -поштата испратена, и ако не го стори тоа, го означуваме профилот на корисникот дека нивната е -пошта не е валидна.

Ајде да се вратиме на моделите на корисници за да можеме да го направиме сето тоа. Треба да дефинираме функција за да генерираме врска до откажување и да дефинираме поле за буле за да означиме дека е -поштата на корисникот не е валидна.

Прво, додадете го следниот увоз на врвот на корисниците/моделите.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 # Осигурете се да ја увезете функцијата за испраќање на е -пошта за верификација

Можеби веќе имате некои од овие увоз, но не боли да ги повторите. Needе треба да ја увезете функцијата за испраќање на е -пошта за верификација, како и сметка_активирање_token од корисниците.tokens, меѓу другите увоз.

Сега, на дното на датотеката, додадете го следниот код:

        # Отпишете ги
    # Во спротивно пренасочете ја страницата за најавување
# SendwelcomeEmail (барање, корисник)

Ова е многу код. Ајде да го срушиме. Првата функција, чиста и едноставна, го отпишува корисникот од списокот за испраќање. Втората функција ја активира нивната е -пошта и ќе забележите дека додадов коментирана функција, SendWelcomeEmail. Вие сте добредојдени да користите образец за е -пошта и дефиниција за функција за да испратите е -пошта за добредојде, јас сè уште не сум. Последната функција што ја фрлив е важна, бидејќи е -поштата за активирање истекува. Затоа, ќе треба да ја преиспитаме е -поштата за активирање некое време. Можеме да користиме основна форма за ова и да ја повикаме функцијата за да ја испратиме е -поштата за верификација. Пред да го сториме ова, да се погрижиме да се испрати на прво место, со додавање на повик за функција на прегледот на регистарот. Додадете ја оваа линија непосредно пред пренасочувањето во регистарот, DEF Register, во корисниците/Views.py.

nano users/views.py
# … (По) DEF Register (барање):
# … (Пред) пренасочување (

Не треба да ги додавате првите и последните редови во тој код, само проверете дали прегледот на регистарот ја испраќа е -поштата за верификација до корисникот. Треба да изгледа вака:

# … Увоз
            send_verification_email(user) # Бидете сигурни дека додадете ја оваа линија!

Сега, ќе треба да додадеме формулар за да ја преиспитаме е -поштата за активирање. Во корисниците/формуларите.py, додадете ја следната форма:

# … (Увоз)

Исто така, ќе ни треба урнек што одговара на овој формулар за активирање на е -пошта за ресед. Ајде да го додадеме овој образец. Уреди ја датотеката:

nano users/templates/users/resend_activation.html

Следно, додадете го следниот код во датотеката.

Whew, тоа е многу! Сега, кога ќе го распоредиме кодот на нашиот сервер, ќе можеме да испратиме HTML -е -пошта и да ги активираме корисничките сметки со кликнување во е -поштата. Можеби и ние ќе сакаме да испратиме едноставна е -пошта за добредојде, па ајде да видиме како да го сториме тоа. Назад во корисниците/е -пошта.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 UNCUBSCRIBE. Овие се важни, но не сакаме да ги дефинираме двапати.

Па, што е следно? Дојдовме долг пат. Навистина, треба да бидеме подготвени да ја распоредиме страницата на сервер. Можеме да го додадеме декораторот @login_required и да ги направиме нашите погледи безбедни, да земеме пријавени кориснички, да испраќаме усогласени е -пошта и информациите за кешот, што е основа на она што треба да направи веб -страница за да остане релевантно. Addе додадеме неколку повеќе корисни карактеристики, а потоа ќе изградиме основа за распоредување на нашиот код на далечински сервер, поставување сервер за пошта, конфигурација на домен и филтри за да ја направиме нашата страница безбедна и соодветна.

Исто така, ќе ни треба преглед на ресетирање на лозинка, па ајде да го додадеме тоа навистина брзо. Вградениот преглед на ресетирање на лозинката на angoанго е скршен во некои функции, но ќе разгледаме како да напишеме свој сопствен преглед, образец за е -пошта, формулари и обрасци на URL. Еве како изгледа погледот, кај корисниците/Views.py

# ... увоз

Оваа форма е вградена во angoанго, но ќе ни треба образец за да го потврдиме ресетирање на лозинката, корисници/шаблони/корисници/лозинка_Reset_confirm.html

Исто така, имаме урнек за испраќање на е -пошта за ресетирање на лозинка, со едноставна форма, во корисници/шаблони/корисници/лозинка_reset.html

Шаблонот за самата е -пошта е едноставен, таа е основна HTML -датотека која дава врска за да ја ресетирате лозинката, во корисниците/шаблоните/корисниците/лозинката_Reset_email.html. Djанго автоматски ќе ја толкува оваа датотека.

Исто така, ќе ни требаат уште два шаблони. Првата е да се потврди дека е -поштата е испратена. Прегледите за овие се веќе во angoанго, затоа треба само да ги адресираме на URL -то.py. Овој образец се наоѓа на корисници/шаблони/корисници/лозинка_Reset_done.html

И на крај, за да потврдите дека ресетирањето на лозинката е завршено, корисниците/шаблоните/корисниците/лозинката_Reset_complete.html

Сега, потребни ни се обрасци за URL за овие погледи. Во корисниците/urls.py, додадете ги следниве обрасци на URL:

    # ... Претходни УРЛ -адреси тука

Четири шаблони, тоа е многу! Но, сега можеме да бидеме сигурни дека ќе можеме да ја ресетираме лозинката на корисникот во секое време што треба, сите од веб -прелистувачот.

Јас разбирам дека ова е многу код. Ако се чини малку над главата, тоа е во ред. Willе се подобрите, вашето разбирање ќе се подобри и ќе станете многу покомпетентни со кодот многу скоро. Ако сте целосно изгубени, препорачувам да се вратите на овој софтвер подоцна, откако ќе работите на само-чекор, научете да кодирате преку Интернет. Овие обично се бесплатни за започнување и ќе ве водат низ сè што ви треба за да бидете успешни кога ќе се вратите на овој проект. Ако се чувствувате како да сте подготвени да продолжите, да прочитате, следно, ние ќе го покриеме распоредувањето на вашиот код на далечински сервер и ќе поставиме сервер за пошта, како и автоматизирање на вашето распоредување користејќи баш за да можете секогаш да поставите нов проект со неколку едноставни команди.

Последното нешто што треба да го направиме пред да се распоредиме на оддалечен сервер е да ја направиме нашата страница малку посигурна. Noticeе забележите дека прегледот на најава зема само корисничко име и лозинка и нема автентикација на повеќе фактори или код за еднократно. Ова е лесна поправка, и со истиот код, можеме да ја натераме нашата страница да испраќа текстуални пораки, па дури и да одговараме на текстуалните пораки испратени до серверот. За да започнеме, ќе се вратиме во моделите на корисници и ќе додадеме знак за знак на ознаки што ќе го претставува секое најавување. Исто така, ќе додадеме уникатен, ротирачки идентификатор на моделот на корисникот што ќе се користи за додавање дополнителна безбедност во најавата. Уредување на моделите на корисници, корисници/модели.py, додадете го следниот код:

# Бидете сигурни дека ќе го увезете генераторот на UUID, Timestamp и URL -то (обратна)
    # Додадете го овој код овде
    # И додадете ја оваа функција
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Важи за 3 мин

Осигурете се дека вашите корисници/модели.py изгледа вака, покрај коментарите (код на линиите со #). Разбивањето на ова, едноставно е. Имаме неколку увоз, временски знак за загрозување, кој е криптографска алатка која може да генерира безбеден код и да го потврди за да се осигураме дека е валиден, се користи само еднаш, а не постар од одреден број секунди. Ние исто така користиме UUID, што е единствен идентификатор што го идентификува нашиот корисник во потпишувањето на токенот и во URL -то каде токенот е испратен до корисникот. Thisе ја искористиме оваа основна криптографија за да изградиме преглед на автентикација од два фактор. Пред да направиме нешто друго, ајде да ги извршиме миграциите, така што нашите модели на корисници се ажурираат. Во директориумот со 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) # Значи, тие не можат повторно да се најават неколку секунди

Значи, ова е прилично едноставно, сега имаме начин да се пренасочиме кон прегледот за автентикација на два фактор кога ќе го создадеме. Исто така, имаме повратна информација во случај корисникот да не додаде телефонски број. Soonе додадеме основен преглед за наскоро да додадеме телефонски број и наскоро ќе се најавите со текстуална порака.

Прво, ни треба лесен начин да испратиме текстуална порака од нашиот код. За да го направите ова, можеме да избереме од голем број API, но најлесно според мене е Twilio. Тие исто така нудат добра цена за помали проекти, како и за големи попусти. Создадете сметка на Twilio.com, пополнете неколку детали за вашиот проект, купете телефонски број и копирајте ги копчињата API на вашите поставки.py. Потоа, додадете го овој код под нова датотека, корисници/sms.py.

nano users/sms.py
# Увезете ги сите потребни пакети
# Овој код го испраќа текстот со Twilio
# Помошничка функција за да се добие број со толку многу цифри
# Испратете го текстот за да го потврдите корисникот
# Испратете на корисник кој било текст со оваа функција
# Потврдете го кодот со оваа функција
# Потврдете го времето

Бидете сигурни да ги промените вашите поставки соодветно, додавајќи ги овие редови со клучевите:

# Осигурете се да ги копирате овие од вашата табла Twilio
AUTH_VALID_MINUTES = 3 # Бројот на минути TFA страницата е активна еднаш инстантрирана

Прво, ќе ни требаат форми за нашите два погледи за автентикација на факторот. Уредување на корисници/формулари.py, додадете го следниот код.

# … Увоз
# Образец за внесување на нашиот телефонски број
# Образец за автентикација

Следно, ајде да ги создадеме прегледите во корисниците/прегледите.py

# … Увоз

Исто така, ќе ни требаат шаблони за двата погледи. Ајде прво да го додадеме образецот МНР.

nano users/templates/users/mfa.html

Додадете го овој HTML код во образецот

Ова е прилично само објаснување. Образецот испраќа или код или празен код и ќе забележите во прегледот што го испраќаме кодот ако добиеме празен код. Потоа, имаме само две копчиња за поднесување, и на овој начин можеме да го испратиме кодот со кое било копче. Следно, ќе додадеме едноставна форма за да додадеме телефонски број.

nano users/templates/users/mfa_onboarding.html

Додадете го следниов HTML:

Оваа форма е многу поедноставна, таа само го прави формуларот за телефонски број што го создадовме и му дозволува на корисникот да додаде телефонски број.

Ова изгледа навистина добро! Сè додека сè е правилно поставено, треба да можеме да испраќаме пораки и да го најавуваме корисникот со нивниот телефонски број веднаш штом ќе ги додадеме обрасците за URL. Последното нешто што треба да го поставиме е преглед на профилот, така што можеме да се осигураме дека корисникот може да го смени нивниот телефонски број без да биде најавен. Исто така, на крајот ќе сакаме да додадеме опција „стоп за да се откажеме", така што корисникот може да испрати текст „Стоп" за да се откаже од идните текстуални пораки.

Ајде да додадеме преглед на профил на корисниците/Views.py. Овој преглед ќе го ажурира био, е -пошта, е -пошта, корисничко име и телефонски број, како и ќе ни овозможи да овозможиме автентикација на повеќе фактори. Прво, ќе ни требаат уште две форми кај корисниците/формуларите.py

# ... увоз

Следно, можеме да создадеме преглед за да ги користиме и двете од овие форми. Уредете ги корисниците/прегледот.py и додадете го погледот.

# Додадете ги овие увоз

Исто така, ќе ни треба образец за овој поглед.

nano users/templates/users/profile.html

Noticeе забележите дека ова е прилично едноставна форма, но има некои JavaScript во него што автоматски ја објавува содржината на формуларот како што се ажурираат. Ова е корисно да се има, така што можете да направите уредувања без да притискате поднесување секој пат.

Следно, потребни ни се URL -адреси што ги претставуваат сите овие погледи во URL -то на URL -то на корисниците. Уредете ги корисниците/urls.py и додадете го овој код:

# … Претходен код, увоз
# … Обрасци на URL што претходно ги внесовме, додадете ги следните три реда

Сега е добро време да го испробаме нашиот проект. Но, прво, ајде да водиме друга резервна копија.

backup

И извршете го серверот. Пред да се распоредиме на серверот Linux, добра е идејата да се овозможи автентикација на два фактор на сметката. Thisе го сториме ова на нашата URL -адреса на профилот,/корисници/профил/и проверка на полето за да овозможиме автентикација по внесувањето на нашиот телефонски број, а потоа да го доставиме формуларот.

python manage.py runserver localhost:8000

Посетете ја веб -страницата со одење на вашиот веб -прелистувач, јас го користам Google Chrome во овој пример и внесувам URL https: // localhost: 8000/сметки/профил/

Вие ќе можете да се најавите доколку е потребно и да овозможите автентикација на два фактор.

На овој проект му треба сервер за да работи, за да може навистина да испрати пошта. Но, прво, ни треба начин да видиме грешки. Noticeе забележите дека ако го стартувате серверот во режим на дебагирање, со Settings.Debug еднаков на True, серверот автоматски покажува грешки. За да покажеме грешки без да користите режим на дебагирање, што е небезбедно на серверот за производство, треба да додадеме преглед за тоа. Најважните грешки со кои треба да се справиме се:

Грешка 500 - Проблем со нашиот код Грешка 404 - Страна што не беше пронајдена (скршена URL) Грешка 403 - дозвола за одбивање на дозвола

Ајде да додадеме нова апликација за да се справи со овие грешки, наречени грешки.

python manage.py startapp errors

Додадете го ова на поставките.

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

Ова е сè што ни треба покрај прегледите на грешки, шаблони и малку Middleware. Ајде да ги дефинираме оние како така:

# Создадете ги вашите ставови овде.

Следно, да го дефинираме Middleware за да се справи со овие грешки. Ова ќе го сториме со тоа што прво ќе додадеме на Middleware_classes во поставки.py, со името на нашиот Middleware.

    # ... Претходен Middleware

Следно, ајде да го додадеме Middleware.

from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

class ExceptionVerboseMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        _error.value = traceback.format_exc()

def get_current_exception():
    try:
        return _error.value
    except AttributeError:
        return None

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')

Ние додаваме функција за да го добиеме тековниот исклучок со употреба на локално навој, што ни помага да ги следиме сите грешки во нашиот код. Во однос на шаблоните, ни треба само еден, затоа што динамично го дефинираме насловот во погледот. Шаблонот само треба да го направи насловот и „Трага", нашата грешка во грешката од контекстот.

nano errors/templates/errors/error.html

Ова е нашиот наједноставен образец досега, но толку е лесно да се видат грешките во нашиот проект. Следно, ајде да го оневозможиме дебагирањето во поставките.

nano app/settings.py

Пронајдете ја оваа линија каде што е поставена на вистинито, и променете ја на лажно

DEBUG = False

Одете напред и резервна копија на апликацијата сега. Подготвени сме да се распоредиме на далечински сервер Linux и да додаваме одлики од таму.

sudo backup

Пред да го објавиме овој код на сервер, треба да размислиме дека може да има некои проблеми со кодот. Во зависност од случајот, страниците што прифаќаат информации објавени на нив ќе имаат проблеми со објавување на спам и тешкотии во отстранувањето на спам. Ова не треба да се случи веднаш, но ако се случи, ние подоцна ќе испитаме како автоматски да умереме спам на страницата и да го направиме построго за роботите да пристапат до страницата, заедно со тоа како да ги деактивираат корисничките сметки и да го потврдат идентитетот на корисникот со скенирање на нивната лична карта или биометриско скенирање, како што е отпечаток од прсти или отпечаток од прсти.

Гледајќи го примерот за автентикација со повеќе фактори, го испитавме, во производството, работите можат да бидат различни. Забележете како ние ги ограничуваме најавите и истекуваме токени. Ако роботите имаат пристап до некоја страница, автентикацијата со два фактор може да биде потешка бидејќи може да внесат кодови во исто време кога корисникот е. За да се бориме против ова, ајде да користиме модел во моделите на корисници, прогласувајќи како комуницираме со страницата кога ја автентицираме користејќи автентикација со повеќе фактори со телефонски број. Исто така, ќе додадеме опција за автентикација со е -пошта. Започнете со уредување на моделите на корисници со нано.

nano users/models.py

Ова е како треба да изгледа моделот што го додаваме. Не ни требаат никакви методи, само променливи за да зачуваме лична карта, корисникот, временската ознака, истекот, должината и обидите против која било автентикација на повеќе фактори (код како 123456 испратен на телефон или е -пошта).

# Основен знак што се користи за најавување на веб -страницата

Ајде да додадеме и привилегија на нашиот корисник и ќе го поставиме рачно засега, пред на крајот да мигрираме за автоматско запишување на привилегираните корисници. Во моделите на корисници, додадете ја оваа линија во профилот:

    vendor = models.BooleanField(default=False)

Како и со сите промени во базата на податоци, треба да направиме миграции и да ја мигрираме базата на податоци во секое време кога уредуваме датотека Models.py во angoанго. Запомнете, за да го направите ова, прво го користиме изворот (ако веќе не се користи веќе, бидејќи терминалот беше отворен) и потоа управувањето со Пајтон.

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

Сега, ајде да го развиваме нашиот прегледи за автентикација со повеќе фактори за да го користиме овој знак. Прво, треба да ги менуваме нашите комунални услуги за помошници во МНР. Користејќи нано,

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_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: # Проверете дали е овозможено МНР
        if not check_verification_time(user, token): # Проверете го времето
            user.profile.mfa_enabled = False # Исчистете го телефонскиот број
            user.profile.enable_two_factor_authentication = True # Овозможете МНР
            user.profile.phone_number = '+1' # Оневозможете го телефонскиот број
            user.profile.save() # Зачувајте го профилот
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Пријавете се на корисникот ако не е овозможено нивниот МНР
    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) # Проверете го авторскиот токен
            is_verified = check_verification_code(user, token, code) # Проверете го кодот
            if token_validated: # Ако сè
                if is_verified: # Е во ред
                    user.profile.mfa_enabled = True # Овозможете МНР (ако не е веќе овозможено)
                    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 # Willе треба да го создадеме овој тест
    # Добијте список на корисници
    return render(request, 'users/users.html', { # Вратете ги корисниците во образец

Забележете дека овој код користи тест, ќе треба да го прогласиме овој тест во датотека Tests.py и да го внесеме. Уредување на корисници/тестови.py, ајде да го создадеме тестот.

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

Ова е во врска со образецот на корисниците/корисниците.html, кој изгледа вакво:

Забележете дека образецот вклучува друг образец, корисници/корисник.html. Кога користите образец што има подтема и не се користи, добра е идејата да додадете подвлечен () пред името на датотеката да се прошири, со цел да се разликуваат шаблони.

Забележете дека ова е многу Jinинџа, можеби нема да ги имате дефинирани сите овие променливи. Но, вака изгледа мојот код.

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

Исто така, ни треба уште еден подтекл, toggle_active.html. Овој образец треба да биде форма што ни овозможува да менуваме дали корисникот е активен.

Исто така, ќе треба да додадеме преглед за да ја вклучиме активноста на корисниците и соодветните обрасци на URL -то. Додека сме на тоа, ајде да додадеме преглед за да избришеме корисник во случај да ни треба тоа.

# Увоз
    success_url = '/' # Пренасочување на URL -то за успех
    def test_func(self): # Тест ако корисникот е супер -сервис и има дозвола за бришење

Иако ова е практично кога е потребно, бришењето на корисникот не треба да биде потребно поголемиот дел од времето, можеме само да ја вклучиме видливоста на корисниците кои ја посетуваат страницата ако треба да ги отфрлиме.

Моделите на URL -то што ги додадовме изгледаат вака. Со нано, изменете ги корисниците/urls.py и додадете ги овие редови:

nano users/urls.py

Линиите треба да одат во списокот на патеки во погледот на корисникот, пред завршувањето "]", но по почетокот "[".

# …
# …

Сега, погрижете се да направите резервна копија на страницата за да можете да ја преземете на веб -серверот на кој ќе продолжиме да работиме. Од командната линија,

sudo backup

Сега нашата страница е поткрепена.

Значи, сега имаме уште неколку корисни карактеристики. Но, што е со големата слика овде? Овој код сè уште не е достапен од Интернет, сè уште немаме сервер за пошта и треба да ја прошириме нашата апликација за да вклучиме сеопфатен процес на верификација, како и непречено распоред за да ни помогне да ја истражиме страницата, заедно со безбедни протоколи за автентикација на привилегираните корисници.

Getе дојдеме до сето ова. Најважната работа за сега само ќе биде овој код на Интернет, што можеме да го направиме со само неколку реда баш на серверот Ubuntu. Но, ќе треба да изнајмите сервер за ова, освен ако немате сервер дома и претплата за деловен Интернет што ви овозможува да отворите порти. Јас лично ја водам мојата веб -страница на HP Z440 што е инсталиран во мојот стан, но обично е многу поевтино за основните потреби за изнајмување виртуелен приватен сервер (VPS).

Имајте на ум дека кодот што го работиме сега е релативно тенок, ќе треба да се одржи и подобри пред да бидеме подготвени да го искористиме она што треба да го изградиме. Осигурете се да бидете внимателни што правите со Интернет, проверете дали ја распоредувате оваа страница јавно на Интернет на серверот Linux, имате план да блокирате несакани интеракции со вашата веб -страница. Ова веројатно нема да биде проблем на почетокот, но ние ќе разгледаме најразлични решенија за борба против ова, вклучително и машинско учење, вештачка интелигенција и компјутерски визија. Кога станува проблем, погледнете понатаму во овој текст за решение.

Во однос на изнајмување VPS, има многу места каде што можете да одите. Google Cloud има VPS сервери, Ionos, Kamatera, Amazon AWS и повеќе даватели на услуги нудат решенија за сервери за облак што ќе одговараат на нашите потреби.

Needе треба да кликнете преку нивните форми и да изберете план за да започнете. Можете да одите со основен план со кој било провајдер, но проверете дали давателот на услуги ви овозможува да отворите порта на порта за пошта за да испраќате е -пошта (ова треба да биде порта 587 и порта 25), некои даватели на услуги ги блокираат овие порти. Досега имав најдобро искуство со Јонос и Каматера, и двајцата ќе ми овозможат да испраќам неограничена е -пошта и нивната цена е прилично ефтина.

Willе се поврзете со вашиот нов сервер преку протокол наречен SSH или Secure Shell, што ви овозможува далечински интерфејс со серверот точно како вашиот персонален компјутер, од вашиот персонален компјутер. Кога ќе го поставите серверот, давателот на хостинг веројатно ќе ве замоли да додадете клуч SSH, или тие ќе ви дадат корисничко име и лозинка. Клучот SSH е како ќе се најавите на серверот од командната линија за да го уредувате кодот. Користете ги подолу опциите SSH-Keygen за да генерирате клуч SSH.

ssh-keygen

Зачувајте ја датотеката и презапишете ја ако треба, добро е да ги ротирате клучевите SSH ако веќе не сте. Сега, можете да ја користите следната команда за да го видите вашиот клуч SSH. Wantе сакате да го копирате на вашиот далечински сервер за да можете да го користите за автентикација.

cat ~/.ssh/id_rsa.pub

Ако не бевте во можност да видите клуч SSH кога ја пишувате таа команда (долга низа цифри и букви што започнуваат со „SSH-RSA AAA"), обидете се да генерирате клуч за RSA (тие се посигурни, затоа советувам да ги користите.) Следниот код ќе генерира 4096 бит 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
# АдресаФамилија било кое
# Слушајте ја 0,0.0.0
# Слушајте :::
# HostKey/etc/ssh/ssh_host_rsa_key
# HOSTKEY/ETC/SSH/SSH_HOST_ECDSA_KEY
# HostKey/etc/ssh/ssh_host_ed25519_key
# Шифри и клучеви
# Rekeylimit не стандардно
# Сеча
# Syslogfacility Auth
# Информации за логирање
# Автентикација:
# Logingracetime 2m
# Дозволи за забрана за забрана
# Строги модели Да
# Maxauthtries 6
# Максимум 10
# Очекувајте .ssh/овластен_Кеис2 да се занемари стандардно во иднина.
# Овластен PrincipalsFile Ништо
# ОвластеноКојкомманд ниту еден
# Овластен KeyScommanduser Никој
# За ова да работи, исто така ќе ви требаат клучеви домаќини во/etc/ssh/ssh_ познати_hosts
# HostBaseAuthentication No.
# Променете во Да, ако не верувате ~/.SSH/Познати_хости за
# HostbaseAuthentication
# Игнорирај ги познатите хост бр
# Не читајте ги датотеките на корисникот ~/.rhosts и ~/.shosts
# Игнорирани да да
# За да ги оневозможите лозинките со чисти текст, променете се на тука!
# PreperTempTyPasswords бр
# Промена во да за да се овозможи лозинки за одговор на предизвик (внимавајте на проблемите
# Некои модули и нишки на Пем)
# Опции на Керберос
# Kerberosauthentication бр
# Kerberosorlocalpasswd да
# Kerberosticketcleanup да
# Kerberosgetafstoken бр
# Опции за GSSAPI
# GSSapiauthentication бр
# GSSapicLeanupcredentions да
# GSSapistrictAcceptorCheck Да
# GsSapikeyexChange бр
# Поставете го ова на „Да" за да се овозможи автентикација на ПАМ, обработка на сметки,
# и обработка на сесија. Доколку е овозможено ова, автентикацијата на ПАМ ќе биде
# да бидат дозволени преку kbdinteractiveauthentication и
# Лозинка за локација.  Во зависност од вашата конфигурација на ПАМ,
# Автентикацијата на Пем преку KbdinteractiveAuthentication може да заобиколи
# Поставување на "Perforrootlogin без Password".
# Ако сакате само проверките на сметката ПАМ и проверките на сесијата
# Автентикација на Пем, а потоа овозможете ја оваа, но поставете ја лозинката за локација
# и kbdinteractiveauthentication на „не".
# Дозвола за да се изврши да
# ДозволиTcpforwarding Да
# Портајпортс бр
# X11displayoffset 10
# X11uselecalhost да
# Permittty да
# Printlastlog да
# Tcpkeepalive да
# PrompuserenVironment No.
# Компресија се одложи
# Клиентал
# ClientaliveCountMax 3
# Користени бр
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Permittunnel бр
# Chrootdirectory Ништо
# ВерзијаДадендум ниту еден
# Нема стандардна патека за банер
# Дозволете му на клиентот да ги помине варијаблите на околината за локација
# Надминете го стандардното без подсистеми
# Пример за надминување на поставките на основа на корисници
# Одговара на корисникот AnoncVs
# X11Forwarding No.
# ДозволиTcpForwarding No.
# Пермити не
# CVS сервер ForceCommand

Запомнете, Ctrl+X и Y за да ја зачувате датотеката. Следно, да напишеме основна скрипта наречена Initialize (сите во стандардниот домашен директориум на нашиот корисник).

nano initialize

Додадете ги овие редови во датотеката, заменувајќиСо вашиот клуч SSH го најдовте со употреба на CAT. (.ssh/id_rsa.pub)

# !/канта/баш

Да ве прошетаме низ оваа датотека, да започнеме со линија по линија. Првата линија му кажува на компајлерот дека ова е скрипта за баш. Потоа, инсталираме зависности, копираме SSHD_CONFIG во точниот директориум, рестартирање на SSH, генерирајќи SSH копчиња за корен, додавајќи го тимот на корисникот (можете да изберете име што ви се допаѓа за ова, користете ја командата Adduser со нивното име и лозинката за оневозможено за сега). Ние, исто така, додаваме тим во групата Судо, генерираме нивниот клуч 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

Сега, да започнеме да го поставуваме серверот. Прво, копирајте го вашиот проект директориум во едноставно, незаборавно име што ќе го користиме за проектот.

cp -r yourproject whatyoucalledit

Каде „Што е", е новото име на вашиот проект. Следно, ќе треба да изградиме основна алатка за да го поставиме серверот. Ние ќе ја зачуваме оваа алатка и ќе ја користиме во иднина. За да ја изградиме оваа алатка, да создадеме бинарен на корисник за да дефинираме како уредуваме скрипта. Користејќи баш, уредување/usr/bin/ascript

sudo nano /usr/bin/ascript

Бидете сигурни дека користете судо таму за да имате дозволи да ја уредувате датотеката. Во датотеката, додадете ги овие редови:

# !/канта/баш
    echo "# !/bin/bash ">>/usr/bin/$ 1

Запомнете дека оваа скрипта се расправа, името на скриптата, како 1 $. Прво, проверува дали датотеката постои, или на друг начин ја создава, ја додава првата линија за да се прогласи за скриптата е баш, ги менува своите дозволи, го уредува и го додава своето име на /etc /апикти што ни овозможува да ги чуваме имињата на скриптите што ги создаваме. Ако датотеката веќе постои, едноставно променете ги дозволите и изменете ја. Зачувајте ја датотеката и следно ќе ги промениме дозволите. Сè додека ја користиме оваа скрипта, нема да мора да го сториме тоа повторно.

sudo chmod a+x /usr/bin/ascript

Совршен. Сега да создадеме скрипта наречена Setup. Прво, да не ве надминувам, туку да погледнете како изгледа мојата скрипта за поставување. Walkе прошетаме како треба да изгледа оваа скрипта во вашиот проект, нема да ви треба сè во моето сценарио за да започнете со тоа.

# !/канта/баш
# sudo chmod a+x скрипти/usersetup
# ./scriptts/usersetup
# SSH-KEYGEN
# Директориум на проекти
# Команди за најавување
# Нано конфигурација
# Git Config
# Ажурирајте и инсталирајте
# Овозможете антивирус Clamav
# Поставете име на домаќинот
# Поставување Postgres
# Резервна копија на базата на податоци за поставување
# Оневозможете ги iptables
# Инсталирајте Bitdefender
# Поставување PostFix
# Создадете DIR
# Поставување виртуеленв
# Добијте и градете зависности
# Поставете правила за заштитен ид
# Инсталирајте зависности од 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
# Инсталирајте сертификат
# Извршете горти
# Повторно вчитајте го серверот за пошта
# Копирај сертификати
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem сертификат.pem
# Печ Венв
# Поставете ги поставките на корисникот
# Поставете дозволи
# Sudo Chown -R тим: Корисници/var/Run/
# Судо 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 зависности, инсталира сертификати и го поставува серверот, инсталира конфигурација, започнува и овозможува и север, распределува размена, поставува дозволи и ги отпечати копчето IP, IPv6 и клучот OpendKim. Прилично едноставно, но изгледа како многу код. Нема да ни треба многу од ова затоа што немаме зависности, не користиме целер, целербеат или Дафне, но ќе инсталираме некои од нив како и да е за да започнеме. Забележете дека овој код има домен деклариран неколку пати.

Исто така, ќе треба да набавиме име на домен (што е мала годишна такса). Препорачувам Squarespace за набавка на домен, нивниот распоред е интуитивен и лесен за употреба. Можете да купите кој било домен по ваш избор, но јас го користам доменот femmebabe.com во овој пример. Откако сте купиле домен, упатете се на панелот за конфигурација на Squarespace DNS и додадете записник што го покажува вашиот домен на серверот со IP адреса. Треба да изгледа вака:

@ A xx.xx.xx.xx

Со операторот @ како домаќин, што значи дека сите поддомени под овој домен и коренот домен сите ќе се пренасочат кон серверот. Има повеќе записи за да се прогласиме, но можеме да преминеме на овие откако ќе бидеме подготвени да испратиме пошта. Имајте на ум, може да трае неколку дена пред да можете успешно да испратите пошта од серверот. Записите за DNS што ги поставуваме ќе одвојат време за пропагирање.

Како и да е, единствениот рекорд што треба да го започнеме е рекорд. Значи, сега можеме да ја пополниме скриптата подолу според нашиот проект и да ја извршиме.

Да започнеме со помала скрипта за поставување за да го инсталираме она што ни треба за основен напредок. Сè уште нема да користиме толку многу зависности или PostgreSQL, ние само ќе започнеме со основен сервер HTTP и ќе се грижиме за тоа да го потврдиме кога ќе заврши. Запомнете, за да добиеме сертификат HTTPS и безбедно да го извршите серверот, ќе треба да купиме домен заедно со изнајмување сервер. Засега, заменете го „Тимот" во оваа датотека со името на вашиот корисник, „DIR" со директориумот на вашиот проект и доставете ја вашата е -пошта и домен во ознаките <>.

Покрај тоа, пред да го извршиме овој код, треба да ги смениме поставките на заштитниот ид што го поддржува давателот на хостинг, доколку ги има. Обично ова е во табулаторот „мрежи" на вашиот давател на хостинг, или ако сте самостојни хостинг, тоа е во делот „Порта за пренасочување" на вашиот рутер. Исто така, ќе сакате да поставите статичка IP преку вашиот рутер со адресата на вашата машина за сервер, доколку користите самостојно хостинг. Willе треба да ги отворите следниве пристаништа за пристап до читање/пишување.

22 (SSH) 25 (пошта) 587 (пошта) 110 (клиент по пошта) 80 (http) 443 (https)

# !/канта/баш
# Команди за најавување
# Нано конфигурација
# Git Config
# Ажурирајте и инсталирајте
# Овозможете антивирус Clamav
# Поставете име на домаќинот
# Резервна копија на базата на податоци за поставување
# Оневозможете ги iptables
# Поставување виртуеленв
# Инсталирајте сертификат
# Извршете горти
# Поставете ги поставките на корисникот
# Поставете дозволи
# Sudo Chown -R тим: Корисници/var/Run/
# Судо chown root: root/run/sudo/ts -r
# Освежете ги и овозможете ги услугите
# Овозможете модули на Apache
# Освежете го Даемон и рестартирајте го Apache, Postfix и OpendKim
# Покажете IPv6 и OpendKim за конфигурација на домен

Пред да го извршите овој код, проверете дали доменот што сте го купиле е поврзан со серверот. За да го направите ова, отворете терминал на вашата локална машина и извршете ја оваа команда со вашиот домен:

ping femmebabe.com # Вметнете го вашиот домен овде, по пинг

Ако сите изгледаат добро и серверот испраќа одговори, ние сме подготвени да ја извршиме скриптата и да инсталираме пакети, како и да започнеме, овозможиме и сертифицираме нашиот сервер Apache.

Ова не е сè што е потребно за конфигурирање на PostFix, ќе го разгледаме тоа поставување повеќе подоцна. Засега, извршете го овој код за поставување и треба да потрае неколку минути за да го инсталирате и овластите вашиот сервер. Уште еднаш, проверете дали името, е -поштата и името на доменот во скриптата според името што сте го купиле.

Сега кога серверот е обезбеден, можете да одите на URL -то во кој било веб прелистувач и да проверите за да бидете сигурни дека серверот работи HTTPS. Ако не е така, обидете се да чекате малку време за записите на DNS да се израмнат и потоа да ја извршите следната команда за да го обидете повторното сертификација на сертификатот:

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>

Осигурете се да го замените името на проектот, директориуми и домен во овој пример код при конфигурирање на вашиот сервер. Сега, ќе треба да ја оневозможиме стандардната страница. Ова може да се направи со употреба на баш.

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

Следно, можеме да ја овозможиме стандардната страница и да го вчитаме Apache2, исто така користејќи баш. Запомнете да го замените Femmebabe со името на датотеката што ја прогласивте при уредување во/etc/etcache2/страници-достапни/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Вратете се на вашиот домен во Navbar. Треба да ја видите страницата што сте ја конфигурирале во вашиот веб прелистувач. Честитки! Ако не го гледате, можеби ќе треба да направите некои промени. Внимателно разгледајте ги поставките во вашиот проект, конфигурацијата на Apache и проверете дали немате грешки и извршете ги следниве команди за да го проверите проектот за грешки.

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

Ако имате грешки во вашиот проект за Пајтон, проследете ги таму каде што се и поправете ги. Можеби нема да можете да ги видите сите ваши грешки во зависност од тоа каде се, па ако имате грешка што едноставно вели дека „населението не е реинтентант", изменете ја следната датотека во виртуелното опкружување, регистарот.py, да ја изложите грешката.

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

Скролувајте до редот 83, каде што се зголемува оваа грешка во траење (подигнете го RuntimeError ("popoul () не е реинтент")), и додадете коментар пред оваа линија, а потоа додавајќи, со иста вовлекување, self.app_configs = {. Ова изгледа вака:

                # Спречете ги повиците за повторна употреба за да избегнете извршување на AppConfig.SERY ()
                # Методи двапати.
# Подигнете го RuntimeError ("Популацијата () не е реинтентант")

Потоа повторно можете да го проверите проектот и да ја изложите грешката.

python manage.py check

Потоа можете да ја видите грешката и да ја поправите. Кога го имате фиксирано и кодот составува без грешки, проверете дали ја смените датотеката назад, така што изгледа вака:

                # Спречете ги повиците за повторна употреба за да избегнете извршување на AppConfig.SERY ()
                # Методи двапати.
# 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). Не грижете се за Domainkey засега, ова е создадено кога ќе поставиме PostFix, серверот за пошта, со OpendKim и отпечатете го клучот. Ние ќе го конфигурираме ова последно.

Ла А N/a 75.147.182.214

Ла MX 10 femmebabe.com

Ла Ptr N/a femmebabe.com

Ла TXT N/a TXT @ V = SPF1 MX IP75.147.182.214IP6: Fe80 :: 725A: FFF: FE49: 3E02 ~ Сите

Стандардно._Бими 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, со името на доменот што го користите. Ајде да ги разгледаме сите конфигурациски датотеки еден по еден, и да ги инсталираме во директориумот наречен Конфиг во нашиот проект, за инсталирање на оперативниот систем.

nano config/etc_postfix_main.cf

Додадете го овој текст во датотеката

# Видете /usr/share/postfix/main.cf.dist за коментар, поцелосна верзија
# Специфично за дебијан: Одредувањето на името на датотеката ќе го предизвика првото
# линија на таа датотека што треба да се користи како име.  Стандардно дебајан
# е /итн /име на пошта.
# myOrigin = /etc /mailName
# додавање. Доменот е работа на МУА.
# Начекајте ја следната линија за генерирање на предупредувања за „одложена пошта"
# одложување_warning_time = 4H
# Погледнете http://www.postfix.org/compatibility_readme.html - стандардно на 3,6 на
# свежи инсталации.
# Параметри на TLS
# Милотерска конфигурација

Следна конфигурација!

nano config/etc_postfix_master.cf

Додадете ги овие редови:

# 
# Датотека за конфигурација на мастер процеси PostFix.  За детали за форматот
# на датотеката, видете ја мануелната страница (5) (команда: „Човек 5 мајстор" или
# On-Line: http://www.postfix.org/master.5.html).
# 
# Не заборавајте да извршите „PostFix Reload" по уредувањето на оваа датотека.
# 
# =========================================================================
# Тип на услуга приватна непревисна chroot будење максимална команда + аргументи
# (да) (да) (не) (никогаш) (100)
# =========================================================================
# SMTP INET N - Y - 1 POSTSCREEN
# SMTPD Pass - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# Tlsproxy unix - - y - 0 tlsproxy
# Изберете еден: Овозможете го поднесокот само за клиенти на Loopback, или за кој било клиент.
# 127.0.0.1: Подмисија Inet N - Y - - SMTPD
# -o syslog_name = postfix/поднесување
# -o smtpd_tls_securance_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 = PERECT_SASL_AUTHENTICATION, отфрлете
# -o milter_macro_daemon_name = потекнува
# Изберете еден: Овозможете SMTPS само за клиенти со loopback, или за кој било клиент.
# 127.0.0.1:SMTPS inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = да
# -o smtpd_sasl_auth_enable = да
# -o smtpd_reject_unlisted_recipient = бр
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o SMTPD_RELAY_RESTRICTIONS = PERECT_SASL_AUTHENTICATION, отфрлете
# -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)
# агент.  Погледнете ја страницата на цевката (8) Човекот за информации за $ {примател}
# и други опции за плик на пораки.
# =================================================================
# 
# Maildrop. Погледнете ја датотеката PostFix maildrop_readme за детали.
# Наведете и во Main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# =================================================================
# 
# Неодамнешните верзии на Кир можат да го користат постојниот мајстор „LMTP". Влез.
# 
# Наведете во Cyrus.conf:
# lmtp cmd = "lmtpd -a" слушај = "локален хост: lmtp" прото = tcp4
# 
# Наведете во Main.cf Едно или повеќе од следниве:
# Mailbox_Transport = LMTP: INET: LocalHost
# Virtual_transport = lmtp: inet: localhost
# 
# =================================================================
# 
# Кир 2.1.5 (Амос Гуакс)
# Наведете и во Main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - цевка
# FLAGS = DRX корисник = Cyrus argv =/Cyrus/Bin/Deliver -R -R $ {испраќач} -M $ {наставка} $ {user}}} корисник}
# 
# =================================================================
# Стариот пример за испорака преку Сајрус.
# 
# Стариот -цирнус unix - n n - - цевка
# Flags = R user = Cyrus argv =/Cyrus/bin/испорака -e -m $ {наставка} $ {корисник}
# 
# =================================================================
# 
# Погледнете ја датотеката PostFix UUCP_ReadMe за детали за конфигурацијата.
# 
# 
# Други методи на надворешна испорака.
# 

И конфигурацијата на OpendKim. OpendKim ги идентификува серверите за е -пошта со копчињата за домен за да ги направи посигурни. Без неа, поштата не е потпишана и можеби не ја прави во сандаче.

nano config/etc_default_opendkim

Додадете ги овие редови:

# Белешка: Ова е датотека за конфигурација на наследство. Не го користи OpendKim
# SystemD услуга. Ве молиме користете ги соодветните параметри за конфигурација во
# /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.
# 
# Daemon_opts = ""
# Промена на/var/spool/postfix/run/opendkim за да користите штекер Unix со
# Postfix во chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Некоммен за да наведете алтернативен штекер
# Забележете дека поставувањето ова ќе ја надмине секоја вредност на штекерот во OpendKim.conf
# стандардно:
# Слушајте на сите интерфејси на портата 54321:
# Штекер = inet: 54321
# Слушајте на јамка на портата 12345:
# Штекер = inet: 12345@localhost
# Слушајте на 192.0.2.1 на портата 12345:
# Штекер = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Додадете ги овие редови:

# стандардно_процес_лимит = 100
# Стандардно_client_limit = 1000
# Стандардно ограничување на VSZ (виртуелна меморија) за процеси на услуги. Ова е главно
# наменети да фатат и убиваат процеси што протекуваат меморија пред да јадат нагоре
# сè.
# Стандардно_VSZ_LIMIT = 256m
# Корисникот за најавување е внатрешно користен од процесите на најава. Ова е најневерниот
# Корисникот во системот DoVecot. Не треба да има пристап до ништо.
# Стандардно_login_user = dovenull
# Внатрешниот корисник се користи од не -привилегирани процеси. Треба да биде одвоено од
# Најавете се корисник, така што процесите на најавување не можат да ги нарушат другите процеси.
# Стандардно_Интернален_усер = dovecot
    # порта = 143
    # порта = 993
    # SSL = да
  # Број на врски што треба да се справите пред да започнете нов процес. Типично
  # Единствените корисни вредности се 0 (неограничено) или 1. 1 е посигурен, но 0
  # е побрзо. <doc/wiki/loginprocess.txt>
  # Service_count = 1
  # Број на процеси за секогаш да чекате повеќе врски.
  # процес_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-da, doVeadm, евентуално процес на IMAP, итн. Корисници кои имаат
  # Целосните дозволи за овој штекер се во можност да добијат список на сите кориснички имиња и
  # Добијте ги резултатите од пребарувањата на сите корисници на корисникот.
  # 
  # Стандардниот режим 0666 им овозможува на секој да се поврзе со штекерот, но со
  # Пребарувањата на корисникот DB ќе успеат само ако корисникот durnss 'UID" поле што
  # одговара на UID на процесот на повикувач. Исто така ако UID или GID на повикувачот одговара на
  # Употребата на штекерот или го наметнува пребарувањето успева. Сè друго предизвикува неуспех.
  # 
  # За да му дадете на повикувачот целосни дозволи за пребарување на сите корисници, поставете го режимот на
  # нешто друго од 0666 и доверот му дозволува на јадрото да го спроведе
  # дозволи (на пр. 0777 им овозможува на сите целосни дозволи).
  # Процесот на работникот на авторот е стандардно како корен, за да може да пристапи
  # /итн/сенка. Доколку ова не е потребно, корисникот треба да се смени во
  # $ Default_internal_user.
  # корисник = корен
  # Ако се користи прокси на DICT, процесите на пошта треба да имаат пристап до неговиот штекер.
  # На пример: режим = 0660, група = vmail и Global mail_access_groups = vmail
    # режим = 0600
    # корисник =
    # група =

Уште еднаш, проверете дали ќе го замените доменот во сите овие датотеки, femmebabe.com, со доменот што го избравте. Уредете ја следната датотека, конфигурацијата на Довекот,

nano config/etc_dovecot_dovecot

И додајте ги овие редови

## Датотека за конфигурација на DoVecot
# Ако брзате, видете http://wiki2.dovecot.org/quickconfiguration
# Командата „doveconf -n" дава чист излез на променетите поставки. Користете го
# Наместо да копирате и залепувате датотеки кога објавувате на списокот за испраќање на DoVecot.
# '# „Карактерот и сè после тоа се третираат како коментари. Дополнителни простори
# и јазичињата се игнорираат. Ако сакате да користите кое било од овие експлицитно, ставете го
# value inside quotes, eg.: key = "# знак и заостанувачки бел простор "
# Повеќето (но не сите) поставки можат да бидат презаситени со различни протоколи и/или
# IPS од извор/дестинација со поставување на поставките во делови, на пример:
# Протокол IMAP {}, локален 127.0.0.1 {}, далечински 10.0.0.0/8 {
# Стандардните вредности се прикажани за секоја поставка, не е потребно да се некомкција
# оние. Ова се исклучоци од ова, сепак: нема делови (на пр. Име простор {})
# Или поставките за приклучоци се додаваат по дифолт, тие се наведени само како примери.
# Патеките се исто така само примери со тоа што вистинските стандардни се засновани на конфигурирање
# опции. Патеките наведени тука се за конфигурирање --Префикс =/usr
# --sysconfdir =/etc--локалстатиран =/var
# Овозможете инсталирани протоколи
# Список на записник одделен со IPS или домаќини каде да слушате за врски.
# "*" ги слуша сите интерфејси IPv4 "," :: "ги слуша сите интерфејси IPv6.
# Ако сакате да наведете не-намалени пристаништа или нешто посложени,
# Уреди conf.d/master.conf.
# Слушајте = *, ::
# Основен директориум каде да ги чувате податоците за траење.
# base_dir =/var/run/dovecot/
# Име на овој пример. Во повеќекратно поставување на DoVeadM и други команди
# може да користи -i <stance_name> за да изберете кој пример се користи (алтернатива
# до -C <config_path>). Името на инстанцата се додава и во процесите на DoVecot
# Во излез на PS.
# instance_name = dovecot
# Поздрав порака за клиенти.
# login_greeting = подготвен.
# Список од одделен простор на доверливи мрежни опсези. Врски од овие
# ИП им е дозволено да ги надминат своите IP адреси и пристаништа (за најавување и
# за проверки на автентикација). оневозможи_plaintext_auth исто така е игнориран за
# овие мрежи. Обично, овде би ги навеле вашите сервери за прокси IMAP.
# login_trusted_networks =
# Список од одделен простор за приклучоци за проверка на пристап до најава (на пр. TCPWrap)
# login_access_sockets =
# Со proxy_maybe = да ако прокси дестинацијата одговара на некој од овие IP, не правете
# проксирање. Ова не е потребно нормално, но може да биде корисно ако дестинацијата
# IP е на пр. IP на баланс на оптоварување.
# auth_proxy_elf =
# Покажете повеќе наслови на глаголски процеси (во ПС). Во моментов го покажува корисничкото име и
# IP адреса. Корисно за гледање кои всушност ги користат процесите на IMAP
# (на пр. Заеднички поштенски сандачиња или ако истиот UID се користи за повеќе сметки).
# verbose_proctitle = бр
# Доколку сите процеси ќе бидат убиени кога се исклучува мастер процесот на доверот.
# Поставувањето на ова на „не" значи дека доверот може да се надогради без
# принудувајќи ги постојните врски на клиентот да се затворат (иако тоа може да биде
# Проблем ако надградбата е на пр. Поради безбедносна фикс).
# Shutdown_Clients = да
# Ако не-нула, извршете команди за пошта преку оваа многу врски со серверот DoVeadM,
# Наместо да ги извршувате директно во истиот процес.
# doVeadm_worker_count = 0
# Unix Socket или домаќин: Порта што се користи за поврзување со серверот DoVeadM
# doVeadm_socket_path = doVeadm-сервер
# Список од одделен простор на променливи на животната средина што се зачувани на DoVecot
# стартување и пренесено на сите свои процеси на деца. Можете исто така да дадете
# клуч = парови на вредности за секогаш поставување специфични поставки.
# увоз_еколошка = tz
## 
## Поставки за сервер за речник
## 
# Речникот може да се користи за чување на списоци со клуч = вредности. Ова го користат неколку
# приклучоци. До речникот може да се пристапи или директно или иако a
# сервер за речник. Следниве ги блокираат имињата на речникот на речниците на УРИ
# Кога се користи серверот. Овие потоа можат да бидат упатени со употреба на URI во формат
# "Прокси :: <име>".
  # квота = 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 за комплетно
# Документација на достапните параметри за конфигурација.
# Logwy No.
# Заеднички параметри за потпишување и верификација. Во Дебиан, заглавието „од" е
# преголем, затоа што честопати е клуч за идентитет што се користи од системите за углед
# и со тоа малку чувствителен на безбедност.
# Потпишување домен, селектор и клуч (потребно). На пример, извршете потпишување
# За доменот "пример.com" со селектор "2020" (2020._domainkey.example.com),
# Користење на приватниот клуч зачуван во /etc/dkimkeys/example.private. Повеќе грануларно
# Опциите за поставување може да се најдат на /usr/share/doc/opendkim/readme.opendkim.
# Домен пример.com
# Селектор 2020 година
# KeyFile /etc/dkimkeys/example.private
# Во Дебиан, OpendKim работи како корисник „OpendKim". Потребна е умаск од 007 кога
# Користење на локален штекер со MTA кои пристапуваат до штекерот како не-привилегиран
# корисник (на пример, PostFix). Можеби ќе треба да додадете корисник "postfix" во групата
# „Опенким" во тој случај.
# Штекер за MTA врска (потребно). Ако МТА е во затвор во хроот,
# Мора да се обезбеди дека штекерот е достапен. Во Дебиан, Postfix работи во
# Chroot in/var/spool/postfix, затоа треба да биде приклучокот на Unix
# Конфигуриран како што е прикажано на последната линија подолу.
# Локален приклучок: /Run/opendkim/opendkim.sock
# Приклучок ИНЕТ: 8891@localhost
# Приклучок ИНЕТ: 8891
# Домаќини за кои треба да се потпишат наместо да се потврдат, стандардно е 127.0.0.1. Погледнете го
# Операција Дел на OpendKim (8) за повеќе информации.
# Внатрешни хости 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Прицврстувачот на довербата овозможува DNSSEC. Во Дебиан, е обезбедена датотеката за прицврстување на довербата
# Со пакетот DNS-корен-податоци.
# Имиња 127.0.0.1
# Домени на мапи од адреси до клучеви што се користат за потпишување пораки
# Збир на внатрешни домаќини чија пошта треба да биде потпишана
nano config/etc_default_opendkim

И додајте ги овие редови

# Белешка: Ова е датотека за конфигурација на наследство. Не го користи OpendKim
# SystemD услуга. Ве молиме користете ги соодветните параметри за конфигурација во
# /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.
# 
# Daemon_opts = ""
# Промена на/var/spool/postfix/run/opendkim за да користите штекер Unix со
# Postfix во chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Некоммен за да наведете алтернативен штекер
# Забележете дека поставувањето ова ќе ја надмине секоја вредност на штекерот во OpendKim.conf
# стандардно:
# Слушајте на сите интерфејси на портата 54321:
# Штекер = inet: 54321
# Слушајте на јамка на портата 12345:
# Штекер = inet: 12345@localhost
# Слушајте на 192.0.2.1 на портата 12345:
# Штекер = inet: 12345@192.0.2.1

Кога сме подготвени да го поставиме нашиот сервер PostFix, ќе го извршиме подолу кодот, со вградено соодветно име на домен. Започнете со создавање скрипта

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

Сега, во Нано, уредникот за текст, изменете ја оваа датотека, така што го вклучува вашето име на домен наместо Femmebabe.com.

# !/канта/баш
# Поставување 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

Ова ќе понуди вербални информации за пошта што ја испраќа серверот и дали работи правилно. Треба да бидете во можност да ја видите е -поштата во вашето сандаче, ако не е таму, проверете ја папката за спам.

Исто така, ќе треба да ги конфигурирате поставките во вашите поставки.py за да може вашиот сервер за е -пошта да разговара со вашата апликација django, проектот. Додадете ги или заменете ги овие редови во вашите поставки

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

Забележете дека користиме конфигуративна датотека за да ја добиеме лозинката. Ајде да ја вчитаме оваа датотека во поставките како така, на самиот почеток на датотеката:

# Отворете ја и конфигурацијата на оптоварувањето

Ајде да ја креираме оваа датотека и да додадеме таен клуч за неа, како и лозинката за пошта. За да генерирате таен клуч, користете ја оваа команда, со која било должина што сакате на крајот:

openssl rand -base64 64

Сега, копирајте го текстот што се отвора генерирана и уредување /etc/config.json

sudo nano /etc/config.json

Додадете ги следниве редови во вашата датотека, со клучот што се отвора генерирано како тајно копче.

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

Форматот JSON е едноставен и лесен за употреба, можеме да прогласиме други клучеви што сакаме да ги користиме и во нашиот проект и на овој начин, и да ги задржиме одвоени од нашиот директориум за проекти, така што другите корисници не можат да им ги напишат и така да не можат да се прочитаат само од нашиот проект директориум. Ова се препорачува практика за копчињата со API, од кои ќе користиме повеќе од неколку овде.

Исто така, ќе сакате да направите резервна копија на вашиот проект за да бидете сигурни дека сè е зачувано и ќе можете да ја вратите вашата работа подоцна, дури и ако повеќе не сакате да изнајмите сервер.

sudo backup

Сега, обидете се да испратите HTML -е -пошта од веб -серверот, под услов да се испрати една од командната линија. Прашајте го вашиот пример на корисникот во школка и испратете 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

Под услов сè да се постави правилно, сега ќе добиете е -пошта за добредојде во вашето поштенско сандаче испратена од вашата веб -апликација. Добра работа! Дојдовте долг пат.

Сакав да додадам, ако некогаш се борите со какви било грешки додека работите на ваков проект, не двоумете се да барате одговори и да побарате помош. Гугл, меѓу другите пребарувачи, се одлични ресурси за пребарување на помош за програмирање. Едноставно пребарувајте ја грешката што ја добивате и ќе можете да видите како другите луѓе го решаваат проблемот. Исто така, добредојдени сте да ме контактираат, вашите наставници (наставници, професори, воспитувачи), сите врсници на Интернет кои се достапни за помош за програмирање или повторно да се консултираат со оваа книга или други ресурси за да најдете решенија за прашањата што ги доживувате. Јас разбирам дека ова не е лесно, но дури и ако сте прочитале во ова далеку и не пишувате код, многу учите за градење на веб -апликација од нула. Петнете се на грб, правите одлична работа.

Ви благодариме што одвоивте време да го прочитате ова Водич за развој на веб -страница на третото издание. Во идните изданија, ќе вклучам повеќе важни примери што се дискутираат во почетокот на документот и ќе се нурнеме многу подлабоко во светот на развојот на софтверот и хардверот. Останете подесени за она што ќе дојде, и со нетрпение очекувам да ве научам како да изградите неверојатен софтвер. Се гледаме во следното издание!






AKAIKY
Pejy 1
Hanketo
Jereo ny lahatsoratra feno
Tohizo ny famakiana

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny cryptocurrency



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

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny cryptocurrency


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

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny cryptocurrency


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

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


Buy On

ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny 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.


ny Daisy / Hijery | Buy | Mividiana miaraka amin'ny cryptocurrency




https://glamgirlx.com -


(Tsindrio na tsindrio ny sary hisintona sary)
Ny fialamboly matihanina, sary, horonan-tsary, audio, Livestreaming ary lalao kilalao, ary koa ny scanning ID, fampandrosoana ny tranonkala.

Avelao aho amin'ny tendron-tsoavaly amin'ny fampiasana ity adiresy ity: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Fepetraky ny serivisy