Практически уеб базирани дълбоко обучение и сигурност чрез пример Трето издание Шарлот Харпър 3 юли 2024 г. Актуализирано/преобразувано на 3 юни 2025 г.
Предговор:
Съображенията за сигурност в изграждането на софтуер за мрежата са важна част от плана и изпълнението на всеки уеб разработчик, докато инжектира прототип, който е надежден, стабилен и полезен за практически цели. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking to Убийте времето или направете нещо в интернет, обикновено на сензорен смартфон устройство. Повечето хора дори не биха знаели откъде да започнат, когато искат да създадат уебсайт от нулата, те биха били склонни да започнат на уебсайта на друг човек и да изграждат нещо ограничено в функционалността, надеждността, лекотата на използване и особено креативността, когато биха могли да имат всички най -нови мощни инструменти, които да плащат, за да изградят нещо полезно, без да губят време да натискат бутони и особено да губят пари, които плащат за скъпи абонаменти за софтуер. Ако имате няколко минути, за да прочетете тази книга и да научите на какво искам да ви науча или дори да говорите с мен лично за вашите цели и да получите някакви насоки в правилната посока и да сте мотивирани да се научите да кодирате и да напишете свой собствен софтуер, да вземете тази книга у дома и да отделите известно време, за да се научите да изграждате следващото влиятелно, мощно, оптимизирано и важно уеб приложение, уебсайт, който е на всички вас и прави точно това, което искате и отговаряте на нуждите на вашите аудитории.
За мен: Аз съм разработчик на софтуер с широк спектър от опит в C/C ++, Java, Python, HTML, CSS и JavaScript. Създавам уебсайтове, които хората искат да използват, искат да посещават и дори да се пристрастяват да използват само за да научат, пресъздават и убивам време и най -важното - продавам софтуер. Ако сте имали идея как точно сте искали уебсайт да изглежда и функционира, вие сте били готови да ме подкрепите, за да мога да отговоря на собствените си нужди, докато отговарям на вашите, и сте готови да покриете разходите за управление на уебсайт, бих ви изградил следващия YouTube, Tiktok, Twitter, Google или дори високотехнологично приложение за сигурност само имате достъп. Вместо да се опитвам да ви продам времето си, аз се опитвам да си купя своето: Искам да ви говоря за изграждането на приложение (уебсайт) с информацията, която вече съществува, и да ви науча какво трябва да бъдете независим разработчик на софтуер, предприемач, водещ успешна кариера във всяка област, която желаете. И нека бъда ясен, образованието, което ви давам, ще бъде неформално. Можете да отидете на училище и да научите всичко това с официално образование или дори да прочетете тази книга в училище, да изпълните задачите си и да отнемете много от образованието си, но аз официално няма да ви поставя на горещото място и да ви помоля да изпълните задачите. Аз не съм твой професор, можеш да мислиш за мен като за приятел, който иска да те насочи към кариера, водена от вашия личен успех. И аз също не ви продавам успех, ще трябва да го купите с времето си. Да се научим да кодират има стръмна крива на обучение и никога не е било лесно или дори да бъде. Трябва да работите възможно най -усилено и да продължите да се опитвате и да се провалите и да опитате отново, дори когато сте разочаровани, за да научите и изградите приложения сами. Това е в естеството на самия код. Кодът се изпълнява от компилатор, който е предназначен да даде съобщения за грешки в програмиста и те ще ви научат как да кодирате, дори ако просто копирате грешката в вашата търсачка и четете примери на други хора. И трябва да кажа, че не е нужно да сте изключително богати, умни, успешни или дори детайлни ориентирани или организирани за изграждане на приложение. Компютърът се грижи за тази организация за вас. Просто трябва да упорствате чрез опитите и грешките, да поддържате фокуса и да работите усилено върху това, което правите, и ще имате много успешна кариера в цялото това, което правите.
Кой съм: Осъзнавам, че последният раздел беше по -скоро за ученето и вашите пътища от тази книга. Кой точно съм? Това е сложен въпрос. Самият аз не ми е ясно, тъй като страдам от медицински състояния, които могат да затруднят дори да кодирам или пиша тази книга на моменти, като същевременно представям предизвикателства с проблемите на социализацията и идентичността, които затрудняват живота ми по -труден, когато става въпрос за представяне. Накратко, ако четете тази книга, вие я донесете у дома, защото сте прехвърлили през нея и сте мислили, че е полезно или дори ако току -що сте прочели дотук, за вас съм подобен човек, който иска да ви види да успеете във всичко, което правите. Аз самият съм инженер, разработчик на софтуер и студент и пиша тази книга за други студенти, които искат да улеснят живота си, като имат наръчник на софтуера, от който се нуждаят, улеснява живота си, като дава примери за копиране на това, което се вписва като голям пъзел в работещ, полезен, голям, функционален, сплотен и ангажиращ приложение, което може да доведе до значение в работата на бизнеса. До голяма степен това е, което правя: изграждам приложения, за да помогна на себе си и други хора да успеят. Аз също съм автор, въпреки че това е първата ми публикация, която възнамерявам да завърша, за да сглобя портфолиото си в полезен документ, а аз също съм художник. Ще ти призная това, аз съм някакъв странен човек. Не съм перфектен, бях управлявал закона, който дори ме караше да напусна колежи и университети и да оставя държави, за да се опитам да си направя име с по -голям успех. Аз съм жена по раждане, нося грим, правя снимки на себе си, нося рокли и други дамски дрехи и оставам на съзнание за жена по природа. В миналото съм имал проблеми с други хора, които водят до борба с писането и изграждането на WebApps, и се извинявам, че не успях да вкарам тази книга по -рано: Имате нужда от това. Ще искате да прочетете и напишете код, който прилича на моя и работи като моя и прави същото, но дори по -добре, защото ако можете да си позволите да купите тази книга, вместо да размерите клавиатурата си, както аз, само за да създадете книга, която питате пари за нея, имате ресурсите, от които се нуждаете, че имате успех в живота си. Имах всякакви проблеми със семейството на семейството, здравословните състояния, лекарите, медиите и закона, а кодът ми дълбоко отразява борбата, която е феминизъм и женска природа в разделен и разочарован свят. Тази книга обаче е нещо, което ми ме интересува дълбоко, моето бебе, моето портфолио и поминъка ми, така че оценявам вашето внимание, когато вземете текста у дома и внимателно го порите, за да се поучите от мен. Моля, имайте предвид, че не съм перфектен, тази книга ще има грешки, ревизии и нови издания и ще трябва да мислите с вашия логически мозък възможно най -добре, за да имате успешен опит с моето писане. Също така, разберете, че имам предвид добре за вас, дори когато се сблъсквате с предизвикателства, когато пишете. Помислете за това така: Когато можете просто да наемете компютърна система, за да направите всичко, което евентуално можете да си представите в цифровото пространство, да съхранявате цялата информация, която срещате, анализирате и организирате и да я разберете, неизбежно ще срещнете трудности с информацията, която приемате и дори публикувате. Казвам ви това, защото срещам същите трудности. Използвайте тази книга на свой риск, работете с вашата общност и общности, достъпни за вас, за да изградите софтуер в безопасна обстановка, и не приемайте нещата лично, когато се провалите или дори успеете по грешен начин: така стигнах до този път и защо мога да ви донеса този текст и да ви помогна да успеете, без да се отклоняваме по пътя на лудост, който ме оставя да съсипете, разкъсани и разрушени, докато срещам с мрежата на всички. работа, интернет. Може да не сте много запознати с това кой съм само с няколко думи, но ви насърчавам да четете, ще ме опознаете, докато продължавате да ме четете и разбирате, докато изграждате свои собствени проекти, за да завършите работата си. Няма да има домашна работа с тази книга, стига вашите професори или учители да не ви присвоят, но силно ви насърчавам сами да изградите портфолио от проекти, докато четете заедно, както и проект на Capstone, който показва как можете да приложите наученото. Моят проект на Capstone е в основата на повечето от това, което ще прочетете в тази книга, тъй като той включва код от предишните ми проекти, код, който създадох и се научих да пиша методично на ръка, и широк спектър от идеи и съвети, които ми помогнаха да успея до момента, в който мога да завъртя просто приложение, което е напълно представено и изглежда и се държи като популярно приложение, което може да видиш приятеля или семейството си, използвайки в интернет, рекламирано на вас или в новините.
Каква е тази книга: Тази книга е урок по пример. 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 Софтуерът, който изграждате в абсолютната най -добра светлина, е най -привлекателният за вашите крайни потребители, посетителите на вашия уебсайт. В тази книга ще демонстрирам редица примери за софтуерен дизайн с акцент върху мрежата като платформа, както и сигурност. Ние ще инициираме опита за обучение, като изградим основен проект, използвайки Unix Shell, с функции за архивиране и скриптове. След това ще разгледаме основен уебсайт в блога, ще надстроим нашия блог с функции за снимки и видео, както и ще използваме тези функции за използване на решения за сигурност, използвайки безплатен софтуер, и ще защитим нашия сървър, използвайки модул за удостоверяване на Pluggable (PAM). След това ще прегледаме обработката и обработката на файлове, изследваме редактирането на видео, донорството на глас, сканирането на баркод и разпознаването на оптични характери, наред с други концепции. По пътя ще разгледаме API, които ще ни помогнат да направим нашия софтуер по -полезен и сигурен, с безплатни и платени опции. По пътя ще проучим физическата сигурност и войнствените инструменти като дизайн и производство на огнестрелни оръжия и боеприпаси, включително дизайн на цев и ретранслатор, дизайн на кули и дронове и други директори, с които ще се интегрираме с нашия софтуер в съществуващата мрежа, за да защитим нашия софтуер и да демонстрираме самозащита и преустройство. Ще направим почивки по пътя за изграждане на игри, 2D и 3D двигатели за изобразяване и ще работим с вграден хардуер в примери за казуси за основен размерен софтуер за изобразяване и електронен вибриращ масажор съответно в силиконов каучук. По пътя ще използваме и вече достъпни решения за машинно обучение, за да осигурим по -добре нашия софтуер. Ще използваме и инструменти за акции, достъпни за мрежата, за да оптимизираме и осигурим процеса. Тази книга е ръководство за вашия успех в изграждането на уеб приложение и интегрирането му с професионална мрежа от компютър и вградени механични системи и като цяло ръководство за изграждане на софтуер и вграден хардуер без основни познания или предишен опит.
Какво не е тази книга: Ако наистина искате да имате уебсайт, можете просто да настроите обикновен магазин и да продадете това, от което се нуждаете, да публикувате блог, да публикувате снимки или видеоклипове или по друг начин, без изобщо да пишете нито един ред код. Тази книга не е това. Тази книга ще ви научи как да изграждате софтуер, който е по -полезен, напълно представен, функционален и сигурен от всеки софтуер, който вече можете да намерите, тъй като разгръща най -новия софтуер, който все още е прототипи, може да е скъпо да се изпълнява в мащаб, в който по -старите компании работят, и не се харесва на назад, объркани компании, създадени да печелят пари за хора, които всъщност не правят нищо. Ако следвате внимателно тази книга, ще искате да напишете код, изследователски код, да изградите свои собствени приложения и ще печелите пари от това, което правите. Ще печеля пари от тази книга, дори в ранни етапи, защото тя съдържа информация, която хората се нуждаят и искат да четат, и вече купуват, когато купуват или използват моите приложения. Тази книга няма да създаде приложение за вас, но ще ви насочи в правилната посока и ще ви въоръжи с необходимите инструменти и уменията и съветите, които ще улеснят вашия собствен успех в изграждането на софтуер за мрежата, с всеки ред код, който ще трябва да напишете като пример, готови да бъдат събрани в софтуер вас и вашите привърженици, гости, клиентела, приятели, семейство, посетители, изпълнители, и хората от интернет, които искат да използват и поддръжка.
Какво ще научите: Тази книга ще ви научи как да изграждате и продавате софтуер, наистина функционален, полезен софтуер, запис на медии, функции за сигурност като разпознаване на лица, сканиране на баркод за четене на машини, уеб API за удостоверяване, запис и изобразяване на видео и снимки и обмен на съобщения като Bluetooth и близо до Field (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 verification or other Цели, сканиране на ИД, Умереност на изображението и видео, микротранзакции на данни, за да запазите софтуера си сигурна, обработката на плащания, търговията с криптовалута, асинхронните задачи и други. Ще научите как да изграждате свои собствени Bluetooth устройства, с батерии, зарядни устройства, микроконтролери, вериги, двигатели и сензори, използвайки спойка, тел и 3D отпечатани, както и отливки. Ще демонстрирам директори на 3D дизайн, приложени към производството на добавки и изработване на инструменти и матрици, така че вие сте в състояние да произвеждате свои собствени вградени, хардуерни устройства с интегрирани батерии, зарядни устройства, електронни вериги и функционални изходи. и ги свържете с Bluetooth и мрежата. По -конкретно, ще разгледаме две казуси, вибриращ масажор и домашно огнестрелно оръжие, програмирани в OpenScad, което е достъпно като графичен интерфейс или помощна програма за командния ред и може да бъде интегрирана в мрежа за по -бързи резултати. Ще научите как да изграждате и разгръщате уебсайт от самото начало без предишен опит, ще го направите функционален, сигурен, красив, полезен и най -важното практично. Ще научите как да използвате машинно обучение и компютърно зрение, за да направите сайт защитен и по -практичен, запис на видео и аудио от вашия уебсайт, дарете гласа си, да направите музика и да модулирате аудио за създаване на полезни проби и как да пробиете шума, като използвате други уебсайтове, за да изградите най -добрата възможна мрежа от уебсайтове, които можете да свържете директно с вашите, за да споделите цялата полезна информация, която трябва да предложите, и дори по -важното да доведете на хората с вашия софтуер и бизнес. Тази книга ще бъде фокусирана най -много върху медиите, сигурността и машинното обучение, които са основните три компонента, които ще ви помогнат да изградите полезен софтуер за мрежата, като ангажирате правилните потребители и ще изключите грешните по начин, който е реалистичен, практичен, с ръце и ангажиране, докато също е автоматичен и здрав. Тази книга преподава Unix, по -специално Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript и редица полезни софтуерни пакети за Python като заявки, както и полезен Bash софтуер като GIT и FFMPEG. Също така ще ви науча как да търгувате автоматично криптовалута и да приемате плащания в криптовалута или от обикновени дебитни карти, като същевременно платите на посетителите си дял от приходите ви, ако решите да го направите. Ще ви науча как да печелите пари от вашия уебсайт и чрез реклама, как да подготвите приложението си за търсачки и да го направите бързо, класирано в първата класация за това, което вашите клиенти ще търсят, за да ви намерят, и да се класирате в възможно най -често срещани търсения. Ще ви науча как да продавате вашия софтуер, да го рекламирате, да се харесате на клиентите, които търсят вашите услуги, и да направите име за себе си в интернет чрез пътища, които вече съществуват, са евтини и работят добре. Ще ви науча как да запазите вашите данни на облачни компютри, които работят за вас, и да запазите вашите данни евтино, как да планирате и изградите уебсайт, който прави това, което вашите потребители искат, и това, което искате, и как да поддържате вашите потребители ангажирани, като поставяте сайта си да се откаже от техните телефони с известия, имейл, текстови съобщения, телефонни обаждания и повече алеи, за да върнете потребителите си в уебсайта ви на разположение на вашия уебсайт, който се нахвърля само на вашия разположение. Тази книга ще се съсредоточи върху практичността на публикуването и разпространението на медии в големи количества, от текст до снимки до видеоклипове до аудио, което прави добро впечатление на крайните потребители (вашата клиентела) и се продава по всякакъв начин, който правите, за да създадете уебсайт, приложение, което е представително за вас и вие, и ви прави, вашият софтуер и вашата компания да изглежда добре в най -добрия начин. Вие също ще научите няколко съвета и трикове от мен, от съвети за кодиране, практическа суета като грим и фотография, моделиране и актьорско майсторство и други, които ще бъдат важни за изобразяването на себе си и вашата компания в най -добрата възможна светлина, използвайки всички инструменти, достъпни за вас, като същевременно разпространявате толкова усилия, колкото се нуждаете, или пари, отколкото е необходимо. Тази книга се нарича "практичнаУеб базиран дълбоко обучение и сигурност по пример „поради причина: тя се занимава с научаването на кодиране, по -специално за мрежата, по -специално с акцент върху сигурността, от практическа гледна точка, с примери за работещ код, който обслужва практическите цели, очертани в текста. Подобрението, надписът на изображението и други задачи като показатели за прогнозиране, получени от изображения, като естеството на изображението като автентично, компютърно-трансферно изображение или оптично копие (снимка на изображение или отпечатана снимка). in with your face. You can make a server computer this safe, a computer that would normally ask you for a username and passcode and log you in, maybe with a confirmation token for each new login or new IP address, but if you are building large scale, easy to use, fundamentally secure, and powerful software, this may be enough. Tying your software too closely to someone else's software, like an email service or text message service, is not enough to make your software secure, or anyone's (any site you употреба). Всеки, който изгражда безупречно софтуер, има някакво усещане за това, което предполага. Софтуерът е по своята същност несигурен, тъй като устройствата и акаунти, които използваме за достъп до него, не винаги са на наше разположение, те биха могли да бъдат в ръцете на всеки, който има зле намерение за софтуера и следователно може да представлява риск за самия софтуер. Това е нещо от фокуса на тази книга. Мрежовият компютър по подразбиране е защитен с дълъг ключ, наречен и SSH или Secure Shell Key и в противен случай е най -добре осигурен с уеб сървър, тъй като уеб сървърът осигурява отворения достъп, както и състоянието на Art Security Tools, работещи на самия сървър. Уеб сървърът има достъп до уеб браузъра на потребителя, който е може би най -мощната част от устройството на потребителя, защото това е мястото, където потребителят може да получи достъп до мрежов софтуер. Този инструментариум може да изобразява текст, уеб страниците, които виждате, а също така могат да записват изображения, аудио и видео (като снимка на лице или държавен идентификационен номер), могат да четат и пишат на Bluetooth радио устройства и могат да четат и пишат в близост до маркери на Transponder, неактивни ключови карти, FOB, стикери, пръстени и дори чип импланти с уникални серийни числа, които могат да бъдат четени и написани с генерирани данни и да се утвърди с тагове за уеб сървър, които могат да се четат. Използвайки всички инструменти, с които разполагате, с тази книга ще се оборудвате със знанията за изграждане на защитен уебсайт и като цяло сигурна мрежова компютърна система, която работи за вас, прави офертата ви и изглежда и чувства
Откъде да започна: Добре дошли сте да прескочите покрай раздел, който започвам тази книга с или който и да е раздел, към точния код, от който се нуждаете, особено ако имате опит с кодирането преди или някой от гореспоменатите инструменти, които ще опиша подробно в тази книга, както и документиране на случаи на използване и практически примери за тях. Ако нямате опит в кода за писане, горещо ви препоръчвам да прочетете цялата тази книга и особено ви препоръчвам да прочетете предишните раздели, за да сте сигурни, че тази книга е подходяща за вас. Ако тази книга не е подходяща за вас, помислете за подаръци на приятел или роднина, който може да се интересува сами да научите за уеб разработката и дори да помислите за заемане на него и да се научите от тях, за да попълните пропуските, където ви провалих като учител, или други учители направиха преди мен. Започнете там, където щете, всяка част от тази книга ще бъде полезна, ако възнамерявате да изградите полезно приложение и помислете, че най -добрите приложения са изградени с крайния потребител в ума: Познайте клиента си. Сега ме познавате, знаете тази книга и сте готови да започнете. За да започнете, вземете компютър (дори най -евтиният лаптоп от магазин за кутии, Amazon или стар десктоп работи и го настройте по начин, който работи за вас.
Как да прочета тази книга: Текстът подчерта, обозначава, че текстът принадлежи в командния ред, където ще напишете кода, който стартирате. Командният ред е фокусиран върху клавиатурата и изисква малко или без да щракнете, ускорявайки работния ви процес и улеснява нещата върху вас.
Първи стъпки: Нека се потопим. Ще започнем с изграждането на код на локална машина и ще започнем, без да изграждаме уебсайт, свързан с интернет. Това е по -безопасно да започнете, не струва нищо и ви е лесно. В зависимост от вашата операционна система, влизането в черупка ще бъде малко по -различно. За Mac OS препоръчвам да инсталирате виртуална машина в този момент, тъй като ще получите най -голяма съвместимост с виртуална машина. Различни доставчици като VirtualBox и Paralells могат да стартират виртуална машина за вас, въпреки че е възможно също да инсталирате Ubuntu директно на машината, ако предпочитате да използвате местна среда, която се препоръчва, за да създадете бързо, рационализирано изживяване. Ако използвате Linux или Windows, което препоръчвам, трябва да е доста лесно да създадете проект. Отворете терминала си, регулирайте оразмеряването, както сметнете за добре, и започнете следвайки стъпка 2. Ако използвате Windows, моля, следвайте стъпка 1.
Стъпка 1: - Само потребителите на Windows В Windows отворете командния ред като администратор и тип WSL - Инсталиране
Стъпка 2: - Продължете тук или пропуснете стъпка 1 до тук, ако не използвате Windows В отворен терминал (в зависимост от вашата ОС, наречена Ubuntu в Windows, Terminal in Mac или Linux или подобно име), започнете с създаването на проект. Правим това с командата mkdir, която създава директория. Ако трябва да създадете директория за съхраняване на вашия проект, който се препоръчва, използвайте командата CD, за да промените в директорията и и и
CD/path/to/directory - Пътят е папките (файловете), които предхождат вашата директория на местоназначение, вашият път по подразбиране е ~ или/home/username (където потребителското име е вашето потребителско име). За да промените в директорията по подразбиране, въведете CD или CD ~ MKDIR Пример - Заменете „Пример" с името на директорията
Сега имате работна директория за вашия проект. Като е толкова важно тази директория да бъде запазена в случай, че трябва да преминете към друга машина или да внедрите кода, който пишете, така че да е готов за мрежата, ще изградим скрипт, който да архивира вашата директория в следващите няколко стъпки. Но изграждането на скрипт отнема малко код и кодът трябва да бъде автоматизиран, за да бъде възможно най -полезен. Така че нека да изградим скрипт за първо изграждане на скриптове. Нека започнем с създаването на скрипта и да го направим изпълним. Ще използваме Sudo, Chmod и Touch за това и ще наречем скрипта "ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Сега създадохме скрипта, направихме го изпълним и сме готови да го редактираме. Nano е текстов редактор, който ще ви позволи да редактирате текст, без да щракнете, което е много по -лесно от използването на графичен потребителски интерфейс. За да редактирате файл с Nano, използвайте Nano и след това пътя към файла. За да направим скрипт, който прави скрипт, той е доста подобен на това да направим нашия скрипт на първо място. Ще използваме същия код като по -горе, заменяйки името на скрипта, "ascript" с параметър на аргумент, $ 1. Това ни позволява да се обадим на скрипта, като напишем просто sudo ascript newscript, в този момент можем да създадем всеки нов скрипт, като заменим „Newscript" с името на вашия скрипт. Кодът в Nano трябва да изглежда като:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
И за да затворим Nano, можем да задържим клавиша Control и да натиснем X, след това Y, за да обозначим, че запазваме файла и ще ударим връщане. Сега вместо да въведем тези три команди за редактиране на скрипт, ще можем да въведем Sudo Ascript Ascript, за да редактираме отново скрипта. Това работи! И всеки нов скрипт може да се стартира лесно, като го извикате в черупката. Нека да запазим нашата работа сега: Нека напишем резервен скрипт, за да запазим новия ни скрипт и след това да я архивираме в нашата директория на проекта, като същевременно подкрепяме скрипта за архивиране.
sudo ascript backup
Сега, в Нано:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Където/път/към/директория е пътят към проекта, който сте създали с MKDIR. По -късно ще научим как да копираме повторни пътища като този с цикъл и списък, който е по -малко код, но засега нека го поддържаме просто и да имаме няколко реда. За да стартирате този скрипт и да архивирате кода си, запазете файла в Nano с Control+X, Y и Return, и въведете по -долу във вашата черупка
backup
Ако изобщо сте подканени за парола, докато четете тази книга и следвайте в черупката, моля, въведете правилно вашата потребителска парола, ще имате три опита, преди да се наложи да стартирате отново командата. Можете да използвате стрелките нагоре и надолу, за да повторите команди и да ги редактирате, ако трябва да стартирате нещо два пъти. Прост натиснете нагоре и надолу периодично, за да изберете команда, преди да редактирате командата с десния, леви стрелки и изтрийте клавиша, както и клавиатура, и я стартирайте с връщане.
Поздравления! Успяхте да създадете страхотен резервен скрипт, който подкрепя два важни скрипта на черупките във вашата работна директория. Можем да преместим нещата по -късно, тъй като проектът става все по -голям, но това работи засега. Нека преминем към архивиране в облака, ще използваме GitHub за това (макар че има много други решения за GIT за архивиране, те са приблизително еднакви.) Git е софтуер за контрол на Verision, който ви позволява да архивирате редакциите на вашия софтуер, докато ги правите на сървър, като същевременно ви позволява да изтеглите цели копия на софтуера си зад парола или ключ. Това е от съществено значение за запазването на вашия софтуер, особено когато мигрираме до защитени случаи на Linux, които понякога се разпадат, когато един ред код се провали, оставяйки ви заключен, докато кодът ви може да не бъде подкрепен, ако нямате шанс да го върнете автоматично, което ще покрием.
Ако в този момент вече не използвате виртуална машина на Ubuntu, в този момент препоръчвам с помощта на виртуална машина Ubuntu, тъй като това ще улесни живота ви, когато инсталирате всички пакети, необходими, за да изградите работещ уебсайт и да подготвите операции за дълбоко обучение на вашия компютър. В близко бъдеще ще преместим кода на уеб сървър, но искаме да се уверим, че зад нашия уеб сървър има поне няколко слоя сигурност, които са устойчиви на фишинг, и ще използваме редица пакети Linux, за да направим това. Ако все пак искате да използвате Mac OS, вие сте добре дошли да търсите и инсталирате необходимите пакети онлайн, но може да няма алтернативи за всеки пакет, който тази книга или серия ще покрие.
Нека добавим няколко команди, за да извършим нашата работа със скрипта за архивиране, като изпълним командата sudo ascript архивиране.
# ...
Още веднъж контролирайте X, за да запазите.
Сега трябва да направим еднократна конфигурация за този проект. Тъй като скоро ще бъде GIT проект, няма нужда да пишеме всяка команда всеки път, когато се разгърнем от хранилище Git, но ще получим това, когато пишем нашите скриптове за внедряване. За начало, нека се уверим, че сме в правилната директория и инициализираме GIT хранилището и генерираме SSH ключове.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
След като напишем SSH-Keygen, новият ключ трябва да бъде запазен в папката Home под папка, наречена .ssh. Нарича се id_rsa.pub. Нека намерим този ключ и да го копираме. Да го видя,
cd ~
cat .ssh/id_rsa.pub
Копирайте текста, който се връща от последната команда, и създайте акаунт с вашия доставчик на GIT (в идеалния случай GitHub), преди да добавите SSH клавиша към вашия акаунт. След като имате акаунт, щракнете върху горното дясно меню и въведете настройките, преди да добавите своя SSH клавиш в SSH и GPG клавиши под достъп в менюто. Изберете Добавяне на SSH ключ и добавете своя, като го поставите и му дадете заглавие, преди да запазите и върнете в GitHub, за да създадете ново хранилище. Това е подобно за други доставчици на GIT, ще трябва да прочетете тяхната документация. В новата конфигурация на хранилището дайте описателно име на хранилището си и решете дали искате да го публикувате и не забравяйте да конфигурирате все още файлове за включване. След като се създаде хранилището, копирайте клонирането с SSH URL и го поставете в следната команда.
git remote add git://… (your remote URL)
Сега можете да се върнете в хранилището си с CD, ще се запознаете с това. Опитайте своя резервен скрипт сега с резервно копие
Страхотно! Сега наистина можем да получим кодиране. Нека инсталираме Django сега, когато имаме добро разбиране на Bash и Git. Django ще ни позволи автоматично да архивираме нашия софтуер, Bash може да направи това и това, но Django трябва да има по -просто по -безопасно изпълнение (той може да бъде деактивиран и конфигуриран по -лесно).
За да инсталираме софтуер в Ubuntu, ще използваме командата sudo apt-get. Първо, нека актуализираме и надстроим софтуера, който вече имахме. Това може да стане с Sudo Apt-Get Update и Sudo Apt-Get-Gregrade -y. На следващо място, нека инсталираме Python и нашата виртуална среда, домът на нашия код, със следната команда: sudo apt-get инсталирайте python-is-python3 python3-env
Това е всичко, което трябва да продължите с Django по отношение на инсталациите на софтуер в екземпляра Ubuntu. За Windows и Linux това трябва да е доста просто, но за Mac може да искате да инсталирате виртуална машина и Linux на нея, като използвате безплатна или платена виртуална среда като VirtualBox или Paralells Desktop и пресъздайте стъпките по -горе, за да настроите Ubuntu среда. В този случай Ubuntu е от решаващо значение, тъй като това е софтуерът, който уебсайтовете изпълняват и им дава възможност да хостват уебсайтове с целия гореспоменатия софтуер.
Да се разровим в джанго.
В нашата директория отново, с CD:
python -m venv venv # Създава виртуалната среда, в която се съхранява код
source venv/bin/activate # Активира виртуалната среда
django-admin startproject mysite . # Където MySite е проектът, който започвам в настоящата си директория.
Django тъкмо ни започва, защото Django хоства на уеб сървъра и прави всичко необходимо, за да получим основен местен уебсайт. Сега, когато имаме инсталиран Django, нека редактираме настройките малко, за да работим как се нуждаем. Първо, нека създадем ново приложение
python manage.py startapp feed
Ще забележите, че първото приложение се нарича Feed. Приложението трябва да се нарича каквото искате, и ние ще създадем нови приложения, но името на всяко приложение трябва да е последователно всеки път, когато приложението е посочено в кода. За да добавим ново приложение, винаги ще редактираме настройките.py в другата директория, създадено от приложението, наречено в StartProject, по -долу приложение. Използване на Nano,
nano app/settings.py
В настройките намерете installed_apps и разделете [] на 3 реда. Използвайки четири пространства на празната централна линия, добавете „емисия" или името на вашето приложение. Този раздел от настройките.py трябва да изглежда като:
INSTALLED_APPS = [
'feed',
]
Преди да забравим, нека тестваме, че Джанго работи. Използвайки командата python manage.py runserver 0.0.0.0:8000, можем да стартираме сървъра и след това да се движим в уеб браузър на компютъра, изпълнявайки кода на http: // localhost: 8000 и вижте примерна уеб страница (работи!) Напуснете сървъра с Control C, същата като друга команда.
Сега, нека да се разровим в писането на някакъв код на Python. Django има три основни компонента, всички те се изпълняват изцяло от код. Компонентите се наричат модел, изглед и шаблон и всеки е съответно на по -високо и по -ниско ниво, преди уеб страницата да бъде доставена на потребителя.
Моделът е кодът, който съхранява информация в базата данни за извличане, сортиране и изобразяване.
Изгледът решава как моделът се прави, манипулира и модифицира, почти всеки изглед ще използва модел директно.
Шаблонът е HTML кодът с някои допълнителни камбани и свирки, наречени език на шаблона. Шаблонът се представя от изгледа, където е изпълнен с код на Python и контекст, като модели и информация (USUALL низове и цели числа) от изгледа.
Django също има други компоненти, включително, но не само:
Настройки, които конфигурират приложението, както обсъждахме.
URL адреси, които са модели, които потребителят следва, за да получи достъп до конкретни части от уеб приложението.
Формуляри, които определят как информацията, която се изпраща на сървъра, се обработва и изобразява в базата данни, както и на потребителя. Това са основата на обработката на информация от страна на сървъра и могат да приемат всякакъв вид информация, която компютърните съхраняват, най -вече текстови низове, цифри и истински/фалшиви булеви (обикновено отметка).
Шаблони, които са HTML код и език на шаблона и преодоляват пропастта между Python и HTML, което означава, че информацията на Python може да бъде обслужвана като HTML код, до който всеки може да има достъп и може да осигури уебсайт с ограничен достъп, като същевременно прави Python код достъпен за мрежата и полезен за различни цели на отдалечено устройство, което не трябва да бъде в близост до сървъра.
Статични файлове, които обикновено са JavaScript и неговите библиотеки, които сървърът обслужва и са свързани с шаблона.
Медийните файлове, които сървърът обслужва или е хостван външно или просто е написан на сървъра, преди да бъде обработен и публикуван на друг сървър (кофа) за хостинг.
Междинен софтуер, който е код, който се изпълнява едновременно с всеки изглед и се счита за „включен" в изгледа.
Контекстните процесори, които обработват контекста на всеки изглед и се използват за добавяне на допълнителен контекст.
Тестове, които валидират, че потребителят или заявката преминават определени изисквания преди изгледът да бъде представен.
Потребителите, които диктуват как WebSockets се справят и реагират на комуникацията.
Admin, който се използва за регистриране на модели, така че те да могат да бъдат манипулирани подробно в административната страница на Django, където базата данни може да бъде администрирана чрез графичен интерфейс.
Целерията, която определя асинхронните задачи части от кода на Django, може да започне да работи, преди незабавно да преминете към следващата задача или ред на кода.
Django може да има много други компоненти, които ще обсъдим подробно тук. Има много начини да направите Django по -функционален, добавяйки WebSockets, които са бързи, рационализирани комуникационни канали, целина, които изпълняват асинхронни задачи, и множество други части от софтуера за разширяване на Django, особено във функциите на изгледа, където по -голямата част от кода се изпълнява. Функциите на прегледа са ключови, тъй като те обикновено декларират всяко парче код, който е специфичен за конкретен модел на URL, или раздел на сървъра.
Първо, нека разгледаме функциите на прегледа. Функциите на прегледа започват с код, обозначаващ внос, който ще бъде използван в изгледа и се дефинира с помощта на редовни дефиниции или класове на функцията. Най -простите изгледи се определят от дефиницията на функцията DEF и връщат HTTPRESPONSE с основен шаблон. Нека започнем с дефинирането на основен изглед за връщане на текста „Hello World". Не забравяйте, че всеки път, когато добавяте код след изявление като DEF, ако, докато, за и т.н., ще трябва да добавите 4 пространства за всяко от предходните дефиниции, които искате да приложите към вашата функция. Скоро ще влезем в това, което всеки от тези средства.
От директорията на нашия сайт редактирайте файла feed/views.py, използвайки nano и добавете следните редове в края на файла.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Httpresponse на Django отговаря с текстов низ, обозначен с отварянето и затварянето ". Всеки път, когато предавате информация на функция или клас, като заявка или низ, ще трябва да използвате скоби (, отваряне и затваряне).
Това не е всичко, което все още трябва да видим нашето мнение. Разбира се, не сме казали на сървъра къде е точно изгледът, все още трябва да определим път, по който изгледът трябва да изобразява. Нека започнем с дефинирането на основен път в APP/URLS.py и ние ще влезем в групите на пътя по -късно.
В app/urls.py добавете ред след операторите за импортиране след началото на импортирането на изгледа, който току -що създадохме.
from feed import views as feed_views
Сега, нека дефинираме модела на изглед. 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 = [раздел на APP/urls.py. Моделът на изглед е дефиниран с трите компонента, описани по -горе, и функция, наречена път. Вашите URL модели са списък, така че не забравяйте винаги да завършите всеки елемент в тях със запетая, защото това разделя всеки от тях. Всеки елемент също трябва да премине на нов ред, отново с четири интервали преди него, точно като приложението в Settings.py. Ще дефинираме първия компонент на изгледа с функция за празен низ, за да създадем изглед, който работи в основната директория на уеб сървъра. Вашите URL адреси сега трябва да изглеждат така:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Това е основата за създаване на уебсайт с Django, който е напълно статичен. За да направим по -динамичен уебсайт, където можем да започнем кеширане на информация, като изображения, видеоклипове, аудио и други, ще трябва да използваме модели, които ще проучим по -нататък. Засега нека да проверим нашия код и да стартираме сървъра. За да проверите кода за грешки, стартирайте:
python manage.py check
Ако има някакви съобщения за грешки, трябва внимателно да прегледате промените, които сте направили в приложението си, и да видите дали има нещо, което трябва да бъде фиксирано, като външно или липсващо пространство, допълнителен символ, незабранен низ, всяка печатна грешка, случайно изтрит характер или нещо друго. Четейки съобщението за грешка (ако имате такова), трябва да можете да видите пътя към файл, който сте създали или редактирали заедно с номер на ред, така че разгледайте този файл и ред и вижте дали можете да поправите нещо, което е там. Ако сте отстранили проблема, изпълнете горната команда отново. Когато вашият софтуер е готов за стартиране и работи, ще видите изхода „Системна проверка не идентифицира никакви проблеми". Сега сте готови да тръгнете. Изпълнете сървъра с:
python manage.py runserver 0.0.0.0:8000
Сега отворете уеб браузър и отворете до http: // localhost: 8000. Трябва да видите текста, върнат в скобите и цитатите на функцията HTTPRESPONSE във вашия изглед. Това е само основен пример, но ако сте го направили досега, вие разбирате основите на това как работят Linux, Bash, Python и Django. Нека се попуснем по -дълбоко в някои моделиране на бази данни и да проучим силата на клас Python в съхранението на информация. След това ще започнем да се захващаме за HTML и CSS, преди да направим нашия сайт напълно представен, гъвкав и сигурен, използвайки JavaScript и машинно обучение.
Класовете се съхраняват в моделите.py на вашето приложение. Използвайки nano, редактирайте app/models.py и добавете нов клас. Клас е дефиниран с дефиницията на класа и се предава суперклас, от който наследява, в този случай модели.model. Името на класа идва след дефиницията на класа и след дефиницията на класа A: (дебелото черво) се използва, преди атрибутите и дефинициите на функциите, свързани с класа, са обозначени по -долу. Нашият клас се нуждае от идентификатор, който можем да използваме, за да го извлечем и да го поддържаме уникален, а също така се нуждае от текстово поле, за да съхранява някаква информация. По -късно можем да добавим времева марка, файлове, булеви (истински или неверни дефиниции, които могат да помогнат на нашия код да вземе решения за това какво да правим с модела и може да се използва за сортирането му), екземпляр за свързване на модела с потребител, в който се вписва в сървъра и други. Нека разопаковаме кода по -долу:
from django.db import models # Вносът, който се използва за определяне на нашия клас и атрибути
class Post(models.Model): # Определението на самия ни клас
id = models.AutoField(primary_key=True) # Идентификационният номер на нашия модел, автоматично генериран ключ, който ще ни позволи да запитваме модела, да го поддържаме уникален и е полезен, когато трябва да взаимодействаме с модела, след като бъде създаден.
text = models.TextField(default='') # Атрибутът на нашия клас магазини в този случай някакъв текст, който се подразбира към празен низ.
Затворете и запазете файла както преди, за да завършим.
Има много други полета и опции, които ще проучим, когато актуализираме този клас с развитието на нашето приложение, но това е основната необходимост от създаването на приложение за публикуване на някакъв текст. Този модел обаче няма да работи сам. Както беше описано по -горе, ще се нуждаем от персонализиран изглед и персонализиран URL модел, за да работим този модел, а също така ще се нуждаем от формуляр заедно с шаблон. Нека първо да проучим формата.
За да дефинирате формуляр, редактирайте App/Forms.py с Nano и добавете следните редове. Ще ни трябват два вноса, нашия клас форми, както и създадения от нас модел (feed.models.post), дефиниция на клас, подобна на модела, и поле, заедно с подклас, наречен Meta, който ще определи модела, с който формата взаимодейства. Формулярът може също да има функция за инициализация, която я настройва въз основа на информация в заявката, модела или по друг начин, ще проучим това по -късно.
Моделните форми са толкова полезни, защото могат да създадат модел или също така да редактират модел, така че ще ги използваме и за двете. Нека дефинираме един във форми.py по -долу.
from django import forms
from feed.models import Post
class PostForm(forms.ModelForm):
text = forms.CharField(widget=forms.Textarea)
class Meta:
model = Post
fields = ('text',)
Това са основите на това как изглеждат форма и модел. Тази форма на модела може да се използва за инсталиране или редактиране на публикация, промяна на текста, който съдържа. Ще разгледаме интегрирането на тази форма в изглед след това. Първо, нека да направим миграциите и да мигрираме базата данни, така че нашият код да може да взаимодейства с модела, когато работи. За да направите това, изпълнете следните команди:
python manage.py makemigrations
python manage.py migrate
Това ще отнеме минута за изпълнение, но след като го направи, ще ви позволи да получите достъп до модела в изгледите, междинния софтуер или където и да е другаде в софтуера. Нека продължим, като направим мнение къде можем да видим нашия модел. Редактиране на feed/views.py и добавете следния код, както е отбелязано. Няма да е необходимо да добавяте нищо след знака #, този код е коментари, които се използват за обозначаване на информация за кода. Ще започнем с импортирането на нашия модел в изгледите и го добавяме към контекст, в който можем да го направим в шаблон като списък за дисплей. След това ще добавим шаблон, където можем да изобразяваме формата и модела с бутон, за да създадем нов обект въз основа на модела и да го публикуваме на сървъра. Това звучи сложно, така че нека просто го направим стъпка по стъпка. Преди да приключим с изгледа, нека създадем шаблон, който просто прави модела и се уверете, че можем да го видим, като създадем нова публикация в черупката. Ето как трябва да изглежда тази гледка:
posts = Post.objects.all() # Попитайте всички публикации в базата данни досега
Всичко това изглежда доста просто, докато стигнем до дъното. Рендера, стойността, върната от функцията, вместо в HTTP отговор като предишния пример, винаги приема заявка като първи вход, приема контекст (в този случай публикациите в базата данни), които вече могат да бъдат представени в шаблона, и връща шаблона, дефиниран във функцията. Шаблонът ще бъде HTML документ с малко език, наречен Jinja2, който прави Python информация в HTML.
За да започнете да създавате шаблони, направете две директории в емисия.
mkdir feed/templates
mkdir feed/templates/feed
След това редактирайте шаблон в директорията по -горе, захранване/шаблони/подаване и добавете кода за този пример. Нека разгледаме шаблона за този пример.
Това е много прост шаблон. Той дефинира отваряне и затваряне на HTML маркери, маркер за тип документ, етикет на тялото със заглавие на легендата, маркер за почивка, който добавя малък ред през екрана и за цикъл, който прави всяка публикация в списъка с публикации като параграф в шаблона. Това е всичко, което е необходимо за представяне на публикации, но все още няма такива в базата данни. Нека създадем някои с черупката. Можем да стартираме черупката с manage.py
python manage.py shell
Сега, нека импортираме нашия пост модел
from feed.models import Post
След това ще създадем проста публикация със низ и ще излезем от черупката. Низът може да бъде всичко, стига да е валиден текст.
Post.objects.create(text='hello world')
exit()
И накрая, ще трябва да добавим URL модел към нашата емисия. Тъй като нашето приложение за емисия ще използва множество URL адреси и ние искаме да запазим размерите на файловете малки, нека създадем локални URL адреси в нашето приложение за емисия, което изглежда така:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Също така ще трябва да редактираме urls.py в базовото приложение, каквото и да решихме да го наречем, това беше първата директория, която създадохме. Редактиране на app/app.py и добавете следното към моделите на URL адреса
from django.urls import include # на върха
# ... Предишен код тук
Сега, когато стартираме сървъра с python manage.py runserver, ще видим страницата, която създадохме, защото имаме модел, изглед и шаблон, както и модел на URL, заедно с елементи в базата данни. На следващо място, нека приложим формуляра, който създадохме и да започнем да създаваме свои публикации. Но преди да напишем твърде много код, нека направим резервно копие, използвайки скрипта, който написахме по -рано, архивиране. Стартирайте този скрипт в черупката, изчакайте няколко мига и целият код ще бъде подкрепен до нашето хранилище Git.
backup
Прилагането на формата е сравнително просто. Ние ще импортираме нашия формуляр, ще добавим обработващ на POST заявка към изгледа и ще запазим публикацията в базата данни, преди да пренасочим към същия изглед. Можем да използваме функцията за пренасочване, която вече сме импортирали, и друга функция, наречена обратна, за да получим URL адреса за модела на изглед. Ще се запитаме това с низа „Feed: Feed", тъй като пространството от имена на включения модел е подаване, а изгледът се нарича също емисия.
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 документ, използваме таг за шаблон ({ %… %}), за да направим маркера за формата и друг, {{…}}, за да изобразяваме формата. Имаме и цикъл, за да изобразяваме текста, използвайки блокови маркери и маркер за шаблон. Блоковите маркери са наистина важни, защото можем да определим как се представят секции от шаблона, а маркерите за шаблони са в основата на това как поставяме променливи в нашия код.
Сега трябва да направим приложението ни да изглежда по -добре, защото засега изглежда наистина основно. Можем да направим това, като използваме CSS, вградени или в класове, свързани с всеки обект в документа. CSS е наистина хубав, защото разказва всичко на страницата как трябва да изглежда и може да изглежда наистина добре. Има няколко библиотеки, които могат да направят това, но моят личен ход е Bootstrap.
Bootstrap може да бъде изтеглен от уебсайта им,getBootstrap.com/. Веднъж там, натиснете бутона, за да прочетете инсталационните документи, и копирайте кода от секцията CCDN чрез CDN. Ще ви е необходим този код в горната част на вашия HTML документ, в маркер, наречен Head. Също така, нека продължим напред и да създадем базов шаблон, така че няма нужда да пресъздаваме тези връзки във всеки шаблон.
Направете нова директория, наречена шаблони с шаблони MKDIR, и след това редактирайте шаблони/base.html.
Трябва да изглежда така:
Не забравяйте да копирате CSS и JavaScript, .css и .js файлове, защото ще се нуждаем от JavaScript, за да направим нашия сайт по -функционален в бъдеще.
Сега, нека да се върнем към черупката на Bash и да изпълним бърза команда. Не забравяйте, че ако някога трябва да получите достъп до виртуалната среда, въведете източник Venv/Bin/Activate. Това ще ви позволи да инсталирате Python пакети локално по начин, който позволява на Django да има достъп до тях. За да дадем нашите формуляри, генерирани от класовете за Bootstrap Django, ще използваме пакет Python, наречен Crispy Forms. Можем да изтеглим това със следната команда
pip install django-crispy-forms
След като това е инсталирано, добавете го към настройките.py
# ... Предишен код тук
Сега, обратно в нашия шаблон за емисия, можем да премахнем някои неща. Нека премахнем началото и края на документа и го заменим с наследство от нашия базов шаблон, използвайки разширения и дефиницията на блока. Също така, ние ще добавим импортиране на шаблон за натоварване и филтър за шаблон към формата. И накрая, нека добавим клас за зареждане към бутона във формата, за да изглежда по -скоро като бутон. Това трябва да изглежда така:
Красиво! Това вече е доста код. След това трябва да го тестваме и да се уверим, че можем да видим, че всичко изглежда добре, а също така сме сигурни, че всичко работи правилно. Стартирайте сървъра според предишните инструкции и се уверете, че сайтът изглежда и работи добре. Страхотна работа! Готови сте да преминете към следващата стъпка, в която ще добавим функционалност за влизане на потребителите, използвайки подобни URL адреси, формуляри, изгледи и шаблони. Основният шаблон е важен и ние ще продължим да го променяме и да правим промени според нуждите, но засега нека се съсредоточим върху това да направим нашия сайт по -сигурен, като позволим на потребителите да влязат с потребителско име и парола и в крайна сметка още по -важна информация, която ще ви помогне да запазите приложението ви и собствената ви сметка достъпна само от вас.
За да направим това, ще трябва да използваме потребителския модел, вграден в Django. Потребителският модел е модел на база данни, като нашата публикация, който може да бъде представен за регистрация на потребител в уебсайта. В бъдеще, преди да внедрим сайта в Интернет, ще разширим този модел с други модели, приписани му и ще изградим допълнителни мерки за сигурност за вход, които са устойчиви на фишинг. Ще започнем с използването на някои вградени форми за вход, които Django предоставя. Първо, нека създадем ново приложение, което ще използваме, за да изобразяваме шаблоните и изгледите за основната страница за влизане. Ще създадем и други приложения, които да представяме непрекъснатите предизвикателства за вход, за да осигурим приложението, включително Pincode, разпознаване на лицето, близо до комуникация на полето, външни устройства, много факторна удостоверяване и разпознаване на пръстови отпечатъци.
Вече говорихме за стартиране на приложение. От нашата директория, във виртуалната среда, Pass Manage.py Тези аргументи
python manage.py startapp users
Сега трябва да имаме директория за новото приложение. Нека започнем с създаването на изглед в тази директория, която съответства на входът на потребителя. Django е вградил изгледи за потребителски влизания, но те няма да са подходящи за нас, защото се нуждаем от персонализиран изглед, който за предпочитане е направен с определение.
В този изглед ще започнем с проверка за заявка за публикация, pass request.post в loginform, импортиран от django, удостоверява потребителския акаунт и влезете в потребителя, преди да ги пренасочите към нашето приложение за емисия.
В потребители/views.py добавете следния код
username = request.POST['username'] # Вземете потребителското име и паролата от заявката за публикация
password = request.POST['password'] # Удостоверяване на потребителя
Това е всичко, от което се нуждаете за основен изглед на вход. Сега, нека създадем форма за изгледа, като разширим основния шаблон. Ще започнем с създаването на нова директория за шаблони в папката на потребителите.
mkdir users/templates
mkdir users/templates/users
Сега трябва да можем да редактираме потребители/шаблони/потребители/login.html. Докато сме на това, ще създадем шаблон, който да позволи и на потребителя да се регистрира.
nano users/templates/users/login.html
Сега, в шаблона,
Това са основите на шаблон за вход. Наистина е точно като другия шаблон в структурата, но изглежда малко по -различен, когато е представен. Можем да копираме този код, за да изградим друг много подобен шаблон, наречен Register.html, където ще променим формулировката и ще използваме нова форма, която изграждаме. Нека първо направим шаблона. Редактиране на потребители/шаблони/потребители/register.html и добавете следния код:
Сега, нека изградим формуляр за нашата регистрация на потребители и да се върнем обратно към изгледите, преди да надстроим нашите потребителски влизания с модел. Ще направим този формуляр основен за начало, но в бъдеще ще включим повече подробности и функции за сигурност като споразумения и Captcha. Редактирайте формулярите с Nano потребители/формуляри.py и добавете следния код.
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
Така че тук имаме друга форма, която работи доста просто. Това е формуляр за регистриране на потребител с потребителско име, имейл и парола, както и поле за потвърждение на парола. Обърнете внимание, че този формуляр не разширява редовния клас. Формата, това е моделна форма, което означава, че има мета. Едно поле е дефинирано точно същото и класът на класа определя модела, който формата съответства на останалата част от информацията, която ще бъде написана във формата. По -голямата част от това вече съществува в изграденото в Django в потребителско създаване, така че ще използваме това като основа за класа (преминат в скобите).
След това ще разгледаме изгледа, за да регистрираме потребител, сега, когато имаме формуляр и шаблон. Това е Modelform, точно като този в новия изглед на публикацията. Редактиране на потребители/views.py и добавете следния код:
# … Внос
Това е всичко, което трябва да се регистрираме потребител, но трябва да имаме повече информация. Искаме да знаем времето, когато потребителят се е регистрирал, по кое време е последно на сайта, малко информация за тях, като биография, часова зона и т.н. Също така, ще трябва да актуализираме нашия модел на емисия, публикуване, за да отчитаме потребителския модел и публикации на атрибути на всеки потребител. За да направим това, ще актуализираме models.py и в двете приложения. Нека започнем с редактирането на модела на емисиите. Сега трябва да изглежда така:
from django.db import models # … Внос
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Добавете в този ред
Обърнете внимание на втория ред, който беше добавен към файла. Това е чужд ключ, който ще приписва всяка публикация на един потребител на публикация, така че можем да се уверим, че запазваме публикациите на база потребител на потребител и не може да се направи публикация, без да го приписваме на потребител. Ние дефинираме този чуждестранен ключ с класа, който представлява, изтривайки аргумент, за да гарантираме, че публикациите се изтриват с потребители, нулеви и празни аргументи, за да сме сигурни, че можем да премахнем потребителя, ако е необходимо, и да се съобразим с липсата на потребител на публикации, които вече създадоха, и свързано име, което можем да използваме, за да се отнасяме към публикационните обекти, които потребителите създават. Това свързано име, за разлика от post.author, авторът на публикацията, ни дава потребител, който публикува самата публикация. Вече можем да получим публикациите, направен от потребителя, като стартира user.posts.all () или author.posts.all ().
Сега, нека направим нашите вход по -устойчиви. Вече можем да направим нашия сайт много по -малко уязвим за фишинг, като просто оценяваме броя пъти, когато ще разрешим вход към сайта, това е доста лесно. Нека също така да започнем да съхраняваме информация за всеки потребител преди, докато продължаваме да разработваме нашето приложение. Редактиране на потребители/models.py, добавете следния код.
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
account_created = models.DateTimeField(default=timezone.now)
last_seen = models.DateTimeField(default=timezone.now)
can_login = models.DateTimeField(default=timezone.now)
preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
bio = models.TextField(blank=True, default='')
Обърнете внимание, че този модел е доста подобен на Post модела. Имаме допълнителен импорт, TimeZone, който ще ни позволи да зададем по подразбиране на полетата DateTime, а също така имаме също така характер на SearchFeild и TextField като публикацията. Използването на всички тези времеви марки ни помага да осигурим сайта и да разберем използването му, а текстовите полета ни позволяват да предоставяме информация за всеки потребител или автор на уебсайта. Onetoonefield трябва да бъде единственото незначително съображение, тя се държи точно същото като предния ключ, но само с един на следващ модел. По този начин потребителят има само един профил, докато може да има много публикации.
Сега, нека подобрим нашите изгледи за влизане и регистриране, за да отчитаме профила. Първо, редактирайте потребители/views.py и се съсредоточете върху изгледа на регистъра:
# … Внос
Profile.objects.create(user=user) # Не забравяйте да добавите този ред, за да създадете профил за потребителя
Това просто създава профил за потребителя, без да попълва нито една от информацията. Сега искаме да се уверим, че потребителският акаунт не може да бъде регистриран твърде често или поне паролите не могат да се изпробват твърде често, така че нека актуализираме изгледа за вход.
# … Внос
if user and user.profile.can_login < timezone.now(): # Обърнете внимание, че сега проверяваме дали потребителят може да влезе
else: # Ако входът не беше успешен,
user = User.objects.filter(username=username).first() # Това е частта, в която актуализираме потребителския профил
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Така че те не могат да влязат отново за няколко секунди
Това е основната основна сигурност. Уверете се, че сайтът не е уязвим за някой, който просто изпробва всяка възможна комбинация от пароли или дори няколко от тях едновременно. Това няма да е разочароващо за обикновения потребител, който познава своя парола и просто влиза в няколко устройства, но ще предпази многобройните фишинг роботи извън приложението. Обърнете внимание, че добавихме оператор IF с променлива, can_login, това трябва да е време в миналото и да го актуализираме с всяко неуспешно влизане, използвайки едно и също потребителско име. По този начин злонамерен потребител няма да може да гадае парола никъде близо до толкова бързо. Броят на секундите в DateTime.TimedElta () може да се актуализира също и уебсайтът ще бъде по -устойчив, но малко по -малко използваем с повече секунди. Препоръчвам 15 да започнете с.
Не забравяйте, че ние изградихме резервен сценарий, за да спасим работата си, така че нека да продължим напред и да подкрепим това, което имаме досега, за да сме сигурни, че всичко е спестено. Изпълнете командата:
sudo backup
За пореден път това ще спести работата ви досега. Препоръчвам да стартирате чести резервни копия, за да запазите работата си и дори може да искате автоматично да стартирате резервна работа. Можете да направите това с помощта на UNIX помощна програма, наречена Cron. За да активирате тази помощна програма, стартирайте следната команда и въведете паролата си:
sudo crontab -e
Ако все още не сте избрали опция 1 за Nano, текстовият редактор, с който вече трябва да сте запознати, и превъртете в долната част на файла, като използвате клавишите със стрелки. Добавете следния ред:
0 * * * * sudo backup
Cron използва формата минута, час, ден на месец, месец, ден от седмицата, където * или номер представлява кога да стартирате командата. Използвайки 0 за минута и * за останалите опции, можем да изпълним команда в първата минута на всеки час в началото на минутата. Това ни позволява да архивираме кода автоматично. Всички работни места на Cron, когато се изпълняват с Sudo, работи като Root, така че няма да е необходимо да въвеждаме парола на всеки час.
За да улесним архивирането на нашия код, без да използваме парола, нека деактивираме паролата за нашата команда за архивиране. Ще направим това, като изпълним следната команда и ще въведем парола:
sudo visudo
Сега, нека превърнем в долната част на файла и да добавим друг ред:
ALL ALL=NOPASSWD: /bin/backup
Това ни позволява да стартираме командата "архивиране" като всеки потребител, без парола. Форматът за това е лесен, просто префиксирайте реда с "All = nopasswd:/bin/" и завършете с командата, например/bin/backup, който съществува в/usr/bin/.
Сега, нека започнем да работим с имейл. Имейлът е наистина важен за уебсайтовете, тъй като това е начин да поддържате уебсайт по -сигурен, да проверите потребителите са истински хора и дори пазарни продукти или услуги на клиентите. Много хора, които често посещават интернет, проверяват имейла си всеки ден и получават всякакви маркетингови имейли за продукти и услуги, от които се интересуват. Има няколко опции, когато става въпрос за активиране на имейл на уебсайта на Django, и сте добре дошли да изберете кой да работи най -добре за вас.
Първо, можете да платите за имейл услуга, която ще ви позволи да изпращате имейл от вашия домейн и изисква минимален код. Има много услуги, които предлагат това, като Google Workspace, SendInblue, Mailgun и други.
В противен случай вие сте добре да изградите своя собствена имейл услуга във вашия сървър от нулата. Препоръчвам тази опция, въпреки че е повече код и може да изисква специален хостинг. Най -вероятно няма да можете да стартирате пощенски сървър от домашния си компютър, така че нека продължим напред и да разгледаме конфигурацията и кода за изпращане на имейл, преди да стартираме сървър в облака и да създадем собствен пощенски сървър в рамките на.
Първо, редактиране на настройки.py със следната команда:
nano app/settings.py
Където приложението е името на приложението, което сте създали с StartApp.
Добавете следните редове:
SITE_NAME = 'Django App'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = username@server.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
Не забравяйте да ги промените, когато сте готови да разгърнете приложението си, ние ще преразгледаме това по -късно. Настройката за електронна поща_address трябва да бъде имейла, от който искате да изпратите, а паролата (email_host_password) трябва да бъде зададена на паролата, която генерирате за сървъра. Зареждам паролата от конфигурационен файл, за да я предпазя от кода, използвайки следната логика, над тези редове в Settings.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
След това съм настроил JSON файл с config in /etc/config.json, използвайки nano, както следва.
За редактиране на файла:
sudo nano /etc/config.json
Добавете следните редове:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Ще продължим да редактираме конфигурационния файл и ще добавим всички пароли и клавиши, които ще използваме в приложението. Засега нека разгледаме бързо как да изпращаме имейл с помощта на Python. Първо, нека създадем шаблон за имейл за проверка, който можем да изпратим на нашите потребители, и да го поставим в директорията на шаблоните на потребителите. Този шаблон ще бъде написан в HTML.
nano users/templates/users/verification_email.html
Този имейл е доста прост. Той отнема контекст на потребител, базовия URL за сайта и потребителски идентификатор и маркер, които се използват за проверка на имейла на потребителя. Уверете се, че дефинирате основния URL адрес в Settings.py, преди да напишем някакъв код на Python, за да направим шаблона. Продължете напред и добавете следните редове към App/Settings.py, близо до началото.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
В крайна сметка, когато вашият сайт е готов за интернет и го разгърнете, ще искате да определите вашия домейн като името на домейна, което купувате, за да представите сайта. Това е името, което ще въведете в Navbar, за да получите достъп до вашия сайт. Засега можете да оставите домейна празен или да използвате заместител. Вие също ще искате да промените името на сайта на име, което искате да дадете на вашия сайт, по ваш избор.
Преди да изпратим имейл, нека създадем генератор на маркери, за да можем да имаме маркер за активиране на акаунта, който никога не изтича. Можем да направим това, като изградим и импортираме маркер за активиране на акаунта, който изглежда като следното. Редактирайте файла:
nano users/tokens.py
Добавете следния код:
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) + six.text_type(timestamp)
)
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
Този основен генератор на маркери генерира маркер, който можем да изпратим на потребителя в URL адрес и потребителят може да използва, за да провери имейла си и да активира акаунта си.
На следващо място, нека да видим как да изпратим имейл. Използвайки Nano, редактирайте потребители/email.py.
nano users/email.py
Изпращането на проверката HTML имейл ще изглежда така:
from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback
def send_verification_email(user):
User = get_user_model()
mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
html_message = render_to_string('users/verification_email.html', {
'user': user,
'domain': settings.DOMAIN,
'protocol': 'https',
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
send_html_email(user, mail_subject, html_message)
Това е доста просто. Импортираме функциите, от които се нуждаем, за да изпращаме имейла, да правим имейла с шаблони и нашите настройки, а след това определяме имейла по името на шаблона и го изпращаме на потребителя, използвайки функция. Ще забележите, че не сме дефинирали функцията за изпращане на пощата, 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
# ...
След това нека добавим функции към потребителския модел, за да направим жетона и да проверим маркера, използван за активиране на имейла, както и полето, за да запази дали потребителят успешно получава пощата си. В потребители/models.py отново добавете следния код в края на модела (отстъпен код)
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Валиден за 30 дни
Това е доста просто, ние използваме TimestAmpsigner, който е основен инструмент за криптография, за да създадем маркер, който да изтече след определен период от време, а също така използваме друга функция, за да проверим дали е валидна. Използваме тези жетони два пъти, веднъж, за да проверим имейла и веднъж за връзка за отписване.
Сега, когато имаме тези, последната от работата, която ще трябва да свършим, е в гледките. В рамките на потребители/изгледи.py, нека добавим изгледи, за да проверим имейл адреса и да се отпишете.
nano users/views.py
Първо, добавете следния внос. Хвърлих няколко допълнителни, така че няма да се налага да импортираме повече елементи отново по -късно.
from .email import send_verification_email # Уверете се, че импортирате функцията за изпращане на имейл за проверка
Може би вече имате някои от тези вноси, но не боли да ги повторите. Ще трябва да импортирате функцията за изпращане на имейл за проверка, както и account_activation_token от users.tokens, наред с други вноси.
Сега, в долната част на файла, добавете следния код:
# Отпишете ги
# В противен случай пренасочване към страницата за влизане
# SendWelcomeMail (заявка, потребител)
Това е много код. Нека го разбием. Първата функция, чиста и проста, отписва потребителя от списъка с пощенски пощенски. Втората функция активира имейла им и ще забележите, че добавих коментирана функция, SendWelcomeMail. Добре дошли сте да използвате шаблон за имейл и дефиниция на функция, за да изпратите имейл за добре дошли, просто все още не съм. Последната функция, която хвърлих, е важна, защото изтичането на имейлите за активиране изтича. Следователно, ще трябва да преиздадем имейл на имейл за активиране известно време. Можем да използваме основен формуляр за това и да се обадим на функцията, за да изпратим имейла за проверка. Преди да направим това, нека се уверим, че той се изпраща на първо място, като добавим функция обаждане към изгледа на регистъра. Добавете този ред точно преди пренасочването в изгледа на регистъра, DEF регистър, в потребители/изгледи.py.
nano users/views.py
# ... (след) DEF регистър (заявка):
# ... (преди) пренасочване (
Не е необходимо да добавяте първия и последния ред в този фрагмент на код, просто се уверете, че изгледът на регистъра изпраща имейла за проверка на потребителя. Трябва да изглежда така:
# … Внос
send_verification_email(user) # Не забравяйте да добавите този ред!
Сега ще трябва да добавим формуляр, за да повдигнем имейл за активиране. В потребители/форми.py, добавете следната форма:
# ... (Внос)
Ще се нуждаем и от шаблон, съответстващ на този формуляр за активиране на имейл. Нека добавим този шаблон. Редактирайте файла:
nano users/templates/users/resend_activation.html
След това добавете следния код към файла.
Уау, това е много! Сега, когато разгърнем кода на нашия сървър, ще можем да изпращаме 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 Unsubscribe Link. Те са важни, но не искаме да ги определяме два пъти.
И така, какво следва? Изминахме дълъг път. Наистина, трябва да сме готови да разгърнем сайта на сървър. Можем да добавим декоратора @Login_Required и да направим нашите изгледи сигурни, да вземем регистрации на потребители, да изпращаме съвместим имейл и да кеширате информация, което е основата на това, което трябва да направи уебсайтът, за да бъде подходящ. Ще добавим още няколко полезни функции и след това ще изградим основа за внедряване на кода си на отдалечен сървър, настройка на пощенски сървър, конфигурация на домейни и филтри, за да направим нашия сайт сигурен и подходящ.
Ще се нуждаем и от изглед за нулиране на парола, така че нека добавим това в наистина бързо. Вграденият изглед на паролата на Django е нарушен в някои функции, но ще разгледаме как да напишем собствения си изглед, шаблон за имейл, формуляри и модели на URL адреси. Ето как изглежда изгледът, в потребители/изгледи.py
# ... Внос
Този формуляр е вграден в Django, но ще се нуждаем от шаблон, за да потвърдим нулирането на паролата, потребители/шаблони/потребители/password_reset_confirm.html
Имаме и шаблон за изпращане на имейл за нулиране на парола, с прост формуляр, в потребители/шаблони/потребители/password_reset.html
Шаблонът за самия имейл е прост, той е основен HTML файл, който прави връзка за нулиране на паролата, в потребители/шаблони/потребители/password_reset_email.html. Django автоматично ще интерпретира този файл.
Ще се нуждаем и от още два шаблона. Първият е да се потвърди, че имейлът е изпратен. Гледките за тях вече са в Django, така че просто трябва да се обърнем към тях в URLL.py. Този шаблон се намира на потребители/шаблони/потребители/password_reset_done.html
И последно, за да потвърдите, че нулирането на паролата е завършено, потребители/шаблони/потребители/password_reset_complete.html
Сега имаме нужда от модели на URL за тези изгледи. В потребители/urls.py добавете следните модели на URL адреса:
# ... Предишни URL адреси тук
Четири шаблона, това е много! Но сега можем да сме сигурни, че ще можем да нулираме паролата на потребителя по всяко време, когато трябва, всичко това от уеб браузъра.
Разбирам, че това е много код. Ако ви се струва малко над главата ви, това е добре. Ще се подобрите, разбирането ви ще се подобри и много по -скоро ще станете много по -компетентни с кода. Ако сте напълно изгубени, препоръчвам да се върнете към този софтуер по-късно, след като работите върху самостоятелно обучение, научете се да кодирате курс онлайн. Те обикновено са безплатни, за да започнете и ще ви преведе през всичко необходимо, за да постигнете успех, когато се върнете към този проект. Ако почувствате, че сте готови да продължите, прочетете нататък, ние ще покрием внедряването на вашия код на отдалечен сървър и настройка на пощенски сървър, както и автоматизиране на вашето внедряване с помощта на BASH, така че винаги можете да настроите нов проект с няколко прости команди.
Последното нещо, което трябва да направим, преди да внедрим на отдалечен сървър, е да направим нашия сайт малко по -сигурен. Ще забележите, че изгледът за вход отнема само потребителско име и парола и няма много факторна удостоверяване или един времеви код. Това е лесна поправка и със същия код можем да накараме нашия сайт да изпраща текстови съобщения и дори да отчитате текстови съобщения, изпратени до сървъра. За начало ще се върнем обратно в потребителските модели и ще добавим подписващ отдел, който ще представлява всеки вход. Ще добавим и уникален, въртящ се идентификатор към потребителския модел, който ще бъде използван за добавяне на допълнителна сигурност към нашето влизане. Редактиране на потребителските модели, потребители/models.py, добавете следния код:
# Уверете се, че импортирате UUID, подписващия и URL генератор (обратна)
# Добавете този код тук
# И добавете тази функция
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Валидно за 3 минути
Уверете се, че вашите потребители/models.py изглежда така, освен коментарите (код в редовете с #). Разбиването на това е просто. Имаме няколко вноса, TimestAmpsigner, който е криптографска помощ, която може да генерира защитен код и да го провери, за да се уверите, че е валиден, използван само веднъж и не по -стар от определен брой секунди. Използваме и UUID, който е уникален идентификатор, който идентифицира нашия потребител при подписването на маркера, и в URL адреса, където маркерът се изпраща на потребителя. Ще използваме тази основна криптография, за да изградим изглед на автентификация на два фактора. Преди да направим нещо друго, нека стартираме миграциите, така че нашите потребителски модели да бъдат актуализирани. В директорията с manage.py изпълнете следните команди, за да направите и завършите миграциите.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Това е важно, защото всеки път, когато правим промени в моделите, ще трябва да създадем таблиците и да актуализираме базата данни с по подразбиране, преди да можем всъщност да използваме моделите.
На следващо място, нека импровизираме нашия изглед на вход, за да пренасочим към вторичен изглед на удостоверяване. В потребители/изгледи.py премахнете функцията за вход и пренасочете към URL адреса, който току -що генерирахме в потребителските модели.
# … Внос
if user and user.profile.can_login < timezone.now(): # Обърнете внимание, че сега проверяваме дали потребителят може да влезе
# Премахнете функцията Auth_login, която беше тук
return redirect(user.profile.create_auth_url()) # Забележете, че тук пренасочваме към нов URL адрес
else: # Ако потребителят не използва многофакторна автентификация, просто ги влезте.
else: # Ако входът не беше успешен,
user = User.objects.filter(username=username).first() # Това е частта, в която актуализираме потребителския профил
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Така че те не могат да влязат отново за няколко секунди
Така че това е доста просто, сега имаме начин да пренасочим към изгледа на автентификацията на двата фактора, когато го създаваме. Имаме и резервен, в случай че потребителят не е добавил телефонен номер. Скоро ще добавим основен изглед, за да добавим телефонен номер и да влезем с текстово съобщение.
Първо, имаме нужда от лесен начин да изпратим текстово съобщение от нашия код. За да направим това, можем да избираме от редица API, но най -лесното според мен е Twilio. Те също предлагат добри цени за по -малки проекти, както и групови отстъпки. Създайте акаунт на twilio.com, попълнете някои подробности за вашия проект, купете телефонен номер и копирайте своите API ключове във вашите настройки.py. След това добавете този код под нов файл, потребители/sms.py.
nano users/sms.py
# Импортирайте всички необходими пакети
# Този код изпраща текста с Twilio
# Помощна функция за получаване на номер с толкова много цифри
# Изпратете текста, за да потвърдите потребителя
# Изпратете потребител всеки текст с тази функция
# Валидирайте кода с тази функция
# Валидирайте времето
Не забравяйте да промените настройките си по подходящ начин, като добавите тези редове с вашите клавиши:
# Не забравяйте да ги копирате от таблото за управление на Twilio
AUTH_VALID_MINUTES = 3 # Броят на минути, на която страницата TFA е активна, след като бъде инстанцирана
Първо, ще ни трябват формуляри за нашите два факторни изгледи за удостоверяване. Редактиране на потребители/форми.py, добавете следния код.
# … Внос
# Формуляр за въвеждане на нашия телефонен номер
# Форма за удостоверяване
На следващо място, нека създадем изгледи в потребители/изгледи.py
# … Внос
Ще ни трябват и шаблони и за двете гледки. Нека първо добавим шаблона на MFA.
nano users/templates/users/mfa.html
Добавете този HTML код към шаблона
Това е доста обяснително. Формулярът изпраща или код, или празен код и ще забележите в изгледа, изпращаме кода, ако получим празен код. След това просто имаме два бутона за изпращане и по този начин можем да изпратим кода с двата бутона. След това ще добавим прост формуляр за добавяне на телефонен номер.
nano users/templates/users/mfa_onboarding.html
Добавете следното HTML:
Този формуляр е много по -проста, той просто прави формуляра за телефонен номер, който създадохме и позволява на потребителя да добави телефонен номер.
Това изглежда наистина добре! Докато всичко е настроено правилно, трябва да можем да изпращаме съобщения и да регистрираме потребителя с техния телефонен номер веднага щом добавим моделите на URL адреса. Последното нещо, което трябва да настроим, е изглед на профил, за да можем да се уверим, че потребителят може да промени телефонния си номер, без да бъде влязъл в вход. Освен това, в крайна сметка ще искаме да добавим опция „Стоп, за да се откажеш", така че потребителят може да изпрати текстово „Стоп", за да се откаже от бъдещите текстови съобщения.
Нека добавим изглед на профил към потребителите/изглед.py. Този изглед ще актуализира биото, имейл, потребителско име и телефонен номер на потребителя, както и ще ни позволи да активираме многократно удостоверяване. Първо, ще ни трябват още две форми в потребители/формуляри.py
# ... Внос
След това можем да създадем изглед, за да използваме и двете форми. Редактиране на потребители/views.py и добавете в изгледа.
# Добавете тези вноси
Ще се нуждаем и от шаблон за този изглед.
nano users/templates/users/profile.html
Ще забележите, че това е доста проста форма, но в него има някакъв JavaScript, който автоматично публикува съдържанието на формата, тъй като те се актуализират. Това е полезно да имате, така че можете да правите редакции, без да се налага да натискате изпращане всеки път.
След това се нуждаем от URL адреси, представляващи всички тези изгледи в потребителите URL Patchs. Редактиране на потребители/urls.py и добавете този код:
# … Предишен код, внос
# ... URL модели, които по -рано въведохме, добавете следващите три реда
Сега е подходящ момент да тестваме нашия проект. Но първо, нека стартираме още един резервен.
backup
И стартирайте сървъра. Преди да се разгърнем на Linux сървър, е добра идея да активирате два факторни удостоверяване на акаунта. Ще направим това, ще бъдем в нашия URL адрес на профила,/Потребители/Профил/, и да проверим полето, за да активираме удостоверяване след въвеждане на нашия телефонен номер и след това да изпратим формуляра.
python manage.py runserver localhost:8000
Посетете уеб страницата, като отидете до вашия уеб браузър, използвам Google Chrome в този пример и въвеждам URL https: // localhost: 8000/акаунти/профил/профил/профил/профил/профил/профил/профил
Ще можете да влезете, ако е необходимо и да активирате два факторни удостоверяване.
Този проект се нуждае от сървър, на който да работи, за да може наистина да изпраща поща. Но първо, имаме нужда от начин да видим грешки. Ще забележите, че ако стартирате сървъра в режим за отстраняване на грешки, с настройки.Debug, равен на True, сървърът показва грешки автоматично. За да покажем грешки, без да използваме режим на отстраняване на грешки, който е опасен за производствен сървър, трябва да добавим изглед за него. Най -важните грешки, с които трябва да можем да се справим, са:
Грешка 500 - Проблем с нашия код Грешка 404 - Страница, която не е намерена (счупен URL) Грешка 403 - Отказана грешка в разрешение
Нека добавим ново приложение за справяне с тези грешки, наречени грешки.
python manage.py startapp errors
Добавете това към настройките.py, както преди, в настройката Installed_Apps и започнете с добавяне на препратки към някои изгледи в App/URLS.py, където приложението е името на вашия Django проект.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Това е всичко, от което се нуждаем освен изгледи на грешки, шаблони и малко междинен софтуер. Нека определим тези като така:
# Създайте своите възгледи тук.
След това, нека дефинираме средния софтуер за справяне с тези грешки. Ще направим това, като първо добавим към middleware_classes в settings.py, с името на нашия среден софтуер.
# ... Предишен междинен софтуер
На следващо място, нека добавим средния софтуер.
from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin
_error = local()
class ExceptionVerboseMiddleware(MiddlewareMixin):
def process_exception(self, request, exception):
_error.value = traceback.format_exc()
def get_current_exception():
try:
return _error.value
except AttributeError:
return None
def set_current_exception(exception):
try:
_error.value = exception
except AttributeError:
print('Attribute error setting exception.')
Добавяме функция, за да получим текущото изключение, като използваме локален резба, което ни помага да проследим всички грешки в нашия код. По отношение на шаблоните се нуждаем само от един, защото динамично определяме заглавието в изгледа. Шаблонът просто трябва да направи заглавието и „проследяването", нашето проследяване на грешки от контекста.
nano errors/templates/errors/error.html
Това е най -простият ни шаблон досега, но това е колко лесно е да видите грешките в нашия проект. След това нека деактивираме отстраняването на грешки в настройките.
nano app/settings.py
Намерете този ред, в който е зададен на истина, и го променете на невярно
DEBUG = False
Продължете напред и архивирайте приложението сега. Готови сме да се разгърнем на отдалечен Linux сървър и да продължим да добавяме функции от там.
sudo backup
Преди да публикуваме този код на сървър, трябва да помислим, че може да има някои проблеми с кода. В зависимост от случая, сайтовете, които приемат информация, публикувана им, ще имат проблеми с публикуването на спам и затруднено отстраняване на спама. Това не трябва да се случва незабавно, но ако се случи, по -късно ще разгледаме как автоматично да умерим спам на сайта и да направим по -трудни роботи за достъп до сайта, заедно с това как да деактивират потребителските акаунти и да проверяват идентичността на потребителя с сканиране на техния идентификатор или биометрично сканиране, като пръстов отпечатък или разпознаване на лицето.
Разглеждайки примера за много факторно удостоверяване, който разгледахме, в производството, нещата могат да бъдат различни. Забележете как сме ограничаващи тарифите за влизане и изтичащи маркери. Ако роботите имат достъп до сайт, два факторни удостоверяване могат да бъдат по -трудни, тъй като могат да въвеждат кодове в същото време, когато потребителят е. За да се борим с това, нека използваме модел в потребителските модели, като декларираме как взаимодействаме със сайта, когато се удостоверяваме, използвайки много факторна автентификация с телефонен номер. Ще добавим и опция за удостоверяване с имейл. Започнете, като редактирате потребителските модели с Nano.
nano users/models.py
Ето как трябва да изглежда моделът, който добавяме. Не ни трябват никакви методи, а само променливи, за да съхраняваме идентификатор, потребителя, времевата марка, изтичането, дължината и опитите срещу всяко много факторно удостоверяване (код като 123456, изпратен на телефон или имейл).
# Основен маркер, използван за влизане в уебсайта
Нека също така добавим привилегия към нашия потребител и засега ще я зададем ръчно, преди евентуално да мигрираме към привилегированите потребители автоматично. В потребителските модели добавете този ред в профила:
vendor = models.BooleanField(default=False)
Както при всички промени в базата данни, ние трябва да правим миграции и да мигрираме базата данни по всяко време, когато редактираме файл models.py в django. Не забравяйте, че за да направим това, първо използваме източник (ако той вече не се използва от отворения терминал) и след това python manage.py, за да направи миграциите и да мигрира.
cd project-directory-you-named # (ако е необходимо)
Засега можете да включите всички акаунти, които сте създали като доставчици, като използвате черупката.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Сега, нека да развием нашия изглед на много факторно удостоверяване, за да използваме този жетон. Първо, трябва да модифицираме нашите помощни програми на MFA Helper. Използване на Nano,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# Удостоверяване на потребителя, използвайки техния имейл или телефонен номер
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Филтрирайте маркера по стойността, предадена в URL (A UUID)
if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Ако тази сесия не е създадена, създайте я
user = User.objects.filter(id=token.user.id).first() # Вземете потребителя от маркера
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Ако те вече са удостоверени, влезте в тях
if not user: raise PermissionDenied() # Откажете, ако не е намерен потребител
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Проверете маркера Auth
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Влезте в потребителя, ако те вече не са влезли
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Задайте изтичане на тяхното многократно удостоверяване
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Пренасочете потребителя към следващата страница
if not user.profile.mfa_enabled: # Проверете дали MFA е активиран
if not check_verification_time(user, token): # Проверете времето
user.profile.mfa_enabled = False # Изчистете телефонния номер
user.profile.enable_two_factor_authentication = True # Активирайте MFA
user.profile.phone_number = '+1' # Деактивирайте телефонния номер
user.profile.save() # Запазете профила
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Влезте в потребителя, ако техният MFA не е активиран
if request.method == 'POST' and not fraud_detect(request, True): # Ако заявката е заявка за публикация
form = TfaForm(request.POST) # Създайте формата
code = str(form.data.get('code', None)) # Вземете кода
if code and code != '' and code != None: # Уверете се, че не е празен
token_validated = user.profile.check_auth_token(usertoken) # Проверете маркера Auth
is_verified = check_verification_code(user, token, code) # Проверете кода
if token_validated: # Ако всичко
if is_verified: # Е в ред
user.profile.mfa_enabled = True # Активирайте MFA (ако вече не е активиран)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Влезте в потребителя
for key, value in request.GET.items(): # Изградете заявка за следващия параметър (ако има такъв)
return HttpResponseRedirect(next) # Пренасочване
elif not token_validated: # Ако маркерът е невалиден
if p.mfa_attempts > 3: # Ако имаше твърде много опити
if form.data.get('send_email', False): # Изпратете имейла (или текст)
# Пресъздайте формата (за получаване на заявки)
Когато добавяме в този код, не забравяйте да импортирате функцията за изпращане на имейл. В горната част на файла, потребителят преглежда (с други импорти), добавете
from .mfa import send_verification_email as send_mfa_verification_email
Сега трябва да напишем тази функция, преди нещо от това да работи. Той трябва да разшири нашата функция за изпращане на имейл и просто да изпрати имейл до потребителя с кода за проверка.
nano users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Така че всичко това работи чудесно, сега имаме система за удостоверяване с много фактор, която зависи от телефонен номер или имейл, за да влезем. Но също така се нуждаем от начин да премахнем или поне да скрием потребителите, които не си сътрудничат с нашите условия. Това могат да бъдат спамери, роботи или всеки, който не означава добре за нашата работа. Разгледайте изглед, който имам за наблюдение на потребителите на моя уебсайт:
# Внос
from .tests import is_superuser_or_vendor # Ще трябва да създадем този тест
# Вземете списък с потребители
return render(request, 'users/users.html', { # Върнете потребителите в шаблон
Обърнете внимание, че този код използва тест, ще трябва да декларираме този тест в тест.py файл и да го импортирате. Редактиране на потребители/тестове.py, нека създадем теста.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Това е във връзка с шаблона потребители/потребители.html, който изглежда по този начин:
Обърнете внимание, че шаблонът включва друг шаблон, потребители/user.html. Когато използвате шаблон, който има подтеза и не се използва, е добра идея да добавите подчертаване () преди името на файла да се разшири, за да се разграничат шаблоните.
Обърнете внимание, че това е много Jinja, може да нямате всички тези променливи. Но това изглежда кодът ми.
<small># {{user.id}} </small>
Нуждаем се и от друг подтеза, toggle_active.html. Този шаблон трябва да бъде форма, която ни позволява да превключваме дали потребителят е активен.
Също така ще трябва да добавим изглед към превключването на активността на потребителите и подходящи модели на URL адреси. Докато сме в това, нека добавим изглед, за да изтрием потребител, в случай че се нуждаем от това.
# Внос
success_url = '/' # Пренасочването на URL адреса на успеха
def test_func(self): # Тествайте дали потребителят е суперпотребител и има разрешение да изтрие
Въпреки че това е практично, когато е необходимо, изтриването на потребителя не трябва да е необходимо през повечето време, можем просто да превключим видимостта на потребителите, които посещават сайта, ако трябва да ги отхвърлим.
Моделите на URL адреси, които добавихме, изглеждат така. С Nano редактирайте потребители/urls.py и добавете тези редове:
nano users/urls.py
Линиите трябва да влязат в списъка с пътища в изгледите на потребителя, преди края "]", но след началото "[".
# ...
# ...
Сега, не забравяйте да архивирате сайта, за да можете да го изтеглите на уеб сървъра, върху който ще продължим да работим. От командния ред,
sudo backup
Сега нашият сайт е подкрепен.
Така че сега имаме още няколко полезни функции. Но какво ще кажете за голямата картина тук? Този код все още не е достъпен от интернет, все още нямаме сървър за пощенски пощенски сървър и трябва да разширим приложението си, за да включим цялостен процес на проверка, както и гладки оформления, за да ни помогне да проучим сайта, заедно със сигурни протоколи за удостоверяване на привилегировани потребители.
Ще стигнем до всичко това. Най -важното засега просто ще бъде този код онлайн, което можем да направим само с няколко реда BASH на сървър на Ubuntu. Въпреки това ще трябва да наемете сървър за това, освен ако нямате сървър у дома и бизнес интернет абонамент, който ви позволява да отваряте портове. Аз лично стартирам уебсайта си на HP Z440, който е инсталиран в моя апартамент, но обикновено той е много по -евтин за основни нужди за наемане на виртуален частен сървър (VPS).
Имайте предвид, че кодът, който изпълняваме сега, е сравнително тънък, той ще трябва да се поддържа и подобрява, преди да сме готови да използваме това, което трябва да изградим продукт. Уверете се, че внимавате какво правите с интернет, уверете се, че ако разгърнете този сайт публично в мрежата на Linux сървър, имате план да блокирате нежелани взаимодействия с вашия уебсайт. Това вероятно няма да е проблем в началото, но ще разгледаме различни решения за борба с това, включително машинно обучение, изкуствен интелект и компютърно зрение. Когато стане проблем, погледнете по -нататък в този текст за решение.
По отношение на наемането на VPS има много места, които можете да отидете. Google Cloud има VPS сървъри, Ionos, Kamatera, Amazon AWS и повече доставчици предлагат облачни сървърни решения, които ще отговарят на нашите нужди.
Ще трябва да кликнете върху техните формуляри и да изберете план, за да започнете. Можете да отидете с основен план с всеки доставчик, но се уверете, че доставчикът ви позволява да отваряте портове на порт пощенски сървър, за да изпращате имейл (това трябва да бъде порт 587 и порт 25), някои доставчици блокират тези портове. Досега имах най -добрия опит с Ionos и Kamatera, и двамата ще ми позволят да изпратя неограничен имейл и цените им са доста евтини.
Ще се свържете с новия си сървър през протокол, наречен SSH или Secure Shell, който ви позволява да взаимодействате дистанционно със сървъра точно като вашия личен компютър, от вашия персонален компютър. Когато настроите сървъра, хостинг доставчикът вероятно ще ви помоли да добавите SSH ключ или те ще ви дадат потребителско име и парола. SSH ключът е как ще влезете в сървъра от командния ред, за да редактирате кода. Използвайте по-долу опциите SSH-Keygen, за да генерирате SSH ключ.
ssh-keygen
Запазете файла и го презапишете, ако трябва, добре е да завъртите SSH клавишите си, ако още не сте. Сега можете да използвате следната команда, за да видите вашия SSH ключ. Ще искате да го копирате на вашия отдалечен сървър, за да можете да го използвате за удостоверяване.
cat ~/.ssh/id_rsa.pub
Ако не сте успели да видите SSH ключ, когато въвеждате тази команда (дълъг низ от цифри и букви, започващи с "SSH-RSA AAA"), опитайте да генерирате RSA ключ (те са по-сигурни, така че съветвам да ги използвам.) Следният код ще генерира 4096 битов 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 сървъра. Виж
# SSHD_CONFIG (5) За повече информация.
# Този SSHD е съставен с path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Стратегията, използвана за опции в изпратената с 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
# Информация за Loglevel
# Удостоверяване:
# Logingracetime 2m
# PermitRootlogin prohibit-password
# Strictmodes Да
# Maxauthtries 6
# Макссесии 10
# Очаквайте .ssh/ortized_keys2 да бъде пренебрегнат по подразбиране в бъдеще.
# OrtizedPrincipalsfile няма
# OrtizedKeySCommand няма
# OrtizedKeysCommanduser никой
# За да работи това, ще ви трябват и ключове за хост в/etc/ssh/ssh_known_hosts
# HOSTBASEDAUTHENTICATION №
# Променете на да, ако не се доверявате ~/.ssh/know_hosts за
# HostBasedAuthentication
# IgnoreUserknownhosts №
# Не четете ~/.rhosts и ~/.shosts файлове на потребителя и ~/.shosts
# IgnorerHosts Да
# За да деактивирате тунели с ясни текстови пароли, променете на не тук!
# RemiteMtemptypasswords №
# Променете на YES, за да активирате паролите за реакция на предизвикателство (внимавайте
# Някои PAM модули и нишки)
# Опции за Kerberos
# Kerberosauthentication №
# Kerberosorlocalpasswd Да
# Kerberosticketcleanup Да
# Kerberosgetafstoken no
# Опции на GSSAPI
# Gssapiauthentication №
# GSSAPICLEANUPCREDENTIALS Да
# GSSAPISTRICTACCEPTORCHECK Да
# Gssapikeyexchange no
# Задайте това на „да", за да активирате удостоверяването на PAM, обработката на акаунти,
# и обработка на сесии. Ако това е активирано, удостоверяването на PAM ще
# да бъдат разрешени чрез kbdinteractiveauthentication и
# Пароловинатикация. В зависимост от вашата конфигурация на PAM,
# PAM автентификация чрез KBDINTERACTIVEAUTHENTICATION може да заобиколи
# Настройката на „PermitRootlogin без password".
# Ако просто искате проверките на акаунта на PAM и сесиите да се изпълняват без
# PAM автентификация, след което активирайте това, но задайте парола за получаване
# и kbdinteractiveauthentication на „не".
# AllowAgentforwarding да
# Позволете на даване да
# Gatewayports №
# X11displayoffset 10
# X11USELOCALHOST Да
# Разрешение Да
# Printlastlog Да
# TCPKeepalive Да
# RemitUserEnvironment №
# Компресията се забави
# ClientAliveInterVal 0
# ClientAliveCountMax 3
# Използвани №
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Remittunnel №
# Chrootdirectory няма
# Версия
# Няма път на банера по подразбиране
# Позволете на клиента да предава променливи на локалната среда
# Отменете по подразбиране без подсистеми
# Пример за преобладаващи настройки на базата на потребител
# Съвпадение на потребителя anoncvs
# X11forwarding no
# Позволете №
# Разрешение №
# ForCecommand CVS сървър
Не забравяйте, че Ctrl+X и Y за запазване на файла. На следващо място, нека напишем основен скрипт, наречен Initialize (всичко в директорията по подразбиране на нашия потребител).
nano initialize
Добавете тези редове към файла, заменяйки
# !/кош/баш
За да ви преведем през този файл, нека стартираме по ред. Първият ред казва на компилатора, че това е скрипт на Bash. След това инсталираме зависимости, копираме SSHD_CONFIG в правилната директория, рестартиране на SSH, генериране на SSH ключове за Root, добавяне на потребителския „екип" (можете да изберете име, което харесвате за това, използвайте командата adduser с тяхното име и парола за деактивиране засега). Ние също така добавяме екип към групата SUDO, генерираме своя SSH ключ, добавяме нашия ключ към разрешените ключове и техните и техните и отпечатаме своя ключ. Този нов потребител ще бъде как влизаме в сайта.
В нов терминал продължете напред и отворете отново сървъра.
ssh team@XX.XX.XX.XX
Този път не трябва да се нуждаете от парола, тъй като имате SSH ключ. Също така сме деактивирали влизане с парола, за да запазим сайта по -сигурен.
Сега този сървър се стартира напълно празен, без информация за него. Нека започнем с клонирането на нашия проект от GIT, за да можем да го изтеглим и стартираме на отдалечената машина. На отдалечения сървър, свързан през SSH, първо отпечатайте вашия SSH ключ:
cat ~/.ssh/id_rsa.pub
След това поставете този ключ в настройките на GIT, както направихме преди, за да настроим нашето GIT хранилище. Вече можем да клонираме проекта си директно към сървъра. Уверете се, че първо сте подкрепили проекта локално, така че той е на GIT сървъра да изтеглите.
git clone git://github.com/you/yourproject.git
Перфектен. Сега всички файлове са тук. Можем да ги видим с LS
ls
Сега, нека започнем да настройваме сървъра. Първо, копирайте директорията на вашия проект в просто, запомнящо се име, което ще използваме за проекта.
cp -r yourproject whatyoucalledit
Където „Whatyoucalledit" е новото име на вашия проект. След това ще трябва да изградим основна помощна програма за настройка на сървъра. Ние ще спестим тази помощна програма и ще я използваме в бъдеще. За да изградим тази помощна програма, нека създадем потребителски двоичен, за да определим как редактираме скрипт. Използвайки Bash, Редактиране/USR/BIN/ASCIPT
sudo nano /usr/bin/ascript
Не забравяйте да използвате SUDO там, така че да имате разрешения за редактиране на файла. Във файла добавете тези редове:
# !/кош/баш
echo "# !/кош/bash ">>/usr/bin/$ 1
Не забравяйте, че този скрипт взема аргумент, името на скрипта като $ 1. Първо той проверява дали файлът съществува или го създава по друг начин, добавя първия ред за деклариране, че скриптът е баш, променя разрешенията си, редактира го и добавя името му на /etc /andcripts, което ни позволява да съхраняваме имената на скриптите, които създаваме. Ако файлът вече съществува, просто променете разрешенията и го редактирайте. Запазете файла и след това ще променим разрешенията си. Докато използваме този скрипт, няма да се налага да го правим отново.
sudo chmod a+x /usr/bin/ascript
Перфектен. Сега нека създадем скрипт, наречен Setup. Първо, да не ви затрупа, но погледнете как изглежда моят скрипт за настройка. Ще преминем през това как трябва да изглежда този сценарий във вашия проект, няма да ви трябва всичко в моя сценарий, за да започнете.
# !/кош/баш
# SUDO ChMOD A+X скриптове/потребителска част
# ./scripts/usersetup
# SSH-Keygen
# Проектна директория
# Команди на дневника
# Nano Config
# Git config
# Актуализирайте и инсталирайте
# Активирайте антивируса на Clamav
# Задайте името на хоста
# Настройка Postgres
# Резервно копие на базата данни за настройка
# Деактивирайте iptables
# Инсталирайте BitDefender
# Настройка postfix
# Създайте Dirs
# Настройка VirtualEnv
# Вземете и изградете зависимости
# Задайте правила за защитна стена
# Инсталирайте PYPI зависимости
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP инсталирайте OpenCV-Python == 4.5.5.64
# PIP инсталирайте OpenCV-Contrib-Python == 4.5.5.64
# Инсталирайте certbot
# Изпълнете certbot
# Reload Mail Server
# Copy Certs
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Пач Venv
# Задайте потребителски настройки
# Задайте разрешения
# Sudo Chown -R Екип: Потребители/VAR/RUN/
# sudo chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: Потребители db.sqlite3
# Копирайте конфигуриране и задайте разрешения
# База данни за настройка
# Инжектирайте PAM Config и премахнете дефектната SSH конфигурация
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /профил
# Копирайте скриптове за кошчета и задайте разрешения
# Презаредете и активирайте услугите
# Активирайте модулите на Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# SUDO A2ENMOD MPM_PREFORK
# Деактивирайте сайта по подразбиране
# Активирайте нашия сайт
# Презаредете демон и рестартирайте Apache, Postfix и Opendkim
# Задайте разрешения
# Конфигурация на суап
# Init Caption Engine
# Настройка git
# Покажете IPv6 и Opendkim за конфигурация на домейна
# Настройка попълнена
Това е много настройка! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs Сертификатите и настройват сървъра, инсталират конфигурация, стартират и активират северната част, разпределя суап, задава разрешения и отпечатва IP, IPv6 адреса и клавиша Opendkim. Доста просто, но изглежда като много код. Няма да ни трябва много от това, защото нямаме зависимости, ние не използваме целина, целерибет или дафна, но така или иначе ще инсталираме някои от тях, за да започнем. Забележете, че този код има домейн, деклариран няколко пъти.
Също така ще трябва да закупим име на домейн (което е малка годишна такса). Препоръчвам Squarespace за закупуване на домейн, тяхното оформление е интуитивно и лесно за използване. Можете да закупите всеки домейн по ваш избор, но аз използвам домейна femmebabe.com в този пример. След като сте закупили домейн, се насочете към панела за конфигуриране на Squarespace DNS и добавете запис, насочен към вашия домейн към сървъра чрез IP адрес. Трябва да изглежда така:
@ A xx.xx.xx.xx
С @ оператора като хост, което означава, че всички поддомейни под този домейн и кореновата домейна ще пренасочат към сървъра. Има още записи, които да декларираме, но можем да преминем към тях, след като сме готови да изпратим поща. Имайте предвид, че може да отнеме няколко дни, преди да успеете успешно да изпратите поща от сървъра. DNS Records, които определяме, ще отнеме време за разпространение.
Както и да е, единственият запис, който трябва да стартираме, е запис. Така че сега можем да попълним скрипта по -долу според нашия проект и да го стартираме.
Нека започнем с по -малък скрипт за настройка, за да инсталираме това, което ни е необходимо за основен напредък. Все още няма да използваме толкова много зависимости или PostgreSQL, просто ще стартираме основен HTTP сървър и ще се притесняваме да го удостоверявате, когато това е направено. Не забравяйте, че за да получим HTTPS сертификат и да стартираме сървъра сигурно, ще трябва да купим домейн заедно с наем на сървър. Засега заменете „екипа" в този файл с името на вашия потребител, „Dir" с директорията на вашия проект и доставете вашия имейл и домейн в <> маркерите.
Освен това, преди да стартираме този код, трябва да променим настройките на защитната стена, които хостинг доставчикът поддържа, ако има такива. Обикновено това е в раздела „мрежи" на вашия хостинг доставчик или ако сте самостоятелни хостинг, в секцията „Пренасочване на порта" на вашия рутер. Също така ще искате да настроите статичен IP през вашия рутер с адреса на вашата сървърна машина, ако използвате самостоятелен хостинг. Ще трябва да отворите следните портове за достъп до четене/запис.
22 (SSH) 25 (Поща) 587 (поща) 110 (пощенски клиент) 80 (http) 443 (https)
# !/кош/баш
# Команди на дневника
# Nano Config
# Git config
# Актуализирайте и инсталирайте
# Активирайте антивируса на Clamav
# Задайте името на хоста
# Резервно копие на базата данни за настройка
# Деактивирайте iptables
# Настройка VirtualEnv
# Инсталирайте certbot
# Изпълнете certbot
# Задайте потребителски настройки
# Задайте разрешения
# Sudo Chown -R Екип: Потребители/VAR/RUN/
# sudo chown root: root/run/sudo/ts -r
# Презаредете и активирайте услугите
# Активирайте модулите на Apache
# Презаредете демон и рестартирайте Apache, Postfix и Opendkim
# Покажете IPv6 и Opendkim за конфигурация на домейна
Преди да стартирате този код, уверете се, че домейнът, който сте закупили, е свързан към сървъра. За да направите това, отворете терминал на вашата локална машина и изпълнете тази команда с вашия домейн:
ping femmebabe.com # Поставете вашия домейн тук, след пинг
Ако всичко изглежда добре и сървърът изпраща отговори, ние сме готови да стартираме скрипта и да инсталираме пакети, както и да стартираме, активираме и сертифицираме нашия Apache Server.
Това не е цялата настройка, необходима за конфигуриране на постфикс, ще разгледаме тази настройка по -късно. Засега стартирайте този код за настройка и трябва да отнеме няколко минути, за да инсталирате и сертифицирате вашия сървър. Още веднъж, не забравяйте да замените име, имейл и име на домейн в скрипта според името, което сте закупили.
Сега, когато сървърът е предоставен, можете да отидете на URL адреса във всеки уеб браузър и да проверите, за да се уверите, че сървърът работи HTTPS. Ако не е, опитайте да изчакате малко време, за да могат DNS записите да наваксат и след това изпълнете следната команда, за да опитате да опитате сертификат Certbot:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Докато сте конфигурирали всичко правилно, трябва да имате достъп до страницата по подразбиране на Apache, само за да знаете, че вашият код работи и показва уеб страница на живо. След това нека редактираме настройките. Ще конфигурираме и домейна в настройките, както и вътрешните IPS.
nano yourproject/settings.py
В настройките променете/добавете тези редове.
# Config на сайта
Сега ще трябва да конфигурираме Apache2. Нека редактираме конфигурационния файл, който ще разгърнем с този ред:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Този конфигурационен файл трябва да има нашето име на домейн в него и името на потребителя и проекта. Използвам името на домейна femmebabe.com, екипът на потребителското име и името на проекта femmebabe.
ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80>
Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static /home/team/femmebabe/static
<Directory /home/team/femmebabe/static>
Require all granted
</Directory>
Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>
<Directory /home/team/femmebabe/femmebabe>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
WSGIProcessGroup femmebabe
WSGIApplicationGroup %{GLOBAL}
<Directory /home/team/femmebabe/static>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
RewriteRule ^(.+?)/$ /media/$1 [F,L]
</IfModule>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem
Header set X-Frame-Options: "SAMEORIGIN"
Header set Access-Control-Allow-Origin "https://femmebabe.com"
TimeOut 60000
LimitRequestBody 0
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
Header set Cache-Control "max-age=30, public"
</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =femmebabe.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Не забравяйте да замените името на проекта, директории и домейн в този примерен код, когато конфигурирате вашия сървър. Сега ще трябва да деактивираме сайта по подразбиране. Това може да стане с помощта на Bash.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
След това можем да активираме сайта по подразбиране и презареждането на Apache2, използвайки също BASH. Не забравяйте да замените femmebabe с името на файла, който сте декларирали при редактиране в/etc/apache2/сайтове-наличието/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Върнете се към вашия домейн в Navbar. Трябва да видите сайта, който сте конфигурирали в уеб браузъра си. Поздравления! Ако не го видите, може да се наложи да направите някои промени. Внимателно прегледайте настройките във вашия проект, конфигурация на Apache и се уверете, че нямате грешки и изпълнете следните команди, за да проверите проекта за грешки.
cd projectname
source venv/bin/activate
python manage.py check
Ако имате грешки във вашия проект Python, проследете ги до мястото, където са и ги поправете. Може да не успеете да видите всичките си грешки в зависимост от това къде се намират, така че ако имате грешка, която просто казва, че „Популацията не е повторно въвеждане", редактирайте следния файл във виртуалната среда, registry.py, за да изложите грешката.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Превъртете до ред 83, където тази грешка в изпълнението е повдигната (повишаване на RunTimeError ("Supulate () не е повторно влязъл") и добавете коментар преди този ред, след което добавяте със същото вдлъбнатина, self.app_configs = {}. Това изглежда така:
# Предотвратяване на повторни обаждания, за да избягвате стартирането
# методи два пъти.
# Повдигнете RunTimeError ("POPULED () не е повторно въвеждане")
След това можете да проверите проекта отново и да изложите грешката.
python manage.py check
След това можете да видите грешката и да я поправите. Когато го поправите и кодът се компилира без грешки, не забравяйте да промените файла обратно, така че да изглежда така:
# Предотвратяване на повторни обаждания, за да избягвате стартирането
# методи два пъти.
# 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 и отпечатаме ключа. Ще конфигурираме това последно.
@ A N/a 75.147.182.214
@ Mx 10 femmebabe.com
@ Ptr N/a femmebabe.com
@ Txt N/a Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ всички
по подразбиране._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N/a v = dmarc1; P = няма
sendonly._domainkey
Txt
N/a
Сега ще трябва да добавим постоянна конфигурация за Postfix. Всичко, което трябва да направим, е да се уверим, че заместваме името на домейна, femmebabe.com, с името на домейна, което използвате. Нека разгледаме всички конфигурационни файлове един по един и ги инсталираме в директория, наречена Config in Our Project, за инсталиране в ОС.
nano config/etc_postfix_main.cf
Добавете този текст към файла
# Вижте /usr/share/postfix/main.cf.dist за коментирана, по -пълна версия
# Дебиан специфично: Посочването на име на файл ще доведе до първия
# ред на този файл, който да се използва като име. Debian по подразбиране
# е /etc /mailname.
# myorigin = /etc /mailname
# добавяне. Домейнът е работата на МУА.
# Разкопайте следващия ред за генериране на предупреждения за „забавена поща"
# delay_warning_time = 4h
# Вижте http://www.postfix.org/compatibility_readme.html - по подразбиране до 3.6 на
# Свежи инсталации.
# TLS параметри
# Конфигурация на milter
Следваща конфигурация!
nano config/etc_postfix_master.cf
Добавете тези редове:
#
# Файл за конфигурация на главния процес Postfix. За подробности относно формата
# на файла вижте ръчната страница на главния (5) (команда: "Man 5 Master" или
# on-line: http://www.postfix.org/master.5.html).
#
# Не забравяйте да изпълнявате „Postfix Reload" след редактиране на този файл.
#
# =====================================================================================================================================1
# Тип на услугата частен ropriv chroot wakeup maxproc command + args
# (Да) (Да) (Не) (Никога) (100)
# =====================================================================================================================================1
# smtp inet n - y - 1 постскрийн
# smtpd pass - - y - - smtpd
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Изберете един: Активирайте подаване само за клиенти на Loopback или за всеки клиент.
# 127.0.0.1:Submission inet n - y - - smtpd
# -o syslog_name = postfix/изпращане
# -o SMTPD_TLS_SECURY_LEVEL = Encrypt
# -o smtpd_sasl_auth_enable = да
# -o smtpd_tls_auth_only = да
# -o smtpd_reject_unlisted_recipient = no
# -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 = PERMIT_SASL_AUTHENTICIETE, отхвърляне
# -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 = no
# -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 = PERMIT_SASL_AUTHENTICIETE, отхвърляне
# -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 Pipe (8)
# агент. Вижте страницата на тръбата (8) за информация за $ {получател}
# и други опции за пликове за съобщения.
# =====================================================================
#
# MailDrop. Вижте файла postfix maildrop_readme за подробности.
# Също така посочете в main.cf: maildrop_destination_recipient_limit = 1
#
#
# =====================================================================
#
# Последните версии на Cyrus могат да използват съществуващия запис "LMTP" Master.CF.
#
# Посочете в Cyrus.conf:
# lmtp cmd = "lmtpd -a" слушайте = "localhost: lmtp" proto = tcp4
#
# Посочете в main.cf едно или повече от следните:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# =====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Също така посочете в main.cf: cyrus_destination_recipient_limit = 1
#
# Cyrus unix - n n - - тръба
# flags = drx user = cyrus argv =/cyrus/bin/deselo -e -r $ {sender} -m $ {extension} $ {user}
#
# =====================================================================
# Стар пример за доставка чрез Cyrus.
#
# Old -Cyrus unix - n n - - тръба
# flags = r user = cyrus argv =/cyrus/bin/delisent -e -m $ {extension} $ {user}
#
# =====================================================================
#
# Вижте файла postfix UUCP_README за данни за конфигурация.
#
#
# Други външни методи за доставка.
#
И конфигурацията на Opendkim. Opendkim идентифицира имейл сървъри с ключове за домейн, за да ги направи по -сигурни. Без него пощата не е подписана и може да не стигне до входяща поща.
nano config/etc_default_opendkim
Добавете тези редове:
# Забележка: Това е наследен конфигурационен файл. Не се използва от Opendkim
# SystemD услуга. Моля, използвайте съответните параметри на конфигурацията в
# /etc/opendkim.conf вместо това.
#
# Преди това ще редактира настройките по подразбиране тук и след това ще изпълни
# /lib/opendkim/opendkim.service.generate за генериране на системни файлове за отмяна на
# /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:
# Socket = Inet: 54321
# Слушайте на Loopback на порт 12345:
# Socket = inet: 12345@localhost
# Слушайте на 192.0.2.1 на пристанище 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Добавете тези редове:
# default_process_limit = 100
# default_client_limit = 1000
# По подразбиране VSZ (Размер на виртуалната памет) Ограничение за сервизни процеси. Това е главно
# предназначени да уловят и убият процеси, които изтичат паметта, преди да ядат
# всичко.
# default_vsz_limit = 256m
# Потребителят на вход се използва вътрешно от процесите на влизане. Това е най -недостъпното
# Потребител в системата Dovecot. Изобщо не трябва да има достъп до нищо.
# default_login_user = dovenull
# Вътрешният потребител се използва от непроходими процеси. Трябва да е отделно от
# Потребител за вход, така че процесите на вход не могат да нарушават други процеси.
# default_internal_user = dovecot
# порт = 143
# порт = 993
# ssl = да
# Брой връзки, които да се справите, преди да започнете нов процес. Обикновено
# Единствените полезни стойности са 0 (неограничени) или 1. 1 е по -сигурно, но 0
# е по -бърз. <doc/wiki/loginprocess.txt>
# service_count = 1
# Брой процеси, които винаги да продължават да чакат повече връзки.
# process_min_avail = 0
# Ако зададете service_count = 0, вероятно трябва да увеличите това.
# vsz_limit = $ default_vsz_limit
# порт = 110
# порт = 995
# ssl = да
# порт = 587
# Създайте Inet слушател само ако не можете да използвате горния Unix Socket
# inet_listener lmtp {
# Избягвайте да правите LMTP видим за целия интернет
# адрес =
# порт =
# }
# По -голямата част от паметта отива на mmap () файлове. Може да се наложи да увеличите това
# Ограничете, ако имате огромни пощенски кутии.
# vsz_limit = $ default_vsz_limit
# Макс. Брой процеси на IMAP (връзки)
# process_limit = 1024
# Макс. Брой процеси на POP3 (връзки)
# process_limit = 1024
# Макс. Брой процеси на подаване на SMTP (връзки)
# process_limit = 1024
# auth_socket_path сочи към този гнездо на UserDB по подразбиране. Обикновено е
# Използва се от Dovecot-LDA, Doveadm, евентуално IMAP процес и др. Потребители, които имат
# Пълните разрешения за този гнездо са в състояние да получат списък на всички потребителски имена и
# Получете резултатите от търсенето на потребители на всички.
#
# Режимът по подразбиране 0666 позволява на всеки да се свърже с гнездото, но
# търсенето на userdb ще успее само ако UserDB върне поле "UID", което
# Съчетава UID на процеса на обаждащия се. Също така, ако UID или GID на обаждащия се съвпада с
# UID на Socket или GID търсенето успява. Всичко друго причинява провал.
#
# За да дадете пълните разрешения на обаждащия се да търси всички потребители, задайте режима на
# Нещо друго от 0666 и Довекот позволява на ядрото да наложи
# Разрешения (например 0777 позволява на всички пълни разрешения).
# Процесът на работника на AUT
# /etc/сянка. Ако това не е необходимо, потребителят трябва да бъде променен на
# $ default_internal_user.
# Потребител = root
# Ако се използва DICT Proxy, пощенските процеси трябва да имат достъп до гнездото му.
# Например: режим = 0660, група = Vmail и Global Mail_Access_Groups = Vmail
# режим = 0600
# Потребител =
# група =
Още веднъж, не забравяйте да замените домейна във всички тези файлове, femmebabe.com, с избрания от вас домейн. Редактирайте следващия файл, конфигурацията на Dovecot,
nano config/etc_dovecot_dovecot
И добавете тези линии
## Конфигурационен файл на DoVecot
# Ако бързате, вижте http://wiki2.dovecot.org/quickconfiguration
# Командата "DoveConf -N" дава чист изход на променените настройки. Използвайте го
# Вместо да копирате и поставяте файлове при публикуване в списъка с пощенски пощенски пощенски вещества.
# '# „Характер и всичко, след като се третира като коментари. Допълнителни пространства
# и раздели се игнорират. Ако искате да използвате някое от тях изрично, поставете
# value inside quotes, eg.: key = "# char и trailing whitespace "
# Повечето (но не всички) настройки могат да бъдат отменени от различни протоколи и/или
# Източник/дестинация IPS чрез поставяне на настройките в секциите, например:
# Протокол IMAP {}, локален 127.0.0.1 {}, отдалечен 10.0.0.0/8 {}
# Стойностите по подразбиране са показани за всяка настройка, не се изисква да се отказва
# тези. Това обаче са изключения от това: няма раздели (например пространство от имена {})
# или настройките на приставката се добавят по подразбиране, те са изброени само като примери.
# Пътеките също са само примери, като реалните по подразбиране се основават на конфигуриране
# Опции. Изброените тук пътища са за конфигуриране - -prefix =/usr
# --sysconfdir =/etc-localstatedir =/var
# Активирайте инсталирани протоколи
# Списък на запетая, разделен на IPS или хостове, където да слушате за връзки.
# "*" слуша всички IPv4 интерфейси "::" слуша всички IPv6 интерфейси.
# Ако искате да посочите портове без подразбиране или нещо по-сложно,
# Редактиране на conf.d/master.conf.
# слушайте = *, ::
# Базова директория къде да съхранявате данни за изпълнение.
# base_dir =/var/run/dovecot/
# Име на този случай. В многоинстанционната настройка Doveadm и други команди
# може да използва -i <instance_name> за да изберете кой екземпляр се използва (алтернатива
# до -c <config_path>). Името на екземпляра също се добавя към процесите на Dovecot
# В изхода на PS.
# instance_name = dovecot
# Поздравително съобщение за клиенти.
# login_greeting = dovecot готов.
# Списък на пространството, разделен на надеждни мрежови диапазони. Връзки от тях
# IPS е позволено да отменят своите IP адреси и портове (за регистриране и
# за проверки за удостоверяване). disable_plaintext_auth също се игнорира за
# Тези мрежи. Обикновено бихте посочили вашите IMAP прокси сървъри тук.
# login_trusted_networks =
# Списък на пространството Списък на контакти за достъп до вход (напр. TCPWRAP)
# login_access_sockets =
# С proxy_maybe = да, ако прокси дестинацията съвпада с някой от тези IP
# проксинг. Това не е необходимо нормално, но може да е полезно, ако дестинацията
# IP е напр. IP на балансиращия натоварване.
# auth_proxy_self =
# Покажете повече сложни заглавия на процеса (в PS). В момента показва потребителско име и
# IP адрес. Полезно за виждането на това кой всъщност използва процесите на IMAP
# (напр. Споделени пощенски кутии или ако за множество акаунти се използва същият UID).
# verbose_proctitle = no
# Ако всички процеси бъдат убити, когато Master Process на Dovecot се изключи.
# Задаването на това на „не" означава, че Dovecot може да бъде надграден без
# принуждаване на съществуващите клиентски връзки да се затворят (въпреки че това също може да бъде
# Проблем, ако надстройката е напр. поради поправка на сигурността).
# SUTLDOWN_CLIENTS = ДА
# Ако не нула, изпълнявайте команди за поща чрез тези много връзки към сървъра на Doveadm,
# вместо да ги стартирате директно в същия процес.
# doveadm_worker_count = 0
# Unix гнездо или хост: Порт, използван за свързване към сървъра на Doveadm
# DOVEADM_SOCKET_PATH = DOVEADM-SERVER
# Списък на пространството, разделен на променливи на околната среда, които са запазени на Dovecot
# Стартиране и предаване на всички свои детски процеси. Можете също да дадете
# key = стойности двойки, за да зададете винаги конкретни настройки.
# import_environment = tz
##
## Настройки на сървъра на речника
##
# Речникът може да се използва за съхраняване на ключ = списъци с стойност. Това се използва от няколко
# приставки. Речникът може да бъде достъпен директно или въпреки че a
# Речник сървър. Следните DICT блок карти имена на речници на URIS
# Когато се използва сървърът. След това те могат да бъдат посочени с помощта на URI във формат
# "Proxy :: <name>".
# квота = 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 за завършване
# Документация на наличните конфигурационни параметри.
# Loghy no
# Общи параметри за подписване и проверка. В Debian, заглавката "от" е
# оживен, защото често е ключът за идентичност, използван от системите за репутация
# и по този начин донякъде чувствителен към сигурността.
# Подписване на домейн, селектор и ключ (задължително). Например, изпълнете подписване
# за домейн „example.com" с селектор „2020" (2020._domainkey.example.com),
# Използване на частния ключ, съхраняван в /etc/dkimkeys/example.private. По -подробно
# Опциите за настройка можете да намерите в /usr/share/doc/opendkim/readme.opendkim.
# Пример за домейн.com
# Селектор 2020
# Keyfile /etc/dkimkeys/example.private
# В Debian, Opendkim работи като потребител "Opendkim". Необходим е UMASK от 007
# Използване на локален гнез
# Потребител (например Postfix). Може да се наложи да добавите потребител "postfix" към групата
# "Opendkim" в този случай.
# Гнездо за MTA връзка (задължително). Ако MTA е вътре в затвора за хрут,
# Трябва да се гарантира, че гнездото е достъпно. В Debian, Postfix работи
# chroot in/var/spool/postfix, следователно unix гнездото трябва да бъде
# конфигуриран, както е показано на последния ред по -долу.
# Socket Local: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
# Хостове, за които да подпишете, а не да проверявате, по подразбиране е 127.0.0.1. Вижте
# РАЗДЕЛ НА ОПЕРАЦИЯ НА OPENDKIM (8) За повече информация.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Доверителната котва позволява DNSSEC. В Debian е предоставен файл за котва на доверие
# от пакета DNS-Root-Data.
# Имената на имена 127.0.0.1
# Карта на домейни от адреси до клавиши, използвани за подписване на съобщения
# Набор от вътрешни хостове, чиято поща трябва да бъде подписана
nano config/etc_default_opendkim
И добавете тези линии
# Забележка: Това е наследен конфигурационен файл. Не се използва от Opendkim
# SystemD услуга. Моля, използвайте съответните параметри на конфигурацията в
# /etc/opendkim.conf вместо това.
#
# Преди това ще редактира настройките по подразбиране тук и след това ще изпълни
# /lib/opendkim/opendkim.service.generate за генериране на системни файлове за отмяна на
# /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:
# Socket = Inet: 54321
# Слушайте на Loopback на порт 12345:
# Socket = inet: 12345@localhost
# Слушайте на 192.0.2.1 на пристанище 12345:
# Socket = inet: 12345@192.0.2.1
Когато сме готови да настроим нашия Postfix сървър, ще стартираме кода по -долу, като съответното име на домейн е вградено. Започнете със създаване на скрипт
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Сега, в Nano, текстовият редактор, редактирайте този файл, така че той включва вашето име на домейн вместо femmebabe.com.
# !/кош/баш
# Настройка 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
Това ще предложи многословна информация за пощата, която се изпраща от сървъра и дали тя работи правилно. Трябва да можете да видите имейла и във входящата си поща, ако не е там, проверете папката си за спам.
Също така ще трябва да конфигурирате настройките си във вашите настройки. Добавете или сменете тези редове във вашите настройки
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Забележете, че използваме конфигурационен файл, за да получим паролата. Нека заредим този файл в настройките като така, в самото начало на файла:
# Отворете и заредете конфигурация
Нека създадем този файл и да добавим секретен ключ към него, както и паролата за пощата. За да генерирате секретен ключ, използвайте тази команда, с каквато и да е дължина, която харесвате в края:
openssl rand -base64 64
Сега копирайте текста, който openssl генерира и редактира /etc/config.json
sudo nano /etc/config.json
Добавете следните редове към вашия файл, с ключа, който OpenSSL генерира като секретен ключ.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON Format е прост и лесен за използване, можем да декларираме други ключове, които искаме да използваме и в нашия проект по този начин, и да ги държим отделни от нашата директория на проекта, така че другите потребители да не могат да им пишат и така че те не могат да бъдат прочетени само от нашата директория на проекта. Това се препоръчва практика за ключове за API, от които тук ще използваме повече от няколко.
Също така ще искате да архивирате проекта си, за да сте сигурни, че всичко е запазено и ще можете да възстановите работата си по -късно, дори ако вече не искате да наемете сървър.
sudo backup
Сега, опитайте да изпратите HTML имейл от уеб сървъра, при условие че изпращането на такъв от командния ред работи. Попитайте вашия потребителски екземпляр в черупката и изпратете HTML имейл до този потребител чрез Django. Променете името ми в кода, Charlotte, на вашето потребителско име.
python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()
Ако първата команда не работи, не забравяйте да използвате
source venv/bin/activate
При условие, че всичко е настроено правилно, сега ще получите имейл до добре дошъл в пощенската си кутия, изпратен от вашето уеб приложение. Добра работа! Вие сте изминали дълъг път.
Исках да добавя, ако изобщо се борите с някакви грешки, докато работите по проект като този, не се колебайте да търсите отговори и да поискате помощ. Google, наред с други търсачки, са чудесни ресурси за търсене на помощ за програмиране. Просто потърсете грешката, която получавате, и ще можете да видите как другите хора решават проблема. Също така, вие сте добре дошли да се свържете с мен, вашите преподаватели (учители, професори, преподаватели), всички връстници в интернет, които са на разположение за помощ за програмиране или се консултирайте отново с тази книга или други ресурси, за да намерите решения на проблемите, които изпитвате. Разбирам, че това не е лесно, но дори и да сте чели в този момент и да не пишете никакъв код, вие научавате много за изграждането на уеб приложение от нулата. Потупайте се по гърба, вие вършите чудесна работа.
Благодарим ви, че отделихте време да прочетете това Ръководство за уеб разработка на трето издание. В бъдещите издания ще включа повече от важните примери, обсъдени в началото на документа и ще се потопим много по -дълбоко в света на разработването на софтуер и хардуер. Следете за това, което предстои, и с нетърпение очаквам да ви науча как да изграждате невероятен софтуер. Ще се видим в следващото издание!
от Daisy / Преглед | Купете | Купете с криптовалута
How is the crypto market growing so quickly?
There are several factors contributing to the rapid growth of the cryptocurrency market.
1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.
2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.
3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.
4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.
5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.
Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.
от Daisy / Преглед | Купете | Купете с криптовалута
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
от Daisy / Преглед | Купете | Купете с криптовалута
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.от Daisy / Преглед | Купете | Купете с криптовалута
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
от Daisy / Преглед | Купете | Купете с криптовалута
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
от Daisy / Преглед | Купете | Купете с криптовалута
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
от Daisy / Преглед | Купете | Купете с криптовалута
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
от Daisy / Преглед | Купете | Купете с криптовалута
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
от Daisy / Преглед | Купете | Купете с криптовалута
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
от Daisy / Преглед | Купете | Купете с криптовалута
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
от Daisy / Преглед | Купете | Купете с криптовалута
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
от Daisy / Преглед | Купете | Купете с криптовалута
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.от Daisy / Преглед | Купете | Купете с криптовалута
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
от Daisy / Преглед | Купете | Купете с криптовалута
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
от Daisy / Преглед | Купете | Купете с криптовалута
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How do i find customers for my web development small business?
Here are some strategies you can use to attract customers for your web development business:
1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.
2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.
3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.
4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.
5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.
6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.
7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.
8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.
9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.
10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.
от Daisy / Преглед | Купете | Купете с криптовалута
https://glamgirlx.com
https://glamgirlx.com -
Оставете ми съвет в биткойн, използвайки този адрес: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE