Напрыклад Трэцяе выданне Шарлота Харпер 3 ліпеня 2024 г. Абноўлены/пераўтвораны 3 чэрвеня 2025 года
Прадмова:
Размовы аб бяспецы ў будаўніцтве праграмнага забеспячэння для Інтэрнэту з'яўляюцца важнай часткай плана і выканання вэб -распрацоўшчыкаў, адначасова інжыніруючы прататып, які з'яўляецца надзейным, стабільным і карысным для практычных мэтаў. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the Канчатковы карыстальнік, які хоча забіць час альбо зрабіць што -небудзь у Інтэрнэце, звычайна на смартфоне з сэнсарным экранам. Большасць людзей нават не ведала б, з чаго пачаць, калі яны хочуць пабудаваць вэб -сайт з нуля, яны, як правіла, пачынаюць на сайце іншага чалавека і будаваць нешта абмежаванае ў функцыянальнасці, надзейнасці, прастаце выкарыстання і асабліва творчасці, калі яны маглі мець усе апошнія магутныя інструменты ў сваім распараджэнні, каб стварыць нешта карыснае, не марнуючы кнопкі націску часу і асабліва марнаваць грошы за дарагія падпіскі, каб праграмнае забеспячэнне было некалькі, якія трэба выкарыстоўваць, каб выкарыстаць у любым выпадку, якія ўжываюць у выкарыстанні, якія прадастаўляюць абмежаванні ў выкарыстанні. Калі ў вас ёсць некалькі хвілін, каб прачытаць гэтую кнігу і даведацца, чаму я хачу навучыць вас, альбо нават асабіста пагаварыць са мной пра вашыя мэты і атрымаць некаторыя рэкамендацыі ў правільным кірунку, і матываваны, каб навучыцца кадаваць і пісаць уласнае праграмнае забеспячэнне, забраць гэтую кнігу дадому і адкласці некаторы час, каб навучыцца ствараць наступнае, магутнае, упарадкаванае і важнае вэб -прыкладанне, на сайце, якое ёсць на вас, і робіць менавіта тое, што вы хочаце, і задаволіць патрэбы.
Пра мяне: Я распрацоўшчык праграмнага забеспячэння з шырокім спектрам вопыту ў C/C ++, Java, Python, HTML, CSS і JavaScript. Я будую вэб -сайты, якія людзі хочуць выкарыстоўваць, хачу наведаць і нават захапляцца выкарыстаннем проста для навучання, узнаўлення і забойства часу, і самае галоўнае, я прадаю праграмнае забеспячэнне. Калі ў вас было ўяўленне пра тое, як менавіта вы хацелі, каб вэб-сайт выглядаў і функцыянаваў, вы былі гатовыя падтрымаць мяне, каб я мог задаволіць свае ўласныя патрэбы, пакуль я сустракаюся з вашымі, і вы гатовыя пакрыць выдаткі на запуск сайта самастойна, я б стварыў вам наступны YouTube, Tiktok, Twitter, Google ці нават прыкладанне высокатэхналагічнай бяспекі. Замест таго, каб спрабаваць прадаць вам свой час, я спрабую купіць ваш: я хачу пагаварыць пра стварэнне прыкладання (вэб -сайт) самі з інфармацыяй, якая ўжо існуе, і навучыць вас, што вам трэба, каб быць незалежным распрацоўшчыкам праграмнага забеспячэння, прадпрымальнікам, які вядзе паспяховую кар'еру ў любой сферы. І дазвольце мне быць зразумелым, адукацыя, якую я даю вам, будзе нефармальнай. Вы можаце пайсці ў школу і даведацца пра ўсё гэта з афіцыйнай адукацыяй ці нават прачытаць гэтую кнігу ў школе, выканаць свае заданні і забраць шмат у вашай адукацыі, але я афіцыйна не паставіў вас на гарачае месца і прашу вас выканаць заданні. Я не ваш прафесар, вы можаце думаць пра мяне, як пра сябра, які хоча накіроўваць вас да кар'еры, якую рухае ваш асабісты поспех. І я таксама не прадаю вам поспех, вам трэба будзе купіць яго ў свой час. Навучанне кода мае стромкую крывую навучання і ніколі не было простым і нават павінна быць. Вам трэба працаваць як мага больш цяжка, і працягвайце спрабаваць праваліцца і паспрабаваць яшчэ раз, нават калі вы расчараваны, каб вучыцца і ствараць прыкладанні самастойна. Гэта ў прыродзе самога кода. Код кіруе кампілятарам, прызначаным для прадастаўлення праграмістам паведамленняў пра памылкі, і яны навучаць вас, як кадаваць, нават калі вы проста капіруеце памылку ў пошукавую сістэму і чытаеце прыклады іншых людзей. І трэба сказаць, што вам не трэба быць надзвычай багатым, разумным, паспяховым ці нават падрабязна арыентаваным альбо арганізаваным для стварэння прыкладання. Кампутар клапоціцца пра гэтую арганізацыю для вас. Вам проста трэба настойваць праз спробы і памылкі, падтрымліваць увагу і працаваць над тым, што вы робіце, і ў вас будзе вельмі паспяховая кар'ера ва ўсім, што вы робіце.
Хто я: Я разумею, што апошні раздзел быў больш пра навучанне, і вы ідзяце спосабы з гэтай кнігі. Хто я дакладна? Гэта складанае пытанне. Мне гэта незразумела, бо я пакутую ад медыцынскіх умоў, якія могуць зрабіць мне цяжка нават кадаваць альбо пісаць гэтую кнігу часам, прадстаўляючы праблемы з сацыялізацыяй і праблемамі ідэнтычнасці, якія абцяжарваюць маё жыццё, калі гаворка ідзе пра тое, каб прадставіць сябе. Карацей кажучы, калі вы чытаеце гэтую кнігу, вы прывезлі яе дадому, таму што вы перавярнуліся праз яе і думалі, што гэта карысна, альбо нават калі вы проста прачыталі так далёка, для вас, я падобны на тое, хто хоча бачыць, што вы атрымаеце поспех ва ўсім, што вы робіце. Я сам інжынер, распрацоўшчык праграмнага забеспячэння і студэнт, і я пішу гэтую кнігу для іншых студэнтаў, якія хочуць палегчыць сваё жыццё, маючы даведнік па праграмным забеспячэнні, якое ім трэба зрабіць больш простым, даючы прыклады, каб капіяваць, як вялікая галаваломка, у працоўную, карысную, вялікую, функцыянальную, згуртаваную і прыцягнеце да поспеху, што можа прывесці да поспеху, якая адпавядае бізнесу. Шмат у чым гэта тое, што я раблю: я будую прыкладанні, каб дапамагчы сабе і іншым людзям дасягнуць поспеху. Я таксама аўтар, хаця гэта мая першая публікацыя, якую я маю намер завяршыць, каб сабраць свой партфель у карысны дакумент, і я таксама мастак. Я прызнаю гэта вам, я нейкі дзіўны чалавек. Я не дасканалы, я кіраваў законам, нават прымушаючы мяне пакідаць каледжы і універсітэты і пакінуць дзяржавы, каб паспрабаваць зрабіць сабе імя з большым поспехам. Я па нараджэнні жанчыны, ношу макіяж, фатаграфую сябе, апранайце сукенкі і іншую жаночую вопратку, і я па сваёй сутнасці ўсведамляю сябе як жанчыну. У мінулым у мяне былі праблемы з іншымі людзьмі, якія прыводзілі да барацьбы з напісаннем і стварэннем вэб -аптэкаў, і я прашу прабачэння, што мне не ўдалося атрымаць гэтую кнігу ў вашых руках раней: вам гэта спатрэбілася. Вы хочаце прачытаць і пісаць код, які падобны на мой і працуе як маё, і робіць тое ж самае, але яшчэ лепш, таму што, калі вы можаце дазволіць сабе купіць гэтую кнігу, а не разбіраць клавіятуру, як я проста, каб стварыць кнігу самі, просячы грошы, у вас ёсць рэсурсы, неабходныя для дасягнення поспеху ў сваім жыцці. У мяне былі ўсялякія праблемы з ростам сям'і, станамі здароўя, лекарамі, сродкамі масавай інфармацыі і законам, і мой код глыбока адлюстроўвае барацьбу, якая з'яўляецца фемінізмам і жаночай прыродай у падзеленым і расчараваным свеце. Аднак гэтая кніга - гэта тое, пра што я глыбока хвалююся, маё дзіця, мой партфель і маё існаванне, таму я цаню ваш разгляд, калі вы бярэце тэкст дадому і старанна пераадольвае яго, каб даведацца ад мяне. Калі ласка, майце на ўвазе, што я не ідэальны, у гэтай кнізе будуць памылкі, перагляды і новыя выданні, і вам трэба будзе думаць са сваім лагічным мозгам як мага лепш, каб мець паспяховы досвед працы з маім напісаннем. Акрамя таго, зразумейце, што я маю на ўвазе для вас, нават калі вы сутыкаецеся з праблемамі пры напісанні. Падумайце пра гэта так: калі вы можаце проста арандаваць камп'ютэрную сістэму, каб зрабіць усё, што вы можаце сабе ўявіць у лічбавай прасторы, захоўваць усю інфармацыю, з якой вы сутыкаецеся, аналізуйце і арганізуйце яе, і зразумееце яе, вы непазбежна сутыкнецеся з цяжкасцямі з інфармацыяй, якую вы пражываеце, і нават публікуеце. Я кажу вам пра гэта, таму што я сутыкаюся з тымі ж цяжкасцямі. Выкарыстоўвайце гэтую кнігу на свой страх і рызыку, працуйце са сваёй супольнасцю і супольнасцямі, даступнымі вам для стварэння праграмнага забеспячэння ў бяспечнай абстаноўцы, і не прымайце рэчы асабіста, калі вы не атрымаеце і нават не атрымаеце поспеху няправільна: вось як я дабраўся да гэтага часу, і чаму я магу прынесці вам гэты тэкст і дапамагчы вам дасягнуць поспеху, не разыходзяцца на шляху вар'яцтва, які пакідае мяне сапсаваным, разарваны і разбіты, калі я сутыкаюся з звычайнымі праблемамі, усе робяць у глабальным маштабе дзякуючы сусветнай глабальнай сетцы, якая разарвалася ў сетцы, якая разарвалася, і мы разбіліся, калі я сутыкаюся з звычайнымі праблемамі, усе робяць у сусветнай маштабе дзякуючы сусветнай глабалі, якая расказана, што ў паралелістычнай ракавіне, якая разарвалася, на сетцы. Праца, Інтэрнэт. Вы можаце быць не вельмі знаёмыя з тым, хто я з некалькімі словамі, але я заклікаю вас чытаць далей, вы пазнаёміцеся са мной, калі вы будзеце працягваць чытаць і разумець мяне, будуючы свае ўласныя праекты, каб завяршыць вашу працу. З гэтай кнігай не будзе хатняга задання, пакуль вашы прафесары ці выкладчыкі не прызначаюць вам, але я настойліва рэкамендую вам стварыць партфель праектаў, калі вы чытаеце, а таксама праект Capstone, які дэманструе, як вы можаце прымяніць тое, што вы даведаліся. Мой праект Capstone з'яўляецца асновай для большасці таго, што вы будзеце чытаць у гэтай кнізе, бо ён уключае ў сябе код з маіх папярэдніх праектаў, код, які я стварыў і навучыўся пісаць метадычна ўручную, і шырокі спектр ідэй і парад, якія дапамаглі мне дасягнуць поспеху ў той момант, калі я магу закруціць простае прыкладанне, якое цалкам прадстаўлена і выглядае як папулярнае прыкладанне, якое вы можаце бачыць, як ваш сябар ці сям'я выкарыстоўваюць, выкарыстоўваючы ў Інтэрнэце, рэкламуемы, рэкламаваны вам, альбо ў навінах.
Што такое кніга: Гэтая кніга - гэта падручнік па прыкладзе. Вы можаце знайсці код тут, інструкцыі, як навучыцца кодаваць, інфармацыю пра адладжванне кода і замацаваць памылкі, ліквідацыю непаладак, інструкцыі, як зрабіць рэзервовую копію і захаваць свой код, пераасэнсаваць, калі хто-небудзь парушыць ваш код, замацуйце свой код, разгарніце свой код, будуйце інтэрактыўныя вэб-сайты, якія забаўляюць, займаюцца і залежаць, і вы атрымаеце пачуццё таго, хто я, чаму гэта важнае Праграмнае забеспячэнне, якое вы ствараеце ў абсалютным лепшым святле, каб быць найбольш прывабным для канчатковых карыстальнікаў, наведвальнікаў вашага сайта. У гэтай кнізе я прадэманструю шэраг прыкладаў дызайну праграмнага забеспячэння з акцэнтам на Інтэрнэт як платформу, а таксама бяспеку. Мы ініцыяваем вопыт навучання, стварыўшы асноўны праект, выкарыстоўваючы Shell Unix, з рэзервовымі і сцэнарнымі функцыямі. Затым мы разгледзім асноўны вэб -сайт блога, абнавіць наш блог з дапамогай фатаграфій і відэа функцый, а таксама будзем выкарыстоўваць гэтыя функцыі для выкарыстання рашэнняў па бяспецы з дапамогай бясплатнага праграмнага забеспячэння і замацуеце наш сервер, выкарыстоўваючы падключэнне модуля аўтэнтыфікацыі (PAM). Затым мы разгледзім апрацоўку і апрацоўку файлаў, вывучаючы рэдагаванне відэа, галасавое ахвяраванне, сканаванне штрых -кода і аптычнае распазнаванне сімвалаў, сярод іншых канцэпцый. Па шляху мы разгледзім API, якія дапамогуць нам зрабіць наша праграмнае забеспячэнне больш карысным і бяспечным, з бясплатнымі і платнымі варыянтамі. Па шляху мы будзем вывучаць фізічную бяспеку і баевістыя інструменты, такія як агнястрэльная зброя і дызайн боепрыпасаў, уключаючы дызайн бочкі і рэтранслятара, дызайн вежы і беспілотніка, а таксама іншыя дырэктары, якія мы будзем інтэгравацца з нашым праграмным забеспячэннем у існуючай сетцы, каб абараніць наша праграмнае забеспячэнне і прадэманстраваць самаабарону і перасылку. Мы зробім перапынкі па шляху да стварэння гульняў, 2D і 3D -рэндэрынгу рухавікоў і працуем з убудаваным абсталяваннем у выпадку, калі вывучайце прыклады асноўнага праграмнага забеспячэння для вымярэння і электронным вібрацыйным масавым, кінутым у сіліконавай каўчуку адпаведна. Па шляху мы таксама будзем выкарыстоўваць рашэнні для машыннага навучання, ужо даступныя, каб лепш замацаваць наша праграмнае забеспячэнне. Мы таксама будзем выкарыстоўваць акцыі, даступныя для Інтэрнэту, каб упарадкаваць і замацаваць працэс. Гэтая кніга з'яўляецца кіраўніцтвам вашага поспеху ў будаўніцтве вэб -прыкладання і інтэграцыі яго з прафесійнай сеткай камп'ютэрных і ўбудаваных механічных сістэм, а таксама ў цэлым кіраўніцтва па будаўніцтве праграмнага забеспячэння і ўбудаванага абсталявання без ведаў і папярэдняга вопыту.
Што гэтая кніга не: Калі вы сапраўды хочаце мець вэб -сайт, вы можаце проста наладзіць просты краму і прадаць тое, што вам трэба, размясціць блог, размяшчаць фатаграфіі ці відэа ці іншае, не пішучы ніводнага радка кода. Гэтая кніга не такая. Гэтая кніга навучыць вас будаваць праграмнае забеспячэнне, якое з'яўляецца больш карысным, цалкам прадстаўленым, функцыянальным і бяспечным, чым любое праграмнае забеспячэнне, якое вы ўжо можаце знайсці, паколькі ён разгортвае найноўшае праграмнае забеспячэнне, якое па -ранейшаму з'яўляецца прататыпам, можа быць дарагім для таго, каб працаваць па маштабе, якія працуюць старэйшыя кампаніі, і не звяртаецца да зваротных, збянтэжаных кампаній, створаных, каб зарабіць грошы для людзей, якія на самай справе нічога не робяць. Калі вы ўважліва сочыце за гэтай кнігай, вы хочаце напісаць код, даследчы код, стварыць уласныя прыкладанні, і вы будзеце зарабляць грошы з таго, што робіце. Я буду зарабляць грошы з гэтай кнігі, нават на ранніх этапах, таму што яна змяшчае інфармацыю, якую трэба людзям, якія маюць патрэбу і хочуць чытаць, і ўжо купляюць, калі яны купляюць ці выкарыстоўваюць мае прыкладанні. Гэтая кніга не пабудуе прыкладанне для вас, але яна будзе паказваць вам у правільным кірунку і ўзброіць вам неабходныя інструменты, а таксама навыкі і парады, якія будуць садзейнічаць вашаму поспеху ў будаўніцтве праграмнага забеспячэння для Інтэрнэту, з кожным радком кода, які вы павінны пісаць у якасці прыкладу, гатовых быць укладзены ў праграмнае забеспячэнне, якое вы і вашыя прыхільнікі, госці, кліент, сябры, наведвальнікі, падрадчыкі і людзі, якія хочуць карыстацца.
Што вы даведаецеся: Гэтая кніга навучыць вас ствараць і прадаваць праграмнае забеспячэнне, сапраўды функцыянальнае, карыснае праграмнае забеспячэнне, запісы сродкаў масавай інфармацыі, функцыі бяспекі, такія як распазнаванне асобы, машыннае чытанне зоны штрых -кода, вэб -API для праверкі сапраўднасці, запісу і адлюстравання відэа і фатаграфій, а таксама абмену паведамленнямі, такімі як Bluetooth і побач з полем (NFC). This book will teach you how to use a networked computer, focusing on debian linux, how to build bash code to make installing and backing up your software a seamless, automated breeze, how to build python code as a backend to serve dynamic messages, style things nicely using CSS styles with Bootstrap, enable user logins and interactivity through networked devices, build interactive media and network with other websites to offer security features like text messages Для праверкі ці іншых мэтаў, сканаванне ідэнтыфікатараў, мадэрацыю малюнкаў і відэа, мікрапрацы дадзеных, каб захаваць праграмнае забеспячэнне ў бяспецы, апрацоўку плацяжоў, гандаль криптовалютай, асінхронныя задачы і шмат іншага. Вы даведаецеся, як ствараць уласныя прылады Bluetooth з батарэямі, зараднай прылады, мікракантролерамі, схемамі, рухавікамі і датчыкамі, пры дапамозе прыпоя, дроту і 3D -надрукаваных, а таксама адлітых матэрыялаў. Я прадэманструю прынцыпы 3D -дызайну, якія прымяняюцца да вытворчасці і вырабу інструментаў, і вы зможаце вырабляць свае ўласныя ўбудаваныя, апаратныя прылады з інтэграванымі батарэямі, зарадных прылад, электроннымі схемамі і функцыянальнымі выхадамі. і наладжвайце іх з Bluetooth і ў Інтэрнэце. У прыватнасці, мы разгледзім два тэматычныя даследаванні, вібрацыйны масажыр і хатняе агнястрэльная зброя, якую запраграмаваны ў OpenScad, які даступны ў якасці графічнага інтэрфейсу або ўтыліты каманднага радка і можа быць інтэграваны ў Інтэрнэт для больш хуткага вынікаў. Вы даведаецеся, як будаваць і разгарнуць вэб -сайт з нуля без папярэдняга вопыту, зрабіць яго функцыянальным, бяспечным, прыгожым, карысным і галоўным практычным. Вы даведаецеся, як выкарыстоўваць машыннае навучанне і камп'ютэрнае зрок, каб зрабіць сайт бяспечным і больш практычным, запісы відэа і аўдыё з вашага сайта, ахвяраваць свой голас, стварыць музыку і мадулюйце аўдыё, каб стварыць карысную ўзоры, і як прарвацца праз шум, выкарыстоўваючы іншыя вэб -сайты, каб стварыць найлепшую сетку вэб -сайтаў, якія вы можаце звязаць непасрэдна з вашым, каб падзяліцца ўсёй карыснай інфармацыяй, якую вы прапануеце, а яшчэ больш важна прывесці людзей да вашага праграмнага забеспячэння. Гэтая кніга будзе ў значнай ступені сканцэнтравана на сродках масавай інфармацыі, бяспецы і машынным навучанні, якія з'яўляюцца асноўнымі трыма кампанентамі, якія дапамогуць вам стварыць карыснае праграмнае забеспячэнне для Інтэрнэту, прыцягваючы патрэбных карыстальнікаў і выключаючы няправільных спосабам, які з'яўляецца рэалістычным, практычным, ручным і прывабным, а таксама аўтаматычным і трывалай. Гэтая кніга вучыць UNIX, у прыватнасці, Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript і шэраг карысных праграмных пакетаў для Python, як запыты, а таксама карыснае праграмнае забеспячэнне Bash, як GIT і FFMPEG. Я таксама навучу вас, як аўтаматычна гандляваць криптовалюту і браць плацяжы ў криптовалюце альбо з звычайных дэбетавых карт, нават выплачваючы наведвальнікам долю вашых даходаў, калі вы вырашыце зрабіць гэта. Я навучу вас зарабляць грошы з вашага сайта праз рэкламу, як гатовы падрыхтоўку прыкладання для пошукавых сістэм і зрабіць яго хуткім, рэйтынг у першым рэйтынгу для таго, што вашы кліенты будуць шукаць, каб знайсці вас, і рэйтынг як мага больш распаўсюджаных пошукаў. Я навучу вас прадаваць сваё праграмнае забеспячэнне, рэкламую яго, звяртаюся да кліентаў, якія шукаюць свае паслугі, і зрабіць сабе імя ў Інтэрнэце праз праспекты, якія ўжо існуюць, недарагія і добра працуюць. Я навучу вас захаваць свае дадзеныя на хмарных кампутарах, якія працуюць на вас, і захоўваць свае дадзеныя танна, як планаваць і ствараць вэб -сайт, які робіць тое, што хочуць вашы карыстальнікі, і што вы хочаце, і як трымаць карыстальнікаў, якія займаюцца сваім сайтам, націсніце на свае тэлефоны з паведамленнямі, электроннай поштай, тэкставымі паведамленнямі, тэлефоннымі званкамі і больш, каб вярнуць карыстальнікаў на ваш сайт, каб ваш сайт зацікаўлены за націскам на кнопку, прызначаную вам толькі. Гэтая кніга будзе прысвечана практычнасцю публікацыі і распаўсюджвання сродкаў масавай інфармацыі ў вялікіх колькасцях: ад тэксту да фотаздымкаў да відэа да аўдыё, вырабляючы добрае ўражанне на канчатковых карыстальнікаў (кліентаў), і прадаваць сябе любым спосабам, каб стварыць вэб -сайт, прыкладанне, якое прадстаўляе вас і вас толькі, і робіць вас, вашай праграмнай праграмы і вашай кампаніі добра выглядаць як мага лепш. Вы таксама даведаецеся некалькі парад і рэкамендацый ад мяне: ад парады па кадаванні, практычнай ганарыстасці, такіх як макіяж і фатаграфія, мадэляванне і акцёрскае майстэрства, і многае іншае, што будзе важна для адлюстравання сябе і вашай кампаніі ў найлепшым святле, выкарыстоўваючы ўсе інструменты, даступныя вам пры распаўсюджванні столькі зместу, колькі вам трэба ў здаровым балансе платформаў, каб прыцягнуць да сябе праграмнае забеспячэнне, не маючы больш за ўсё, выкарыстоўваючы ўсе інструменты, даступныя вам пры распаўсюджванні такой колькасці зместу, колькі вам трэба ў здаровым балансе платформаў, каб прыцягнуць да сябе праграмнае забеспячэнне, не маючы больш за ўсё, выкарыстоўваючы ўсе інструменты, даступныя вам, пры гэтым раздача. Гэтая кніга называецца "практычнайWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Удасканаленне, загаловак выявы і іншыя задачы, такія як паказчыкі прагназавання, атрыманыя з малюнкаў, такіх як характар малюнка ў якасці сапраўднага, кампутарнага малюнка, альбо аптычная копія (фатаграфія выявы альбо друкаванае фота). З вашым тварам. выкарыстоўваць). Кожны, хто стварае праграмнае забеспячэнне, якое бездакорна бяспечна, мае пэўнае разуменне таго, што гэта мае на ўвазе. Праграмнае забеспячэнне па сваёй сутнасці з'яўляецца небяспечным, паколькі прылады і ўліковыя запісы, якія мы выкарыстоўваем для яго доступу, не заўсёды знаходзяцца ў нашым распараджэнні, яны могуць быць у руках тых, хто мае дрэнныя намеры да праграмнага забеспячэння, і таму могуць прадстаўляць рызыку для самога праграмнага забеспячэння. Гэта нешта ў цэнтры ўвагі гэтай кнігі. Сеткавы кампутар па змаўчанні забяспечаны доўгім ключом, які называецца і SSH або Secure Shell Key, і ў адваротным выпадку лепш замацаваны вэб -сервер, таму што вэб -сервер забяспечвае адкрыты доступ, а таксама інструменты бяспекі мастацтва, якія працуюць на самім серверы. Вэб -сервер мае доступ да вэб -браўзэра карыстальніка, які, магчыма, з'яўляецца самай магутнай часткай прылады карыстальніка, таму што гэта месца, дзе карыстальнік можа атрымаць доступ да сеткавага праграмнага забеспячэння. Гэты інструментар можа адлюстраваць тэкст, вэб -старонкі, якія вы бачыце, а таксама могуць запісваць выявы, аўдыё і відэа (напрыклад, фатаграфію асобы ці ідэнтыфікатара стану), могуць чытаць і пісаць на радыё -прылады Bluetooth, а таксама прачытаць і пісаць у блізкія полявыя транспондэрныя тэгі, недарагая ключавыя карты, падлогі, налепкі, кольцы і нават імплантацыі з унікальнымі серыйнымі нумарамі, якія могуць быць чытанымі і напісанымі дадзенымі з дадзенымі, праведзенымі і прапісанымі ў Інтэрнэце. Выкарыстоўваючы ўсе інструменты ў вашым распараджэнні, з гэтай кнігай вы будзеце абсталяваць сябе ведамі для стварэння бяспечнага вэб -сайта, і ў цэлым бяспечную сеткавую камп'ютэрную сістэму, якая працуе для вас, робіць свае таргі і выглядае і адчувае сябе
З чаго пачаць: Вы можаце прапускаць міма раздзела, з якім я пачынаю гэтую кнігу, альбо ў любым раздзеле, да дакладнага кода, які вам патрэбны, асабліва калі ў вас ёсць досвед працы з кадаваннем раней, альбо любы з вышэйзгаданых інструментаў, якія я падрабязна апісаў у гэтай кнізе, а таксама дакументаваць выпадкі выкарыстання і практычныя прыклады. Калі ў вас няма вопыту ў напісанні кода, настойліва рэкамендую вам прачытаць усю гэтую кнігу, і асабліва рэкамендую вам прачытаць папярэднія раздзелы, каб пераканацца, што гэтая кніга падыходзіць вам. Калі гэтая кніга не падыходзіць вам, падумайце пра тое, каб зрабіць яго сябрам ці сваяку, які можа быць зацікаўлены ў тым, каб даведацца пра самі па Інтэрнэце, і нават разгледзець пытанне аб тым, каб запазычыць яго і навучыцца ў іх запоўніць прабелы, дзе я не падвяргаў вам настаўніка, альбо іншыя настаўнікі зрабілі перада мной. Пачніце там, дзе хочаце, кожная частка гэтай кнігі будзе карыснай, калі вы збіраецеся стварыць карыснае прыкладанне, і ўлічыце, што лепшыя прыкладанні пабудаваны з улікам канчатковага карыстальніка: ведайце свайго кліента. Цяпер вы мяне ведаеце, вы ведаеце гэтую кнігу, і вы гатовыя пачаць. Для пачатку вазьміце кампутар (нават самы танны ноўтбук з крамы скрынкі, Amazon або стары працоўны стол, і ўсталюйце яго такім чынам, што працуе для вас.
Як чытаць гэтую кнігу: Тэкст выдзелены, абазначае, што тэкст належыць у камандным радку, дзе вы напішаце код, які вы запусціце. Камандны радок у значнай ступені сканцэнтравана на клавіятуры і патрабуе практычнага націску, паскараючы працоўны працэс і палягчае вам усё.
Пачатак працы: Давайце пагрузімся. Мы пачнем з будаўнічага кода на лакальнай машыне і пачнем, не будуючы вэб -сайт, падлучаны да Інтэрнэту. Гэта бяспечней для пачатку, нічога не каштуе, і вам лёгка. У залежнасці ад вашай аперацыйнай сістэмы, увайсці ў абалонку баша будзе крыху адрознівацца. Для Mac OS я рэкамендую ўсталяваць віртуальную машыну ў гэты момант, бо вы атрымаеце найбольшую сумяшчальнасць з віртуальнай машынай. Розныя правайдэры, такія як VirtualBox і Paralells, могуць запусціць для вас віртуальную машыну, хаця таксама можна ўсталяваць Ubuntu непасрэдна на машыну, калі вы аддаеце перавагу выкарыстоўваць родную сераду, якую рэкамендуецца для стварэння хуткага і ўпарадкаванага вопыту. Калі вы выкарыстоўваеце Linux або Windows, што я рэкамендую, стварыць праект вельмі лёгка. Адкрыйце тэрмінал, адрэгулюйце памеры, як вы лічыце патрэбным, і пачніце наступны крок 2. Калі вы выкарыстоўваеце Windows, калі ласка, выканайце крок 1.
Крок 1: - Толькі карыстальнікі Windows У Windows адкрыты камандны радок у якасці адміністратара і тыпу wsl –install
Крок 2: - Працягвайце тут, альбо прапусціце крок 1 сюды, калі вы не карыстаецеся Windows У адкрытым тэрмінале (у залежнасці ад вашай АС, якая называецца Ubuntu ў Windows, Terminal у Mac або Linux, альбо падобнай назве), пачніце з стварэння праекта. Мы робім гэта з камандай MKDIR, якая стварае каталог. Калі вам трэба стварыць каталог для захоўвання свайго праекта, які рэкамендуецца, выкарыстоўвайце каманду CD, каб перайсці ў каталог і і
CD/PATH/TO/DIRECTORY - Шлях - гэта папкі (файлы), якія папярэднічаюць вашаму каталогу прызначэння, ваш шлях па змаўчанні ~ або/дома/імя карыстальніка (дзе імя карыстальніка - ваша імя карыстальніка). Каб перайсці ў каталог па змаўчанні, увядзіце CD або CD ~ Прыклад MKDIR - Замяніце "Прыклад" на імя каталога
Цяпер у вас ёсць працоўны каталог для вашага праекта. Будучы так, як так важна захаваць гэты каталог у выпадку, калі вам трэба перайсці на іншую машыну альбо разгарнуць код, які вы пішаце, каб ён быў гатовы да Інтэрнэту, мы пабудуем сцэнар, каб зрабіць рэзервовую копію каталога ў наступныя некалькі крокаў. Але стварэнне сцэнарыя патрабуе крыху кода, і код трэба аўтаматызаваць, каб быць максімальна карысным. Такім чынам, давайце пабудуем сцэнар для стварэння сцэнарыяў спачатку. Пачнем з стварэння сцэнарыя і зробленага яго выкананым. Мы будзем выкарыстоўваць Sudo, Chmod і дакранацца да гэтага і назавем сцэнар "Ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Цяпер мы стварылі сцэнар, зрабілі яго выкананым і гатовы рэдагаваць яго. Nano - гэта тэкставы рэдактар, які дазволіць вам рэдагаваць тэкст без націску, што значна прасцей, чым выкарыстанне графічнага карыстацкага інтэрфейсу. Каб адрэдагаваць файл з Nano, выкарыстоўвайце Nano, а затым шлях да файла. Каб зрабіць сцэнар, які робіць сцэнар, ён даволі падобны на стварэнне нашага сцэнарыя ў першую чаргу. Мы будзем выкарыстоўваць той жа код, што і вышэй, замяніўшы імя сцэнарыя, "Ascript" параметрам аргумента, 1 долар. Гэта дазваляе нам патэлефанаваць у сцэнар, набраўшы проста Sudo Ascript Newscript, і ў гэты момант мы можам стварыць любы новы сцэнар, замяніўшы "навін" на імя вашага сцэнарыя. Код у Nano павінен выглядаць:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
І каб закрыць Nano, мы можам утрымліваць клавішу кіравання і націснуць X, а потым y, каб абазначыць, што мы захоўваем файл і ўдарылі вяртанне. Цяпер, замест таго, каб набіраць гэтыя тры каманды для рэдагавання сцэнарыя, мы зможам набраць Ascript sudo Ascript для рэдагавання сцэнарыя. Гэта працуе! І любы новы сцэнар можна лёгка запусціць, патэлефанаваўшы ў яго ў абалонку. Давайце захаваем нашу працу зараз: давайце напішам рэзервовы сцэнар, каб захаваць наш новы сцэнар, а потым зрабіць рэзервовую копію ў нашым каталогу праектаў, адначасова рэзервовую рэзервовую копію сцэнарыя.
sudo ascript backup
Цяпер у Nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Дзе/шлях/да каталога - гэта шлях да праекта, які вы стварылі з MKDIR. Пазней мы даведаемся, як капіяваць паўторныя шляхі, падобныя на гэты цыкл і спіс, які менш код, але пакуль давайце зробім яго простым і будзе некалькі радкоў. Каб запусціць гэты сцэнар і рэзервовую копію кода, захавайце файл у Nano з дапамогай кіравання+x, y і вярніцеся, і ўвядзіце ніжэй у вашу абалонку
backup
Калі вам прапануецца наогул для пароля пры чытанні гэтай кнігі і наступным чынам у абалонцы, калі ласка, увядзіце пароль карыстальніка правільна, у вас будзе тры спробы, перш чым вам трэба будзе паўторна запусціць каманду. Вы можаце выкарыстоўваць стрэлкі ўверх і ўніз, каб паўтарыць каманды і рэдагаваць іх, калі вам трэба будзе запусціць што -небудзь двойчы. Просты перарывіста націсніце ўверх і ўніз, каб выбраць каманду, перш чым рэдагаваць каманду з правай, левай стрэлкамі і выдаліць клавішу, а таксама клавіятуру, і запусціць яе з вяртаннем.
Віншуем! Вам удалося стварыць дзіўны сцэнар рэзервовага капіявання, які стварае рэзервовую копію двух важных сцэнарыяў абалонак у працоўным каталогу. Мы можам перанесці рэчы пазней, калі праект становіцца ўсё большым, але гэта працуе пакуль. Давайце пяройдзем да рэзервовай копіі ў воблаку, мы будзем выкарыстоўваць для гэтага GitHub (хаця ёсць мноства іншых рашэнняў GIT для рэзервовага капіявання, яны ўсё адно і тое ж.) GIT - гэта праграмнае забеспячэнне Verision Control, якое дазваляе рэзервовым капіраваннем правак у сваё праграмнае забеспячэнне, калі вы робіце іх на сервер, а таксама дазваляюць вам загрузіць цэлыя копіі праграмнага забеспячэння за паролем або ключом. Гэта важнае значэнне для захавання вашага праграмнага забеспячэння, тым больш, што мы мігруюць у замацаваныя асобнікі Linux, якія часам ламаюцца, калі адзін радок кода не працуе, пакідаючы вас заблакаваным, у той час як ваш код не можа быць падмацаваны, калі вы не атрымаеце магчымасці аўтаматычна рэзервовага капіявання, што мы пакрыем.
Калі ў гэты момант вы яшчэ не выкарыстоўваеце віртуальную машыну Ubuntu, я рэкамендую, выкарыстоўваючы віртуальную машыну Ubuntu на гэты момант, таму што гэта палегчыць вам жыццё пры ўсталёўцы ўсіх пакетаў, неабходных для стварэння працоўнага сайта і наладжвання глыбокіх аперацый на вашым кампутары. У бліжэйшы час мы перанесем код на вэб -сервер, але мы хочам пераканацца, што за нашым вэб -серверам ёсць па меншай меры некалькі слаёў бяспекі, якія ўстойлівыя да фішынгу, і для гэтага выкарыстоўваюць шэраг пакетаў Linux. Калі вы ўсё яшчэ хочаце выкарыстоўваць Mac OS, вы можаце шукаць і ўсталяваць неабходныя пакеты ў Інтэрнэце, але могуць быць альтэрнатывы для кожнага пакета гэтай кнігі ці серыі.
Давайце дадамо некалькі каманд, каб здзейсніць нашу працу са сцэнарыям рэзервовага капіявання, запусціўшы каманду Sudo Ascript Backup.
# ...
Яшчэ раз кіруйце X, каб захаваць.
Цяпер нам трэба зрабіць нейкую аднаразовую канфігурацыю для гэтага праекта. Паколькі ў хуткім часе гэта будзе праект GIT, нам не трэба ўводзіць кожную каманду кожны раз, калі мы разгортваем з сховішча GIT, але мы атрымаем гэта, калі мы пішам сцэнарыі разгортвання. Для пачатку, давайце пераканайцеся, што мы знаходзімся ў правільным каталогу і ініцыялізуем сховішча GIT і стварым клавішы SSH.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Пасля таго, як мы набіраем SSH-Keygen, новы ключ павінен быць захаваны ў тэчцы хатняй тэчкі пад назвай .SSH. Яго называюць id_rsa.pub. Давайце знойдзем гэты ключ і скапіруйце яго. Каб убачыць гэта,
cd ~
cat .ssh/id_rsa.pub
Скапіруйце тэкст, які вяртаецца апошняй камандай, і стварыце ўліковы запіс з пастаўшчыком GIT (у ідэале GitHub), перш чым дадаць ключ SSH у свой уліковы запіс. Пасля таго, як вы атрымаеце ўліковы запіс, націсніце ў верхнім правым меню і ўвядзіце налады, перш чым дадаць ключ SSH у клавішы SSH і GPG у меню. Выберыце Дадаць клавішу SSH і дадайце свой, усталяваўшы яго і даючы яму загаловак, перш чым захаваць і вярнуцца ў GitHub, каб стварыць новае сховішча. Гэта падобна для іншых пастаўшчыкоў GIT, вам трэба будзе прачытаць іх дакументацыю. У новай канфігурацыі сховішча, дайце вашаму рэпазітару апісальнае імя і вырашыце, ці хочаце вы яе апублікаваць, і пераканайцеся, што наладзьце файлы для ўключэння. Пасля стварэння сховішча скапіруйце клон з URL SSH і ўстаўце яго ў наступную каманду.
git remote add git://… (your remote URL)
Цяпер вы можаце пераехаць назад у свой рэпазітар з кампакт -дыскам, вы будзеце знаёмыя з гэтым. Паспрабуйце свой рэзервовы сцэнар зараз з рэзервовай копіяй
Цудоўна! Цяпер мы сапраўды можам атрымаць кадаванне. Давайце ўсталёўваем Django зараз, калі мы добра разумеем Bash and Git. Django дазволіць нам аўтаматычна ствараць рэзервовую копію нашага праграмнага забеспячэння, Bash таксама можа зрабіць гэта, але Django павінен мець больш больш бяспечную рэалізацыю (яго можна адключыць і наладзіць лягчэй).
Каб усталяваць праграмнае забеспячэнне ў Ubuntu, мы будзем выкарыстоўваць каманду Sudo APT-Get. Па -першае, давайце абнавім і абнаўляем праграмнае забеспячэнне, якое мы ўжо мелі. Гэта можна зрабіць з абнаўленнем Sudo APT-Get і Sudo APT-Get-Get-Get -y. Далей, давайце ўсталёўваем Python і наша віртуальнае асяроддзе, дом нашага кода, з наступнай камандай: sudo apt-get install python-is-python3 python3-venv
Гэта ўсё, што вам трэба, каб пайсці з Django з пункту гледжання ўстаноўкі праграмнага забеспячэння ў асобніку Ubuntu. Для Windows і Linux гэта павінна быць даволі проста, але для Mac вы можаце ўсталяваць на ёй віртуальную машыну і Linux, выкарыстоўваючы бясплатную або платную віртуальную сераду, напрыклад, VirtualBox або Paralells Desktop і ўзнаўляйце прыведзеныя крокі, каб наладзіць асяроддзе Ubuntu. У гэтым выпадку Ubuntu мае вырашальнае значэнне, паколькі гэта праграмнае забеспячэнне, якое працуе сайтамі, і гэта дазваляе ім размяшчаць сайты з усім вышэйзгаданым праграмным забеспячэннем.
Давайце паглыбімся ў Джанга.
У нашым каталогу зноў, з CD:
python -m venv venv # Стварае віртуальную сераду, дзе захоўваецца код
source venv/bin/activate # Актывуе віртуальнае асяроддзе
django-admin startproject mysite . # Там, дзе MySite - гэта праект, які я пачынаю ў сваім бягучым каталогу.
Django толькі прымушае нас працаваць, таму што Django прымае вэб -сервер і робіць усё, што трэба, каб атрымаць асноўны мясцовы вэб -сайт. Цяпер, калі ў нас усталяваны Django, давайце крыху адрэдагаем налады, каб ён працаваў, як нам трэба. Па -першае, давайце стварым новае прыкладанне
python manage.py startapp feed
Вы заўважыце, што першае прыкладанне называецца Feed. Дадатак трэба называць усё, што заўгодна, і мы будзем ствараць новыя прыкладанні, але назва кожнага прыкладання павінна быць паслядоўна кожны раз, калі прыкладанне спасылаецца на код. Каб дадаць новае прыкладанне, мы заўсёды будзем рэдагаваць налады. З выкарыстаннем Nano,
nano app/settings.py
У наладах знайдзіце ўсталяваныя_Apps і аддзяліце [] на 3 радкі. Выкарыстоўваючы чатыры прабелы на пустой цэнтральнай лініі, дадайце "Feed" альбо імя вашага прыкладання. У гэтым раздзеле налад.
INSTALLED_APPS = [
'feed',
]
Перш чым забудзем, давайце праверыць, што Джанга працуе. Выкарыстоўваючы каманду Python Manage.py Runserver 0.0.0.0:8000, мы можам запусціць сервер, а затым перамяшчацца ў вэб -браўзэр на кампутары, які працуе на кодзе на http: // localhost: 8000 і глядзіце прыклад вэб -старонкі (ён працуе!) Выйдзіце з сервера з кантролем C, гэтак жа, як і любая іншая каманда.
Зараз давайце паглыбімся, напісаўшы нейкі код Python. Django мае тры асноўныя кампаненты, усе яны цалкам кіруюцца кодам. Кампаненты называюцца мадэллю, праглядам і шаблонам, і кожны знаходзіцца на больш высокім і ніжэйшым узроўні адпаведна да таго, як вэб -старонка будзе дастаўлена карыстачу.
Мадэль - гэта код, які захоўвае інфармацыю ў базе дадзеных для пошуку, сартавання і рэндэрынгу.
Выгляд вырашае, як мадэль адлюстроўваецца, маніпулюе і мадыфікуецца, практычна кожны выгляд будзе выкарыстоўваць мадэль непасрэдна.
Шаблон - гэта код HTML з дадатковымі званочкамі, якія называюцца мовай шаблона. Шаблон адлюстроўваецца ў выглядзе, дзе ён запоўнены кодам Python і кантэкстам, такімі як мадэлі і інфармацыя (радкі Usuall і цэлыя лікі) з пункту гледжання.
У Django таксама ёсць іншыя кампаненты, у тым ліку, але не абмяжоўваючыся:
Налады, якія наладжваюць прыкладанне, як мы абмяркоўвалі.
URL, якія з'яўляюцца ўзорамі, якія карыстальнік выконвае, каб атрымаць доступ да пэўных частак вэб -прыкладання.
Формы, якія вызначаюць, як інфармацыя, якая адпраўляецца на сервер, апрацоўваецца і перадаецца ў базу дадзеных, а таксама карыстачу. Гэта аснова апрацоўкі інфармацыі на баку сервера і можа прыняць любы тып інфармацыі, якія камп'ютэрныя крамы, у першую чаргу тэкставыя радкі, нумары і праўдзівыя/ілжывыя булевыя (звычайна галачкі).
Шаблоны, якія ўяўляюць сабой код HTML і мова шаблонаў і пераадольваюць разрыў паміж Python і HTML, гэта значыць, інфармацыя Python можа быць пададзены ў якасці кода HTML, да якога кожны можа атрымаць доступ і можа забяспечыць вэб -сайт з абмежаваным доступам, робячы код Python даступным у Інтэрнэце і карысна для розных мэтаў на аддаленым прыладзе, які не павінен быць побач з серверам.
Статычныя файлы, якія звычайна з'яўляюцца JavaScript, і яго бібліятэкі, якія сервер абслугоўвае і звязаны з шаблонам.
Media Files, якія сервер абслугоўвае альбо знаходзіцца звонку, альбо проста запісаны на сервер, перш чым апрацоўваць і адпраўляць на іншы сервер (вядро) для хостынгу.
Прамежкавае праграмнае забеспячэнне, якое ўяўляе сабой часткі кода, якія працуюць у той жа час, што і кожны выгляд і лічацца "уключаны" ў выгляд.
Кантэкстныя працэсары, якія апрацоўваюць кантэкст кожнага выгляду і выкарыстоўваюцца для дадання дадатковага кантэксту.
Тэсты, якія пацвярджаюць, што карыстальнік або просьба праходзіць пэўныя патрабаванні да таго, як будзе зроблены выгляд.
Спажыўцы, якія дыктуюць, як спраўляюцца WebSockets і рэагуюць на зносіны.
Адміністратар, які выкарыстоўваецца для рэгістрацыі мадэляў, каб іх можна было падрабязна маніпуляваць на старонцы адміністратара Django, дзе базу дадзеных можна ўводзіць праз графічны інтэрфейс.
Салеры, які вызначае асінхронныя задачы, часткі кода Django могуць пачаць працаваць, перш чым неадкладна перайсці да наступнай задачы ці радка кода.
Django можа мець шмат іншых кампанентаў, якія мы падрабязна разгледзім тут. Існуе мноства спосабаў зрабіць Django больш функцыянальным, дадаючы WebSockets, якія з'яўляюцца хуткімі, упарадкаванымі каналамі сувязі, салеры, якія выконваюць асінхронныя задачы, і мноства іншых праграм для пашырэння Django, асабліва ў функцыях прагляду, дзе большасць кода выконваецца. Функцыі прагляду з'яўляюцца ключавымі, таму што яны звычайна абвяшчаюць кожны кавалак кода, характэрнага для пэўнага ўзору URL, альбо раздзела сервера.
Па -першае, давайце вывучым функцыі прагляду. Прагляд функцый пачынаецца з абазначэння кода імпарту, які будзе выкарыстоўвацца ў выглядзе, і вызначаюцца пры дапамозе рэгулярных вызначэнняў функцый або класаў. Самыя простыя прагляды вызначаюцца вызначэннем функцыі DEF і вяртаюць HTTPRESPONSE з асноўным шаблонам. Пачнем з вызначэння асноўнага прагляду, каб вярнуць тэкст "Прывітанне, свет". Памятаеце, што кожны раз, калі вы дадасце код пасля заявы, як DEF, калі, калі, для і г.д. Мы хутка ўступім у тое, што кожны з гэтых азначае.
З каталога нашага сайта адрэдагуйце файл Feed/Views.py з дапамогай Nano і дадайце наступныя радкі да канца файла.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
HttPresponse Django рэагуе тэкставай радкай, пазначанай з адкрыццём і закрыццём '. Кожны раз, калі вы перадаеце інфармацыю ў функцыю ці клас, напрыклад, запыт ці радок, вам трэба будзе выкарыстоўваць дужкі (, адкрыццё і закрыццё).
Гэта яшчэ не ўсё, што нам трэба паглядзець на наш погляд. Зразумела, мы не сказалі серверу, дзе менавіта выгляд, нам усё роўна трэба вызначыць шлях, па якім павінен быць зроблены выгляд. Пачнем з вызначэння асноўнага шляху ў дадатку/URLS.PY, і мы ўвойдзем у групы шляхоў пазней.
У App/urls.py дадайце радок пасля заяўкаў імпарту пасля пачатку імпарту, які мы толькі што стварылі.
from feed import views as feed_views
Зараз, давайце вызначым малюнак прагляду. Шаблоны маюць тры кампаненты, кампанент Path, які паведамляе серверу, дзе прагляд існуе ў серверы (шлях URL, які карыстальнік уводзіць у панэль навігацыі, каб увайсці ў вэб -старонку), кампанент прагляду, дзе ўказаны прагляд, і добразычлівая назва для прагляду, каб лёгка атрымаць яго ўзор, які працуе з шаблонам, таму ён можа быць зменена і абнавіць, калі гэта неабходна, каб зрабіць усё, каб зрабіць усё, каб зрабіць усё, каб зрабіць прагляд, альбо ўвайсці ў размову. Мае сэнс рабіць усё такім чынам і быць гнуткай, таму што ваша база кода стане пастаянна змяняецца асяроддзем, якая патрабуе гнуткасці і імправізацыі, каб быць каштоўнай і лёгка працаваць. Вось як будзе выглядаць ваш выгляд, вы можаце дадаць гэта ў urlpatterns = [Раздзел App/URLS.py. Шаблон выгляду вызначаецца з трыма апісанымі вышэй кампанентамі і функцыяй пад назвай шлях. Вашы ўзоры URL - гэта спіс, таму пераканайцеся, што заўсёды спыніце кожны элемент у іх коскай, таму што гэта аддзяляе кожны. Кожны элемент таксама павінен ісці па новай лініі, яшчэ раз з чатырма прабеламі перад ім, як і прыкладанне ў наладах. Мы вызначым першы кампанент прагляду з пустым функцыяй радка, каб стварыць выгляд, які працуе ў каранёвым каталогу вэб -сервера. Цяпер ваш URLS.PY павінен выглядаць так:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Гэта аснова для стварэння сайта з Django, які цалкам статычны. Для таго, каб зрабіць больш дынамічны вэб -сайт, на якім мы можам пачаць кэшаванне інфармацыі, напрыклад, выявы, відэа, аўдыё і шмат іншага, нам трэба будзе выкарыстоўваць мадэлі, якія мы будзем вывучаць далей. Пакуль што давайце праверыць наш код і запусцім сервер. Каб праверыць код на наяўнасць памылак, запусціце:
python manage.py check
Калі ёсць якія -небудзь паведамленні пра памылкі, вы павінны ўважліва перагледзець змены, якія вы ўнеслі ў сваё прыкладанне, і даведацца, ці ёсць што -небудзь, што трэба выправіць, напрыклад, старонні або адсутнасць прасторы, дадатковы сімвал, незарэгістраваную радок, любую памылку, любы выпадкова выдалены сімвал ці што -небудзь яшчэ. Чытаючы паведамленне пра памылку (калі ў вас ёсць), вы павінны мець магчымасць убачыць шлях да стварэння альбо адрэдагаванага файла разам з нумарам радка, таму паглядзіце ў гэты файл і радок і паглядзіце, ці можаце вы выправіць што -небудзь, што ёсць там. Калі вы выправілі праблему, запусціце вышэйзгаданую каманду яшчэ раз. Калі ваша праграмнае забеспячэнне будзе гатова да запуску і працуе, вы ўбачыце вывад "Праверка сістэмы не выяўлена ніякіх праблем". Цяпер вы гатовыя ісці. Запусціце сервер з:
python manage.py runserver 0.0.0.0:8000
Цяпер адкрыйце вэб -браўзэр і перайдзіце да http: // localhost: 8000. Вы павінны ўбачыць тэкст, які вяртаецца ў дужках і цытатах функцыі httpresponse на вашым поглядзе. Гэта проста асноўны прыклад, але калі вы зрабілі гэта так далёка, вы разумееце асновы таго, як працуюць Linux, Bash, Python і Django. Давайце паглыбімся ў нейкае мадэляванне баз дадзеных і вывучым магутнасць класа Python пры захоўванні інфармацыі. Затым мы пачнем захопліваць HTML і CSS, перш чым мы зробім наш сайт цалкам прадстаўлены, гнуткі і бяспечны, выкарыстоўваючы JavaScript і машыннае навучанне.
Класы захоўваюцца ў Models.py вашага прыкладання. Выкарыстоўваючы Nano, рэдагаваць App/Models.py і дадайце новы клас. Клас вызначаецца з вызначэннем класа і перадаецца суперкласам, ад якога ён успадкоўвае, у гэтым выпадку Models.Model. Назва класа адбываецца пасля вызначэння класа, і пасля вызначэння класа A: (COTAL) выкарыстоўваецца, перш чым атрыбуты і вызначэнні функцый, звязаныя з класам, пазначаюцца ніжэй. Нашаму класу патрэбен ідэнтыфікатар, які мы можам выкарыстоўваць, каб атрымаць яго і захаваць унікальным, а таксама неабходна тэкставае поле для захоўвання інфармацыі. Пазней мы можам дадаць часовую марку, файлы, булевыя (сапраўдныя або ілжывыя азначэнні, якія могуць дапамагчы нашаму коду прыняць рашэнні пра тое, што рабіць з мадэллю, і можна выкарыстоўваць для яе сартавання), асобнік, каб прывязаць мадэль да карыстальніка, увайшоўшы ў сервер і многае іншае. Давайце распакуем код ніжэй:
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, які будзе вызначаць мадэль, з якой узаемадзейнічае форма. Форма таксама можа мець функцыю ініцыялізацыі, якая ўсталёўвае яе на аснове інфармацыі ў запыце, мадэлі ці іншым чынам, мы вывучым гэта пазней.
Формы мадэлі настолькі карысныя, таму што яны могуць стварыць мадэль альбо таксама рэдагаваць мадэль, таму мы будзем выкарыстоўваць іх для абодвух. Давайце вызначым яго ў forms.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
Для выканання спатрэбіцца хвіліна, але, як толькі гэта зробіць, гэта дазволіць вам атрымаць доступ да мадэлі ў праглядах, прамежкавым праграме ці дзе -небудзь яшчэ ў праграмным забеспячэнні. Давайце працягнем, робячы выгляд, дзе мы бачым нашу мадэль. Рэдагаваць канал/прагляд.py і дадайце наступны код, як адзначалася. Вам не трэба дадаць што -небудзь пасля знака #, гэты код - гэта каментары, якія выкарыстоўваюцца для абазначэння інфармацыі пра код. Мы пачнем з імпарту нашай мадэлі ў прагляды і дадаем яе ў кантэкст, дзе мы можам зрабіць яе ў шаблон у якасці спісу для адлюстравання. Далей мы дадамо шаблон, дзе мы можам зрабіць форму і мадэль з кнопкай, каб стварыць новы аб'ект на аснове мадэлі і размясціць яго на серверы. Гэта гучыць складана, таму давайце проста зробім гэта крок за крокам. Перш чым скончыць выгляд, давайце стварым шаблон, які проста адлюстроўвае мадэль і пераканайцеся, што мы можам бачыць яго, стварыўшы новы пост у абалонцы. Вось як павінен выглядаць гэты погляд:
posts = Post.objects.all() # Запытайце ўсе паведамленні ў базе дадзеных да гэтага часу
Усё гэта выглядае даволі проста, пакуль мы не дабярэмся да дна. Аказваецца, значэнне, якое вяртаецца функцыяй, а не ў рэакцыі HTTP, як і ў папярэднім прыкладзе, заўсёды прымае запыт у якасці першага ўводу, прымае кантэкст (у гэтым выпадку паведамленні ў базе дадзеных), які зараз можа быць зроблены ў шаблоне, і вяртае шаблон, вызначаны ў функцыі. Шаблон будзе дакументам HTML з невялікай колькасцю мовы пад назвай Jinja2, які перадае інфармацыю Python у HTML.
Каб пачаць ствараць шаблоны, зрабіце два каталогі ў канале.
mkdir feed/templates
mkdir feed/templates/feed
Далей адрэдагуйце шаблон у каталогу вышэй, падачы/шаблоны/падача і дадайце код для гэтага прыкладу. Давайце разгледзім шаблон для гэтага прыкладу.
Гэта вельмі просты шаблон. Ён вызначае адкрыццё і закрыццё тэгаў HTML, тэг тыпу дакумента, тэг цела з загалоўкам легенды, тэг разрыву, які дадае невялікую лінію па экране, і для цыкла, які адлюстроўвае кожны пост у спісе паведамленняў у якасці пункта ў шаблоне. Гэта ўсё, што трэба для адлюстравання паведамленняў, але ў базе дадзеных няма. Давайце стварым некаторыя з абалонкай. Мы можам запусціць абалонку з manage.py
python manage.py shell
Зараз давайце імпартаваць нашу мадэль Post
from feed.models import Post
Далей мы створым просты пост з радком і выйдзем з абалонкі. Радок можа быць любым, пакуль гэта сапраўдны тэкст.
Post.objects.create(text='hello world')
exit()
Нарэшце, нам трэба будзе дадаць 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
Рэалізацыя формы адносна простая. Мы імпартуем нашу форму, дадамо апрацоўшчыка запыту на прагляд і захаваем паведамленне ў базе дадзеных, перш чым перанакіраваць у той жа выгляд. Мы можам выкарыстоўваць функцыю перанакіравання, якую мы ўжо імпартавалі, і іншая функцыя пад назвай Reverse, каб атрымаць URL для малюнка прагляду. Мы запытваем гэта з дапамогай радка "Feed: 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 можна загрузіць з іх сайта,getBoottrap.com/. Патрапіўшы там, націсніце кнопку, каб прачытаць дакументы ўстаноўкі, і скапіруйце код з раздзела CDN. Вам спатрэбіцца гэты код уверсе вашага дакумента HTML, у тэгах пад назвай Head. Акрамя таго, давайце пойдзем наперад і стварым базавы шаблон, таму нам не трэба ўзнаўляць гэтыя спасылкі ў кожным шаблоне.
Зрабіце новы каталог, які называецца шаблонамі з шаблонамі MKDIR, а затым рэдагуйце шаблоны/base.html.
Гэта павінна выглядаць так:
Пераканайцеся, што скапіруйце CSS і JavaScript, файлы .css і .js, таму што нам спатрэбіцца JavaScript, каб зрабіць наш сайт больш функцыянальным у будучыні.
Зараз вернемся да Shell Bash і запусцім хуткую каманду. Памятаеце, што калі вам трэба будзе атрымаць доступ да віртуальнай асяроддзя, увядзіце крыніцу Venv/Bin/Active. Гэта дазволіць вам усталяваць пакеты Python на мясцовым узроўні такім чынам, каб Джанга доступ да іх. Каб даць нашы формы, згенераваныя класамі Django Bootstrap, мы будзем выкарыстоўваць пакет Python пад назвай хрумсткія формы. Мы можам загрузіць гэта з наступнай камандай
pip install django-crispy-forms
Пасля таго, як гэта будзе ўсталявана, дадайце яго ў налады.py
# ... папярэдні код тут
Цяпер, вярнуўшыся ў наш шаблон падачы, мы можам выдаліць некаторыя рэчы. Давайце выдалім пачатак і канец дакумента і заменім яго на спадчыну з нашага базавага шаблона, выкарыстоўваючы пашырэнне і вызначэнне блока. Акрамя таго, мы дадамо імпарт шаблонаў фільтра з нагрузкай і фільтрам шаблона ў форму. Нарэшце, давайце дадамо клас загрузкі ў кнопку ў форме, каб яна была больш падобнай на кнопку. Гэта павінна выглядаць так:
Прыгожа! Гэта ўжо зусім няшмат кода. Далей мы павінны праверыць гэта і пераканацца, што мы бачым, што ўсё выглядае прыгожа, а таксама ўпэўнены, што ўсё працуе належным чынам. Запусціце сервер у адпаведнасці з папярэднімі інструкцыямі і пераканайцеся, што сайт выглядае і працуе добра. Выдатная праца! Вы гатовыя перайсці да наступнага этапу, у якім мы дадамо функцыянальнасць уваходу карыстальніка, выкарыстоўваючы падобныя URL, формы, прагляды і шаблоны. Базавы шаблон важны, і мы будзем працягваць яго змяняць і ўносіць змены па меры неабходнасці, але пакуль давайце засяродзімся на тым, каб зрабіць наш сайт больш бяспечным, дазволіўшы карыстальнікам увайсці з імем карыстальніка і пароля, і ў канчатковым выніку яшчэ больш важнай інфармацыі, якая дапаможа захаваць ваш прыкладанне ў бяспецы і ваш уласны ўліковы запіс, даступны толькі вамі.
Для гэтага нам трэба будзе выкарыстоўваць карыстацкую мадэль, убудаваную ў Django. Карыстальніцкая мадэль - гэта мадэль базы дадзеных, як і наш пост, якую можна зрабіць для ўваходу ў карыстальнік на вэб -сайт. У будучыні, перш чым разгарнуць сайт у Інтэрнэце, мы пашырым гэтую мадэль з іншымі мадэлямі, прыпісанымі ёй, і пабудуем дадатковыя меры бяспекі для ўваходу, устойлівага да фішынгу. Мы пачнем з выкарыстання некаторых убудаваных формаў для ўваходу, якія забяспечвае Django. Па -першае, давайце стварым новае прыкладанне, якое мы будзем выкарыстоўваць для адлюстравання шаблонаў і праглядаў для асноўнай старонкі ўваходу. Мы таксама створым іншыя прыкладанні для прадстаўлення пастаянных праблем для ўваходу, каб замацаваць прыкладанне, уключаючы пінкод, распазнаванне асобы, сувязь побач з полем, знешнія прылады, аўтэнтыфікацыю з некалькімі фактарамі і распазнаванне адбіткаў пальцаў.
Мы ўжо размаўлялі пра запуск прыкладання. З нашага каталога, у віртуальнай асяроддзі, pass manage.py гэтыя аргументы
python manage.py startapp users
Цяпер мы павінны мець каталог для новага прыкладання. Пачнем з стварэння прагляду ў гэтым каталогу, які адпавядае ўваходу карыстальніка. Django стварыў прагляды для ўваходаў карыстальнікаў, але яны не падыходзяць для нас, таму што нам патрэбны карыстацкі выгляд, які, пажадана, зроблена з вызначэннем.
З гэтага пункту гледжання мы пачнем з праверкі запыту на паведамленне, PASS -запыт.
У карыстальнікаў/праглядах.py дадайце наступны код
username = request.POST['username'] # Атрымайце імя карыстальніка і пароль з запыту
password = request.POST['password'] # Аўтэнтыфікацыя карыстальніка
Гэта ўсё, што вам трэба для асноўнага прагляду ўваходу. Зараз давайце стварым форму для прагляду, пашырыўшы базавы шаблон. Мы пачнем з стварэння новага каталога для шаблонаў у тэчцы карыстальнікаў.
mkdir users/templates
mkdir users/templates/users
Цяпер мы павінны мець магчымасць рэдагаваць карыстальнікаў/шаблонаў/карыстальнікаў/login.html. Пакуль мы на гэтым, мы створым шаблон, каб дазволіць карыстачу таксама зарэгістравацца.
nano users/templates/users/login.html
Цяпер у шаблоне,
Гэта асновы шаблону ўваходу. Гэта сапраўды падобна на іншы шаблон у структуры, але ён выглядае крыху па -іншаму, калі ён адлюстроўваецца. Мы можам скапіяваць гэты код, каб пабудаваць яшчэ адзін вельмі падобны шаблон пад назвай regirpher.html, дзе мы зменім фармулёўку і скажам новую форму, якую мы будуем. Давайце спачатку зробім шаблон. Рэдагаваць карыстальнікаў/шаблонаў/карыстальнікаў/regirport.html і дадайце наступны код:
Зараз давайце пабудуем форму для нашай рэгістрацыі карыстальніка і перавядзем да праглядаў, перш чым абнавіць у сістэму карыстальнікаў мадэллю. Мы зробім гэтую форму асноўнай для пачатку, але ў будучыні ўключым больш падрабязнасцей і функцый бяспекі, такіх як пагадненні і Captcha. Адрэдагуйце формы з карыстальнікамі Nano/Forms.py і дадайце наступны код.
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
Такім чынам, у нас ёсць яшчэ адна форма, якая працуе даволі проста. Гэта форма рэестра карыстальніка з імем карыстальніка, электроннай поштай і паролем, а таксама поле пацверджання пароля. Звярніце ўвагу, што гэтая форма не пашырае звычайны клас Forms.form, гэта мадэльная форма, якая азначае, што яна мае мета. Адно поле вызначаецца аднолькава, і мета -клас вызначае мадэль, якую форма адпавядае астатнім інфармацыяй, якая будзе запісана ў форму. Большая частка гэтага ўжо існуе ў убудаваным Django ў UserCreationform, таму мы будзем выкарыстоўваць гэта ў якасці асновы для класа (перададзенага ў дужках).
Далей мы разгледзім прагляд, каб зарэгістраваць карыстальніка, зараз, калі ў нас ёсць форма і шаблон. Гэта мадэльная форма, як і той, які ў новым праглядзе паведамлення. Рэдагаваць карыстальнікаў/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 user.posts.all () або auther.posts.all ().
Зараз давайце зробім нашы ўваходы больш пругкімі. Мы ўжо можам зрабіць наш сайт значна менш уразлівым да фішынгу, проста ацэньваючы колькасць разоў, калі мы дазволім увайсці на сайт, гэта даволі проста. Давайце таксама пачнем захоўваць інфармацыю пра кожнага карыстальніка раней, калі мы працягваем распрацоўваць наша прыкладанне. Рэдагаванне карыстальнікаў/мадэляў.py, дадайце наступны код.
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
account_created = models.DateTimeField(default=timezone.now)
last_seen = models.DateTimeField(default=timezone.now)
can_login = models.DateTimeField(default=timezone.now)
preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
bio = models.TextField(blank=True, default='')
Звярніце ўвагу, што гэтая мадэль даволі падобная на пост -мадэль. У нас ёсць дадатковы імпарт Timezone, які дазволіць нам усталяваць значэнні па змаўчанні на палях DateTime, і ў нас таксама ёсць характар і тэкставы полі, як Post. Выкарыстанне ўсіх гэтых часовых пазнак дапамагае нам замацаваць сайт і зразумець яго выкарыстанне, а тэкставыя палі дазваляюць нам прадастаўляць інфармацыю пра кожнага карыстальніка ці аўтара на сайце. Анатоннае поле павінна быць адзіным нязначным, ён паводзіць сябе сапраўды гэтак жа, як і пярэдняя частка, але толькі адна на наступную мадэль. Такім чынам, карыстальнік мае толькі адзін профіль, у той час як у іх можа быць шмат паведамленняў.
Зараз давайце палепшым нашу ўваход і зарэгіструйце прагляды, каб улічыць профіль. Па -першае, рэдагуйце карыстальнікаў/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, што павінна быць часам у мінулым, і абнаўляць яго з кожным няўдалым уваходам з дапамогай таго ж імя карыстальніка. Такім чынам, шкоднасны карыстальнік не зможа адгадаць пароль дзе -небудзь побач. Колькасць секунд у dateMe.timedelta () таксама можа быць абноўлена, і вэб -сайт будзе больш пругкім, але крыху менш зручным з больш секунд. Я рэкамендую 15 для пачатку.
Памятайце, што мы стварылі рэзервовы сцэнар, каб захаваць нашу працу, таму давайце пойдзем наперад і рэзервовае капіраванне таго, што ў нас ёсць да гэтага часу, каб пераканацца, што ў нас усё захавана. Запусціце каманду:
sudo backup
У чарговы раз гэта выратуе вашу працу да гэтага часу. Я рэкамендую запусціць частыя рэзервовыя копіі, каб захаваць вашу працу, і вы, магчыма, захочаце запусціць рэзервовую працу аўтаматычна. Вы можаце зрабіць гэта, выкарыстоўваючы ўтыліту Unix пад назвай Cron. Каб актываваць гэтую ўтыліту, запусціце наступную каманду і ўвядзіце пароль:
sudo crontab -e
Калі вы яшчэ не выбралі опцыю 1 для Nano, тэкставы рэдактар, з якім вы ўжо павінны быць знаёмыя, і пракруціць унізе файла пры дапамозе клавіш стрэлкі. Дадайце наступны радок:
0 * * * * sudo backup
Cron выкарыстоўвае фармат хвіліны, гадзіну, дзень месяца, месяц, дзень тыдня, дзе A * або лік уяўляе, калі запусціць каманду. Выкарыстоўваючы 0 на хвіліну і * для астатніх варыянтаў, мы можам запусціць каманду ў першую хвіліну кожнай гадзіны ў пачатку хвіліны. Гэта дазваляе нам аўтаматычна ствараць рэзервовае капіраванне кода. Усе заданні Cron пры выкананні з Sudo Run у якасці кораня, таму нам не трэба ўводзіць пароль кожную гадзіну.
Каб палегчыць рэзервовую копію нашага кода, не выкарыстоўваючы пароль, давайце адключым пароль для нашай рэзервовай каманды. Мы зробім гэта, выконваючы наступную каманду і ўводзячы пароль:
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)
Не забудзьцеся змяніць іх, калі вы будзеце гатовыя разгарнуць сваё прыкладанне, мы перагледзім гэта пазней. Налада email_address павінна быць электроннай пошты, з якой вы хацелі б адправіць, і пароль (email_host_password) павінен быць усталяваны на пароль, які вы генеруеце для сервера. Я загружаю пароль з файла канфігурацыі, каб пазбегнуць яго кода, выкарыстоўваючы наступную логіку, над гэтымі радкамі ў наладах.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 у наладах. Ідзіце наперад і дадайце наступныя радкі ў 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, таму давайце напішам гэта ніжэй кода, які мы ўжо дадалі карыстальнікам/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()
Гэта крыху больш складана, і мы яшчэ не гатовыя запусціць увесь гэты код. Звярніце ўвагу, што мы вызначаем usenb_link, спасылка, якую карыстальнік можа выкарыстоўваць, каб адмяніць падпіску з нашых лістоў. Гэта важна, таму што карыстальнікам трэба будзе адмовіцца ад нашых лістоў, калі яны не хочуць іх бачыць у любы час. Мы таксама дадаем тэкставую альтэрнатыву нашаму паведамленню, якое з'яўляецца паведамленнем HTML, пазбаўленым тэгаў HTML. Нарэшце, мы правяраем, ці адпраўляецца электронная пошта, а калі ён не, мы адзначаем у профілі карыстальніка, што іх электронная пошта не з'яўляецца сапраўднай.
Давайце вернемся да карыстацкіх мадэляў, каб мы маглі зрабіць усё гэта працаваць. Мы павінны вызначыць функцыю, каб стварыць спасылку на падпіску і вызначыць булевае поле, каб адзначыць, што электронная пошта карыстальніка несапраўдны.
Па -першае, дадайце наступны імпарт у верхнюю частку карыстальнікаў/мадэляў.py
nano users/models.py
# ...
Далей дадамо функцыі ў карыстацкую мадэль, каб зрабіць знак і праверыць, што токен, які выкарыстоўваецца для актывацыі электроннай пошты, а таксама ў поле, каб захаваць, ці паспяхова атрымлівае карыстальнік. У карыстальнікаў/мадэлях.
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Дзейнічае на працягу 30 дзён
Гэта даволі проста, мы выкарыстоўваем TimeStampSigner, які з'яўляецца асноўным інструментам крыптаграфіі, каб стварыць токен, які скончыцца праз пэўны час, і мы таксама выкарыстоўваем іншую функцыю, каб праверыць, ці справядліва. Мы выкарыстоўваем гэтыя токены двойчы, адзін раз, каб праверыць электронную пошту і адзін раз для падпіскі.
Цяпер, калі ў нас ёсць такія, апошняя праца, якую нам трэба будзе зрабіць, гэта ў поглядах. Унутры карыстальнікаў/праглядаў.py давайце дадамо прагляды, каб праверыць адрас электроннай пошты і адпісацца.
nano users/views.py
Спачатку дадайце наступны імпарт. Я кінуў некалькі дадатковых, таму нам не прыйдзецца зноў імпартаваць больш прадметаў.
from .email import send_verification_email # Пераканайцеся ў тым, каб імпартаваць функцыю адпраўкі электроннай пошты праверкі
Магчыма, у вас ужо ёсць некаторыя з гэтых імпартаў, але не перашкодзіць іх паўтараць. Вам трэба будзе імпартаваць функцыю адпраўкі электроннай пошты праверкі, а таксама uxital_activation_token ад user.tokens, сярод іншых імпартаў.
Цяпер, унізе файла, дадайце наступны код:
# падпісваюць іх
# У адваротным выпадку перанакіруйце на старонку ўваходу
# SendwelceEmail (запыт, карыстальнік)
Гэта шмат кода. Давайце разбіваем яго. Першая функцыя, чыстая і простая, падпісвае карыстальніка са спісу рассылкі. Другая функцыя актывізуе іх электронную пошту, і вы заўважыце, што я дадаў пракаментаваную функцыю SendwelceEmail. Вы можаце выкарыстоўваць шаблон электроннай пошты і вызначэнне функцый, каб адправіць прывітальны ліст, я проста яшчэ не. Апошняя функцыя, якую я кінуў, важная, таму што заканчваюцца электронныя лісты актывацыі. Такім чынам, нам трэба будзе аднавіць электронную пошту актывацыі. Мы можам выкарыстоўваць асноўную форму для гэтага і патэлефанаваць у функцыю, каб адправіць электронную пошту для праверкі. Перш чым мы зробім гэта, давайце пераканайцеся, што яго адпраўляюць у першую чаргу, дадаўшы функцыянальны званок да прагляду рэестра. Дадайце гэты радок непасрэдна перад перанакіраваннем у прагляд рэестра, DEF Register, у карыстальнікаў/праглядах.py.
nano users/views.py
# … (Пасля) def regist (запыт):
# … (Раней) перанакіраваць (
Вам не трэба дадаваць першыя і апошнія радкі ў гэты фрагмент кода, проста пераканайцеся, што прагляд рэестра адпраўляе карыстачу электронную пошту праверкі. Гэта павінна выглядаць так:
# … Імпартс
send_verification_email(user) # Не забудзьцеся дадаць гэты радок!
Цяпер нам трэба будзе дадаць форму, каб аднавіць электронную пошту актывацыі. У карыстальнікаў/Forms.py дадайце наступную форму:
# … (Імпарт)
Нам таксама спатрэбіцца шаблон, які адпавядае гэтай форме актывацыі электроннай пошты. Давайце дадамо гэты шаблон у. Рэдагаваць файл:
nano users/templates/users/resend_activation.html
Далей дадайце ў файл наступны код.
Whew, гэта шмат! Цяпер, калі мы разгортваем код на нашым серверы, мы зможам адправіць HTML электроннай пошты і актываваць уліковыя запісы карыстальнікаў націскам у электронную пошту. Мы таксама можам захацець даслаць просты прывітальны ліст, таму паглядзім, як гэта зрабіць. Вярнуцца ў users/email.py, дадайце наступны код:
def sendwelcomeemail(user):
User = get_user_model()
html = open('{}/users/welcome_email.html'.format(settings.BASE_DIR)).read()
subject = 'Welcome to ' + settings.SITE_NAME + ', {{ username }}!'
template = Template(html)
subjtemplate = Template(subject)
context = Context({'username': user.username, 'base_url': settings.BASE_URL, 'model_name': 'Daisy Holton, 'site_name': settings.SITE_NAME})
renderedtemplate = template.render(context)
subjcontext = Context({'username': user.username})
subjrenderedtemplate = subjtemplate.render(subjcontext)
send_html_email(user, subjrenderedtemplate, renderedtemplate)
Акрамя таго, нам спатрэбіцца шаблон, каб зрабіць усю гэтую інфармацыю. На маім сайце шаблон выглядае як ніжэй, але вы можаце яго адфарматаваць, як вам падабаецца.
Звярніце ўвагу, што ў нас няма тэгаў закрыцця або HTML, таму што мы дадаем іх, калі дадаем спасылку HTML адпісацца. Яны важныя, але мы не хочам іх вызначаць двойчы.
Дык што далей? Мы прайшлі доўгі шлях. Сапраўды, мы павінны быць гатовыя разгарнуць сайт на сервер. Мы можам дадаць дэкаратар @Login_Required і зрабіць нашы погляды бяспечнымі, узяць рэгістрацыі карыстальнікаў, адправіць адпаведную электронную пошту і інфармацыю пра кэш, што з'яўляецца асновай таго, што павінен зрабіць вэб -сайт, каб заставацца актуальнымі. Мы дадамо яшчэ некалькі карысных функцый, а потым пабудуем аснову для разгортвання нашага кода на аддалены сервер, наладжванне паштовага сервера, канфігурацыю дамена і фільтры, каб зрабіць наш сайт бяспечным і дарэчным.
Нам таксама спатрэбіцца прагляд скіду пароля, таму давайце дадамо гэта вельмі хутка. У некаторых функцыях убудаваны выгляд DJANGO ў скідзе пароля, але мы разгледзім, як напісаць уласны выгляд, шаблон электроннай пошты, формы і ўзоры URL. Вось як выглядае выгляд, у карыстальнікаў/праглядах.py
# ... Імпартс
Гэтая форма ўбудаваная ў Django, але нам спатрэбіцца шаблон, каб пацвердзіць скід пароля, карыстальнікаў/шаблонаў/карыстальнікаў/password_reset_confirm.html
У нас таксама ёсць шаблон для адпраўкі электроннай пошты скіду пароля з простай формай, у карыстальнікаў/шаблонах/карыстальнікаў/Password_Reset.html
Шаблон для самой электроннай пошты просты, гэта асноўны файл HTML, які аказвае спасылку на скід пароля, у карыстальнікаў/шаблонах/карыстальнікаў/password_reset_email.html. Django будзе аўтаматычна інтэрпрэтаваць гэты файл.
Нам таксама спатрэбяцца яшчэ два шаблоны. Першы - пацвердзіць, што электронная пошта была адпраўлена. Погляды на іх ужо ў Джанга, таму нам проста трэба звярнуцца да іх у URLS.PY. Гэты шаблон размешчаны ў карыстальніках/шаблонах/карыстальніках/password_reset_done.html
І, нарэшце
Цяпер нам патрэбныя ўзоры URL для гэтых поглядаў. У карыстальнікаў/urls.py дадайце наступныя ўзоры URL:
# ... Папярэднія URL -адрасы тут
Чатыры шаблоны, гэта шмат! Але зараз мы можам быць упэўнены, што зможам скінуць пароль карыстальніка ў любы час, і ўсё з вэб -браўзэра.
Я разумею, што гэта шмат кода. Калі гэта здаецца крыху над галавой, гэта нармальна. Вы палепшыцеся, ваша разуменне палепшыцца, і вы станеце значна больш кампетэнтным з кодам. Калі вы цалкам згубіліся, я рэкамендую вярнуцца да гэтага праграмнага забеспячэння пазней пасля працы над самастойным вучобай кадаваць курс у Інтэрнэце. Звычайна яны могуць пачаць працаваць, і гэта правядзе вас праз усё, што трэба, каб быць паспяховым, калі вы вернецеся да гэтага праекта. Калі вы адчуваеце, што гатовыя працягнуць, чытайце далей, мы будзем ахопліваць разгортванне вашага кода на выдалены сервер і наладзіць паштовы сервер, а таксама аўтаматызаваць разгортванне з дапамогай BASH, каб вы заўсёды маглі наладзіць новы праект з некалькімі простымі камандамі.
Апошняе, што нам трэба зрабіць, перш чым разгарнуць на выдалены сервер, гэта зрабіць наш сайт крыху больш бяспечным. Вы заўважыце, што прагляд уваходу прымае толькі імя карыстальніка і пароль, і няма праверкі сапраўднасці з некалькімі фактарамі альбо аднаразовага кода. Гэта простае выпраўленне, і з тым жа кодам мы можам прымусіць наш сайт адпраўляць тэкставыя паведамленні і нават рэагаваць на тэкставыя паведамленні, адпраўленыя на сервер. Для пачатку мы вернемся ў карыстацкія мадэлі і дадамо падпісчык часовай маркі, які будзе прадстаўляць кожны ўваход. Мы таксама дадамо ўнікальную мадэль карыстальніка унікальнага, вернага ідэнтыфікатара, які будзе выкарыстоўвацца для дадання дадатковай бяспекі для нашага ўваходу. Рэдагаванне карыстацкіх мадэляў, карыстальнікаў/мадэляў.py, дадайце наступны код:
# Пераканайцеся ў тым, каб імпартаваць UUID, падпісант часовай маркі і генератар URL (зваротнае)
# Дадайце гэты код тут
# І дадайце гэтую функцыю
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Дзейнічае на працягу 3 хвілін
Пераканайцеся, што вашы карыстальнікі/мадэлі. Разбіваючы гэта, гэта проста. У нас ёсць некалькі імпартаў, часовы момант, які ўяўляе сабой крыптаграфічную ўтыліту, якая можа стварыць бяспечны код і праверыць яго, каб пераканацца, што ён дзейнічае, выкарыстоўваецца толькі адзін раз, а не старэйшыя за пэўную колькасць секунд. Мы таксама выкарыстоўваем UUID, які з'яўляецца унікальным ідэнтыфікатарам, які ідэнтыфікуе нашага карыстальніка ў падпісанні токена, і ў URL, дзе маркер адпраўляецца карыстачу. Мы будзем выкарыстоўваць гэтую асноўную крыптаграфію для стварэння двухбаковага праверкі сапраўднасці. Перш чым мы зробім што -небудзь яшчэ, давайце запусцім міграцыі, каб нашы мадэлі карыстальніка былі абноўлены. У каталогу з Manage.py запусціце наступныя каманды, каб зрабіць і завяршыць міграцыі.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Гэта важна, таму што кожны раз, калі мы ўносім змены ў мадэлі, нам трэба будзе стварыць табліцы і абнаўляць базу дадзеных па змаўчанні, перш чым мы зможам на самай справе выкарыстоўваць мадэлі.
Далей, давайце імправізаваць прагляд нашага ўваходу, каб перанакіраваць на другасную праверку аўтэнтыфікацыі. У карыстальніках/views.py выдаліце функцыю ўваходу і перанакіруйце ў URL, які мы толькі што згенеравалі ў мадэлях карыстальнікаў.
# … Імпартс
if user and user.profile.can_login < timezone.now(): # Звярніце ўвагу, што зараз мы правяраем, ці можа карыстальнік увайсці ў сістэму
# Выдаліце функцыю Auth_Login, якая была тут
return redirect(user.profile.create_auth_url()) # Звярніце ўвагу, мы перанакіроўваем на новы URL тут
else: # Калі карыстальнік не выкарыстоўвае шматфактарную аўтэнтыфікацыю, проста ўвайдзіце ў іх.
else: # Калі ўваход не быў паспяховым,
user = User.objects.filter(username=username).first() # Гэта частка, дзе мы абнаўляем профіль карыстальнікаў
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Такім чынам, яны не могуць зноў увайсці на некалькі секунд
Такім чынам, гэта даволі проста, у нас зараз ёсць спосаб перанакіраваць на два фактары прагляду аўтэнтыфікацыі, калі мы яго ствараем. У нас таксама ёсць рэзервовы, калі карыстальнік не дадаў нумар тэлефона. Мы дадамо асноўны выгляд, каб дадаць нумар тэлефона ў бліжэйшы час і ўвайсці з тэкставым паведамленнем у бліжэйшы час.
Па -першае, нам патрэбен просты спосаб адправіць тэкставае паведамленне з нашага кода. Для гэтага мы можам выбраць з шэрагу API, але, на мой погляд, самы просты - Twilio. Яны таксама прапануюць добрыя цэны на меншыя праекты, а таксама аб'ёмныя зніжкі. Стварыце ўліковы запіс на Twilio.com, запоўніце некаторыя падрабязнасці пра свой праект, купіце нумар тэлефона і скапіруйце ключы API у свае налады. Затым дадайце гэты код у новы файл, карыстальнікі/sms.py.
nano users/sms.py
# Імпартаваць усе неабходныя пакеты
# Гэты код адпраўляе тэкст з Twilio
# Функцыя памочніка, каб атрымаць нумар з такой колькасцю лічбаў
# Адпраўце тэкст для праверкі карыстальніка
# Дашліце карыстачу любы тэкст з гэтай функцыяй
# Пацвердзіце код гэтай функцыяй
# Пацвердзіце час
Не забудзьцеся належным чынам змяніць налады, дадаўшы гэтыя радкі сваімі ключамі:
# Пераканайцеся, што скапіруйце іх з прыборнай панэлі Twilio
AUTH_VALID_MINUTES = 3 # Колькасць хвілін, калі старонка TFA актыўная, як толькі выдаецца
Па -першае, нам спатрэбяцца формы для нашых двух праглядаў аўтэнтыфікацыі фактараў. Рэдагаванне карыстальнікаў/forms.py, дадайце наступны код.
# … Імпартс
# Форма для ўводу нашага нумара тэлефона
# Форма для аўтэнтыфікацыі
Далей, давайце стварым прагляды ў карыстальнікаў/праглядах.py
# … Імпартс
Нам таксама спатрэбяцца шаблоны для абодвух гэтых поглядаў. Давайце спачатку дадамо шаблон MFA.
nano users/templates/users/mfa.html
Дадайце гэты код HTML у шаблон
Гэта даволі тлумачальна. Форма адпраўляе альбо код, альбо пусты код, і вы заўважыце ў праглядзе, калі мы атрымаем код, калі атрымаем пусты код. Тады ў нас проста дзве кнопкі адпраўкі, і такім чынам мы можам адправіць код з любой кнопкай. Далей мы дадамо простую форму, каб дадаць нумар тэлефона.
nano users/templates/users/mfa_onboarding.html
Дадайце наступнае html:
Гэтая форма значна прасцей, яна проста адлюстроўвае форму нумара тэлефона, які мы стварылі, і дазваляе карыстачу дадаць нумар тэлефона.
Гэта выглядае сапраўды добра! Пакуль усё належным чынам усталявана, мы павінны мець магчымасць адпраўляць паведамленні і ўвайсці ў карыстальнік сваім нумарам тэлефона, як толькі мы дадасце ўзоры URL. Апошняе, што нам трэба наладзіць, - гэта прагляд профілю, каб мы маглі пераканацца, што карыстальнік можа змяніць свой нумар тэлефона, не ўвайшоўшы ў сістэму. Акрамя таго, у рэшце рэшт мы захочам дадаць опцыю "Стоп, каб кінуць", каб карыстальнік мог тэкст "Стоп" адмовіцца ад будучых тэкставых паведамленняў.
Давайце дадамо прагляд профілю карыстальнікам/Views.py. Гэты выгляд будзе абнаўляць біяграфію, электронную пошту, імя карыстальніка і нумар тэлефона, а таксама дазволіць нам уключыць аўтэнтыфікацыю з некалькімі фактарамі. Па -першае, нам спатрэбяцца яшчэ дзве формы ў карыстальніках/формах.py
# ... Імпартс
Далей мы можам стварыць выгляд, каб выкарыстоўваць абедзве гэтыя формы. Рэдагаваць карыстальнікаў/views.py і дадайце ў выгляд.
# Дадайце гэтыя імпарт
Для гэтага выгляду нам таксама спатрэбіцца шаблон.
nano users/templates/users/profile.html
Вы заўважыце, што гэта даволі простая форма, але ў ім ёсць нейкі JavaScript, які аўтаматычна размяшчае змесціва формы па меры абнаўлення. Гэта карысна мець, таму вы можаце рабіць праўкі без неабходнасці адпраўкі кожны раз.
Далей нам патрэбныя URL, якія прадстаўляюць усе гэтыя погляды ў карыстальнікаў URL Patters. Рэдагаваць карыстальнікаў/urls.py і дадайце гэты код:
# … Папярэдні код, імпарт
# … Узоры URL, якія мы раней увялі, дадайце наступныя тры радкі
Цяпер добры час для праверкі нашага праекта. Але спачатку давайце запусцім яшчэ адну рэзервовую копію.
backup
І запусціце сервер. Перш чым разгарнуць на серверы Linux, гэта добрая ідэя, каб уключыць два фактарныя аўтэнтыфікацыі на ўліковым запісе. Мы зробім гэта ў нашым URL -адрасе,/карыстальнікам/профілю/, і правяраем поле, каб уключыць аўтэнтыфікацыю пасля ўводу нашага нумара тэлефона, а потым адправіць форму.
python manage.py runserver localhost:8000
Наведайце вэб -старонку, перайшоўшы ў свой вэб -браўзэр, я выкарыстоўваю ў гэтым прыкладзе Google Chrome і ўвёўшы URL https: // localhost: 8000/uparos/profile/
Пры неабходнасці вы зможаце ўвайсці ў сістэму і ўключыць праверку сапраўднасці.
Гэты праект неабходны для запуску сервера, каб ён сапраўды мог адправіць пошту. Але спачатку нам патрэбен спосаб убачыць памылкі. Вы заўважыце, што калі вы запусціце сервер у рэжыме адладкі, з Settings.Debug роўны True, сервер паказвае памылкі аўтаматычна. Каб паказаць памылкі, не выкарыстоўваючы рэжым адладкі, які небяспечны на вытворчым серверы, мы павінны дадаць для яго выгляд. Самыя важныя памылкі, з якімі мы павінны быць у стане, - гэта:
Памылка 500 - праблема з нашым кодам Памылка 404 - старонка, якая не была знойдзена (разбіты URL) Памылка 403 - Памылка дазволу
Давайце дадамо новае прыкладанне для апрацоўкі гэтых памылак, званых памылкамі.
python manage.py startapp errors
Дадайце гэта ў налады.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Гэта ўсё, што нам трэба, акрамя праглядаў памылак, шаблонаў і крыху прамежкавага праграмнага забеспячэння. Давайце вызначым іх як так:
# Стварыце свае погляды тут.
Далей давайце вызначым прамежкавае праграмнае забеспячэнне для апрацоўкі гэтых памылак. Мы зробім гэта, спачатку дадаўшы ў прамежкавыя праграмы_клас у наладах.
# ... Папярэдняе праграмнае забеспячэнне
Далей дадамо прамежкавае праграмнае забеспячэнне.
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. З выкарыстаннем 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 (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: # Праверце, ці ўключаны МЗС
if not check_verification_time(user, token): # Праверце час
user.profile.mfa_enabled = False # Ачысціце нумар тэлефона
user.profile.enable_two_factor_authentication = True # Уключыць МЗС
user.profile.phone_number = '+1' # Адключыце нумар тэлефона
user.profile.save() # Захавайце профіль
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Увайдзіце карыстальніка, калі іх МЗС не ўключаны
if request.method == 'POST' and not fraud_detect(request, True): # Калі запыт - запыт на паведамленне
form = TfaForm(request.POST) # Растракт формы
code = str(form.data.get('code', None)) # Атрымаць код
if code and code != '' and code != None: # Пераканайцеся, што ён не пусты
token_validated = user.profile.check_auth_token(usertoken) # Праверце маркер Auth
is_verified = check_verification_code(user, token, code) # Праверце код
if token_validated: # Калі ўсё
if is_verified: # Ёсць у парадку
user.profile.mfa_enabled = True # Уключыць MFA (калі яшчэ не ўключана)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Увайдзіце ў карыстальніка
for key, value in request.GET.items(): # Стварыце запыт для наступнага параметра (калі такія маюцца)
return HttpResponseRedirect(next) # Перанакіраваць
elif not token_validated: # Калі токен быў несапраўдны
if p.mfa_attempts > 3: # Калі б было занадта шмат спроб
if form.data.get('send_email', False): # Адпраўце электронную пошту (альбо тэкст)
# Зрабіць форму (для атрымання запытаў)
Калі мы дадаем у гэты код, пераканайцеся, што імпартаваць функцыю для адпраўкі электроннай пошты. Уверсе файла карыстальнік праглядае (з іншымі імпартамі), дадайце
from .mfa import send_verification_email as send_mfa_verification_email
Цяпер нам трэба напісаць гэтую функцыю, перш чым што -небудзь з гэтага спрацуе. Ён павінен пашырыць нашу функцыю адпраўкі электроннай пошты і проста адправіць электроннае паведамленне карыстачу з кодам праверкі.
nano users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Такім чынам, усё гэта выдатна працуе, зараз у нас ёсць шматбаковая сістэма аўтэнтыфікацыі, якая залежыць ад нумара тэлефона альбо электроннай пошты для ўваходу. Але нам таксама патрэбен спосаб выдалення ці, па меншай меры, схаваць карыстальнікаў, якія не супрацоўнічаюць з нашымі ўмовамі. Гэта могуць быць спамеры, робаты ці кожны, хто не значыць добра для нашай працы. Паглядзіце на прагляд, які я маю на маніторынг карыстальнікаў на сваім сайце:
# імпарт
from .tests import is_superuser_or_vendor # Нам трэба будзе стварыць гэты тэст
# Атрымаць спіс карыстальнікаў
return render(request, 'users/users.html', { # Вярніце карыстальнікаў у шаблон
Звярніце ўвагу, што гэты код выкарыстоўвае тэст, нам трэба будзе абвясціць гэты тэст у файле tests.py і імпартаваць яго. Рэдагаванне карыстальнікаў/tests.py, давайце створым тэст.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Гэта ў спалучэнні з шаблонам карыстальнікаў/карыстальнікаў.html, які выглядае прыблізна так:
Звярніце ўвагу, што шаблон уключае іншы шаблон, карыстальнікаў/user.html. Пры выкарыстанні шаблона, які мае падтэмную плату і не выкарыстоўваецца, гэта добрая ідэя, каб дадаць падкрэсліванне () перад тым, як назваць файл, каб пашырыць, каб адрозніць шаблоны.
Звярніце ўвагу, што гэта шмат джынджа, у вас можа быць не вызначана ўсе гэтыя зменныя. Але гэта выглядае мой код.
<small># {{user.id}} </small>
Нам таксама патрэбна яшчэ адна падтэмаграфія, toggle_active.html. Гэты шаблон павінен быць формай, якая дазваляе нам пераключыць, ці з'яўляецца карыстальнік актыўны.
Нам таксама трэба будзе дадаць выгляд, каб пераключыць актыўнасць карыстальніка і адпаведныя ўзоры URL. У той час як мы знаходзімся на гэтым, давайце дадамо выгляд, каб выдаліць карыстальніка, калі нам гэта трэба.
# Імпарт
success_url = '/' # Перанакіраванне URL поспеху
def test_func(self): # Праверце, калі карыстальнік з'яўляецца суперзабаронам і мае дазвол на выдаленне
Хоць гэта практычна пры неабходнасці, выдаленне карыстальніка не павінна быць неабходна большую частку часу, мы можам проста пераключыць бачнасць карыстальнікаў, якія наведваюць сайт, калі нам трэба іх звольніць.
Узоры URL, якія мы дадалі, выглядаем так. З дапамогай Nano, рэдагуйце карыстальнікаў/URLS.PY і дадайце гэтыя радкі:
nano users/urls.py
Радкі павінны ўваходзіць у спіс шляхоў у праглядах карыстальніка да канца "]", але пасля пачатку "[".
# ...
# ...
Цяпер пераканайцеся, што вы стварыце рэзервовую копію сайта, каб вы маглі загрузіць яго на вэб -серверы, над якім мы будзем працягваць працаваць. З каманднага радка,
sudo backup
Цяпер наш сайт падмацаваны.
Такім чынам, зараз у нас ёсць яшчэ некалькі карысных функцый. Але як наконт вялікай карціны тут? Гэты код па -ранейшаму недаступны з Інтэрнэту, у нас ёсць паштовы сервер, і нам трэба пашырыць наша прыкладанне, каб уключыць усёабдымны працэс праверкі, а таксама гладкія макеты, якія дапамогуць нам вывучыць сайт, а таксама бяспечныя пратаколы для аўтэнтыфікацыі прывілеяваных карыстальнікаў.
Мы дабярэмся да ўсяго гэтага. Самае галоўнае, што зараз будзе толькі атрымаць гэты код у Інтэрнэце, які мы можам зрабіць толькі з некалькімі радкамі Bash на серверы Ubuntu. Для гэтага вам трэба будзе арандаваць сервер, калі ў вас няма сервера дома і падпіску на дзелавую Інтэрнэт, якая дазваляе адкрыць парты. Я асабіста запускаю свой вэб -сайт на HP Z440, які ўсталёўваецца ў маёй кватэры, але звычайна гэта значна танней для асноўных патрэбаў, каб арандаваць віртуальны прыватны сервер (VPS).
Майце на ўвазе, што код, які мы зараз запускаем, адносна тонкі, яго трэба будзе падтрымліваць і палепшыць, перш чым мы будзем гатовыя выкарыстоўваць тое, што мы павінны стварыць прадукт. Пераканайцеся, што будзьце ўважлівыя, што вы робіце з Інтэрнэтам, пераканайцеся, што калі вы публічна разгарніце гэты сайт у Інтэрнэце на серверы Linux, у вас ёсць план, каб блакаваць непажаданыя ўзаемадзеянні з вашым сайтам. Спачатку гэта, верагодна, не будзе праблемай, але мы разгледзім розныя рашэнні для барацьбы з гэтым, уключаючы машыннае навучанне, штучны інтэлект і камп'ютэрнае зрок. Калі гэта становіцца праблемай, паглядзіце далей у гэтым тэксце для рашэння.
З пункту гледжання арэнды VPS, ёсць шмат месцаў, якія вы можаце пайсці. Google Cloud мае серверы VPS, Ionos, Kamatera, Amazon AWS і больш пастаўшчыкоў прапануюць рашэнні хмарных сервераў, якія будуць адпавядаць нашым патрэбам.
Вам трэба будзе націснуць на іх формы і выбраць план, каб пачаць працу. Вы можаце пайсці з асноўным планам з любым пастаўшчыком, але пераканайцеся, што пастаўшчык дазваляе адкрыць парты сервера порт -пошты для адпраўкі электроннай пошты (гэта павінен быць порт 587 і порт 25), некаторыя пастаўшчыкі блакуюць гэтыя парты. Дагэтуль у мяне быў лепшы досвед працы з Ionos і Kamatera, абодва яны дазволяць мне адправіць неабмежаваную электронную пошту, і іх цэны даволі танныя.
Вы падключыцеся да новага сервера праз пратакол пад назвай SSH або Secure Shell, які дазваляе выдалена ўзаемадзейнічаць з серверам, як і ваш асабісты кампутар, з вашага персанальнага кампутара. Пры наладзе сервера пастаўшчык хостынгу, хутчэй за ўсё, папрасіць вас дадаць ключ SSH, інакш яны дадуць вам імя карыстальніка і пароль. Ключ SSH заключаецца ў тым, як вы ўвайдзіце на сервер з каманднага радка для рэдагавання кода. Выкарыстоўвайце прыведзеныя ніжэй параметры SSH-Keygen, каб стварыць ключ SSH.
ssh-keygen
Захавайце файл і перазапішыце яго, калі вам трэба, добра паварочваць свае клавішы SSH, калі вы яшчэ гэтага не зрабілі. Цяпер вы можаце выкарыстоўваць наступную каманду, каб убачыць свой ключ SSH. Вы хочаце скапіяваць яго на свой аддалены сервер, каб вы маглі выкарыстоўваць яго для праверкі сапраўднасці.
cat ~/.ssh/id_rsa.pub
Калі вы не змаглі ўбачыць ключ SSH пры наборы гэтай каманды (доўгая радок лічбаў і літар, пачынаючы з "SSH-RSA AAA"), паспрабуйце генераваць ключ RSA (яны больш бяспечныя, таму я раю выкарыстоўваць іх.) Наступны код будзе генераваць 4096 біт RSA SSH ключ.
ssh-keygen -t rsa -b 4096
Стварыце VPS, які працуе на Ubuntu, аднак вы плануеце гэта зрабіць. Пасля таго, як вы стварылі VPS, націснуўшы на формы на сайце правайдэраў (kamatera.com, ionos.com або аналагічна), вы захочаце ўвайсці ў сістэму. Каб зрабіць гэта, скарыстайцеся камандай SSH са сваім IP -адрасам (адрас, які падобны на xx.xx.xx.xx). Вы таксама павінны быць адчувальнымі да імя карыстальніка па змаўчанні на серверы, які мы стварылі, напрыклад, Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Вы можаце папрасіць пароль, калі вам просяць пароль, увядзіце яго. Мы не будзем выкарыстоўваць імя карыстальніка па змаўчанні, таму пачнем з стварэння новага карыстальніка і дадання ключа SSH у свой уліковы запіс.
Пачнем з дадання новага файла sshd_config, які распавядае серверу, як выкарыстоўваць SSH.
nano sshd_config
# Гэта файл канфігурацыі сістэмы SSHD Server. Бачыць
# SSHD_CONFIG (5) для атрымання дадатковай інфармацыі.
# Гэты SSHD быў сабраны з Path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/гульні/гульні
# Стратэгія, якая выкарыстоўваецца для варыянтаў у па змаўчанні SSHD_CONFIG, пастаўлены з
# OpenSsh павінен вызначыць параметры са сваім значэннем па змаўчанні, дзе
# магчыма, але пакіньце іх пракаментаваны. Бескарысныя варыянты перавышаюць
# Значэнне па змаўчанні.
# Порт 22
# Адрасная сямейства
# SullivAddress 0.0.0.0
# Ullivaddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Шыфры і клавіш
# RekeyLimit па змаўчанні няма
# Выход
# Auth Syslogfacility
# Інфармацыя пра LogLevel
# Аўтэнтыфікацыя:
# LogingRacetime 2M
# Дазвол
# Строгая мода так
# Maxauthtries 6
# MaxSessions 10
# Чакайце .ssh/autired_keys2, які будзе не ўлічвацца па змаўчанні ў будучыні.
# Аўтарызаваны principalsfile няма
# Аўтарызаваны
# Аўтарызаваны
# Для гэтага вам таксама спатрэбяцца клавішы хоста ў/etc/ssh/ssh_known_hosts
# Hostbedauthentication №
# Зменіце так, калі вы не давяраеце ~/.ssh/known_hosts для
# Hostbedauthentication
# Ігнаруйце
# Не чытайце файлы карыстальніка ~/.rhosts і ~/.shosts
# Ігнараваць, так
# Каб адключыць тунэльныя тэкставыя паролі, змяніцеся на не тут!
# Дапушчальныя файлы не
# Зменіце так, каб уключыць паролі Challenge-Response (будзьце асцярожныя
# Некаторыя модулі PAM і ніткі)
# Варыянты Kerberos
# Kerberosauthentication no
# Kerberosorlocalpasswd так
# Kerberosticketcleanup так
# Kerberosgetafstoken no
# Параметры GSSAPI
# Gssapiauthentication no
# Gssapicleanupcredentials так
# GssapistrictAcceptorcheck Так
# Gssapikeyexchange №
# Усталюйце гэта на "так", каб уключыць аўтэнтыфікацыю PAM, апрацоўку ўліковых запісаў,
# і апрацоўка сеансу. Калі гэта ўключана, аўтэнтыфікацыя PAM будзе
# дазволіць праз kbdinterctiveauthentication і
# PasswordAuthentication. У залежнасці ад канфігурацыі PAM,
# Аўтэнтыфікацыя PAM з дапамогай KBDInteractiveAthentication можа абысціся
# Налада "дазвол без праходу".
# Калі вы проста хочаце, каб уліковы запіс PAM і праверка сесіі, якія праходзяць без
# Праверка пам
# і kbdInteractiveauthentication да "не".
# Дазвол
# Дазволіць так
# GatewayPorts No
# X11displayoffset 10
# X11uselocalhost Так
# Дазвол так
# Printlastlog Так
# Tcpkeepalive так
# Далежнае асяроддзе №
# Сціск затрымліваецца
# ClientaliveInterval 0
# ClientaliveCountMax 3
# Выкарыстоўваюцца не
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Праверка няма
# ChrootDirectory няма
# VersionAddendum None
# Няма банера па змаўчанні
# Дазвольце кліенту перадаць зменныя асяроддзя мясцовага асяроддзя
# Пераадолець па змаўчанні падсістэм No
# Прыклад пераважных налад на аснове карыстальніка
# Параўнайце карыстальніка Anoncvs
# X11 forwarding no
# Дазволіць не
# Дазвол не
# Заклікаць сервер CVS CVS
Памятайце, што Ctrl+X і Y, каб захаваць файл. Далей, давайце напішам асноўны сцэнар пад назвай Initialize (усё ў хатнім каталогу па змаўчанні нашага карыстальніка).
nano initialize
Дадайце гэтыя радкі ў файл, замену
# !/bin/bash
Каб прайсці вас праз гэты файл, давайце запусцім радок. Першы радок паведамляе кампілятару, што гэта сцэнар Bash. Затым мы ўсталёўваем залежнасці, капіруючы SSHD_CONFIG у правільны каталог, перазагрузіўшы SSH, ствараючы клавішы SSH для кораня, даданне карыстальніка "каманды" (вы можаце выбраць імя, якое вам падабаецца, выкарыстоўвайце каманду Adduser са сваім імем і паролем адключана). Мы таксама дадаем каманду ў групу SUDO, генеруе іх ключ SSH, дадаем наш ключ да дазволеных ключоў і іх і іх друку, а таксама раздрукоўвае іх ключ. Гэты новы карыстальнік стане тым, як мы ўваходзім у сайт.
У новым тэрмінале ідзіце наперад і адкрыйце сервер зноў.
ssh team@XX.XX.XX.XX
На гэты раз вам не трэба пароль, будучы, у вас ёсць ключ SSH. Мы таксама адключылі ўваход з паролем, каб сайта больш бяспечным.
Цяпер гэты сервер запускаецца цалкам пустым без інфармацыі пра яго. Пачнем з кланавання нашага праекта з GIT, каб мы маглі загрузіць і запусціць яго на выдаленай машыне. На аддаленым серверы, падлучаным да SSH, спачатку раздрукуйце ключ SSH:
cat ~/.ssh/id_rsa.pub
Далей устаўце гэты ключ у налады GIT, як мы рабілі раней, каб наладзіць наша сховішча GIT. Цяпер мы можам кланаваць наш праект непасрэдна на сервер. Пераканайцеся, што вы стварылі рэзервовую копію праекта на мясцовым узроўні, каб ён быў на Git Server для загрузкі.
git clone git://github.com/you/yourproject.git
Ідэальна. Цяпер усе файлы тут. Мы можам бачыць іх з LS
ls
Зараз пачнем наладжваць сервер. Па -першае, скапіруйце свой каталог праекта ў простае, запамінальнае імя, якое мы будзем выкарыстоўваць для праекта.
cp -r yourproject whatyoucalledit
Дзе "Whatyoucalledit" з'яўляецца новай назвай вашага праекта. Далей нам трэба будзе стварыць асноўную ўтыліту для налады сервера. Мы захаваем гэтую карыснасць і выкарыстаем яе ў будучыні. Каб стварыць гэтую ўтыліту, давайце стварым карыстальніка бінарны, каб вызначыць, як мы рэдагуем сцэнар. Выкарыстанне BASH, EDIT/USR/BIN/ASCRIPT
sudo nano /usr/bin/ascript
Не забудзьцеся выкарыстоўваць там SUDO, каб у вас былі дазволы для рэдагавання файла. У файл дадайце гэтыя радкі:
# !/bin/bash
echo "# !/bin/bash ">>/usr/bin/$ 1
Памятаеце, што гэты сцэнар прымае аргумент, назва сцэнарыя, як 1 долар. Спачатку ён правярае, ці існуе файл, ці іншым чынам стварае яго, дадае першы радок, каб абвясціць сцэнар, гэта BASH, змяняе свае дазволы, рэдагуе яго і дадае сваю назву ў /etc /ascripts, які дазваляе нам захоўваць імёны сцэнарыяў, якія мы ствараем. Калі файл ужо існуе, проста змяніце дазволы і адрэдагуйце яго. Захавайце файл, і далей мы зменім яго дазволы. Пакуль мы выкарыстоўваем гэты сцэнар, нам не прыйдзецца гэта рабіць зноў.
sudo chmod a+x /usr/bin/ascript
Ідэальна. Зараз давайце створым сцэнар пад назвай Налада. Па -першае, не пераадолець вас, але паглядзіце, як выглядае мой сцэнар налады. Мы прабярэмся, як павінен выглядаць гэты сцэнар у вашым праекце, для пачатку вам не спатрэбіцца ўсё ў маім сцэнары.
# !/bin/bash
# sudo chmod a+x сцэнарыі/usersetup
# ./scripts/usersetup
# ssh-keygen
# Каталог праектаў
# Каманды часопіса
# Nano Config
# Git config
# Абнавіць і ўсталяваць
# Уключыць антывірус clamav
# Усталюйце імя хаста
# Налада Postgres
# Наладзіць рэзервовую копію базы дадзеных
# Адключыць iptables
# Усталюйце BitDefender
# Налада PostFix
# Стварыце бруды
# Налада Virtualenv
# Атрымаць і будаваць залежнасці
# Усталюйце правілы брандмаўэра
# Усталюйце залежнасці PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Install OpenCV-Python == 4.5.5.64
# PIP Install OpenCV-Contrib-Python == 4.5.5.64
# Усталюйце CertBot
# Запусціце Certbot
# Перазагрузіць пошту сервер
# Скапіруйце серты
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Патч Venv
# Усталюйце налады карыстальніка
# Усталюйце дазволы
# Sudo Chown -R Каманда: карыстальнікі/var/run/
# Sudo Chown Root: корань/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# Sudo Chown www-data: карыстальнікі db.sqlite3
# Скапіруйце канфігурацыю і ўсталюйце дазволы
# База дадзеных налады
# Увядзіце канфігурацыю PAM і выдаліце няспраўную канфігурацыю SSH
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /профіль
# Скапіруйце сцэнарыі смецця і ўсталюйце дазволы
# Перазагрузіце і ўключыце паслугі
# Уключыць модулі Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Адключыце сайт па змаўчанні
# Уключыць наш сайт
# Перазагрузіце Дэман і перазапусціце Apache, Postfix і Opendkim
# Усталюйце дазволы
# Канфігурацыя абмену
# Init рухавік подпісу
# Налада 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 Залежнасці, усталёўвае сертыфікаты і ўсталёўвае сервер, усталёўвае канфігурацыю, запускае і дазваляе Sever, выдзяляе своп, усталёўвае дазволы і друкуе IP, IPv6 -адрас і ключ OpenDKIM. Даволі проста, але гэта выглядае як шмат кода. Нам не спатрэбіцца шмат гэтага, таму што ў нас няма залежнасцей, мы не выкарыстоўваем салеры, салерыбіт ці Дафне, але мы ўсё роўна ўсталюем некаторыя з іх, каб пачаць. Звярніце ўвагу, што гэты код мае дамен, абвешчаны некалькі разоў.
Нам таксама трэба будзе набыць даменнае імя (гэта невялікая гадавая плата). Я рэкамендую Squarespace для набыцця дамена, іх макет інтуітыўны і просты ў выкарыстанні. Вы можаце набыць любы выбар, але ў гэтым прыкладзе я выкарыстоўваю дамен Femmebabe.com. Пасля таго, як вы купілі дамен, перайдзіце на панэль канфігурацыі DNS Squarespace і дадайце запіс, які паказвае ваш дамен на сервер на IP -адрас. Гэта павінна выглядаць так:
@ A xx.xx.xx.xx
З аператарам @ у якасці хоста, гэта значыць, усе субдомены ў гэтым дамене і каранёвы дамен будуць перанакіраваць на сервер. Ёсць больш запісаў, каб абвясціць, але мы можам перайсці да іх, як толькі мы будзем гатовыя адправіць пошту. Майце на ўвазе, што можа прайсці некалькі дзён, перш чым вы зможаце паспяхова адправіць пошту з сервера. Запісы DNS, якія мы ўсталёўваем, спатрэбіцца час для распаўсюджвання.
У любым выпадку, адзіны запіс, які мы павінны пачаць, - гэта запіс. Такім чынам, зараз мы можам запоўніць сцэнар ніжэй у адпаведнасці з нашым праектам і запусціць яго.
Пачнем з меншага сцэнарыя ўстаноўкі, каб проста ўсталяваць тое, што нам трэба для асноўнага прагрэсу. Мы яшчэ не будзем выкарыстоўваць так шмат залежнасцей і PostgreSQL, мы толькі запусцім асноўны сервер HTTP і перажываемся пра гэта, калі гэта зроблена. Памятайце, што каб атрымаць сертыфікат HTTPS і надзейна запусціць сервер, нам трэба будзе купіць дамен разам з арэнднай платай сервера. Пакуль што заменіце "каманду" ў гэтым файле на імя карыстальніка "DIR" з каталогам вашага праекта, а таксама паставіце свой ліст і дамен у тэгах <>.
Акрамя таго, перш чым запусціць гэты код, нам трэба змяніць налады на брандмаўэр, які падтрымлівае пастаўшчык хостынгу, калі ёсць. Звычайна гэта знаходзіцца на ўкладцы "Сеткі" вашага пастаўшчыка хостынгу, альбо калі вы самастойна хостынг, яго ў раздзеле "Пераадрасацыя порта" вашага маршрутызатара. Вы таксама хочаце наладзіць статычны IP праз маршрутызатар з адрасам вашай сервернай машыны, калі вы карыстаецеся самастойным хостынгам. Вам трэба будзе адкрыць наступныя парты для доступу да чытання/запісу.
22 (SSH) 25 (пошта) 587 (пошта) 110 (паштовы кліент) 80 (HTTP) 443 (HTTPS)
# !/bin/bash
# Каманды часопіса
# Nano Config
# Git config
# Абнавіць і ўсталяваць
# Уключыць антывірус clamav
# Усталюйце імя хаста
# Наладзіць рэзервовую копію базы дадзеных
# Адключыць iptables
# Налада Virtualenv
# Усталюйце CertBot
# Запусціце Certbot
# Усталюйце налады карыстальніка
# Усталюйце дазволы
# Sudo Chown -R Каманда: карыстальнікі/var/run/
# Sudo Chown Root: корань/run/sudo/ts -r
# Перазагрузіце і ўключыце паслугі
# Уключыць модулі Apache
# Перазагрузіце Дэман і перазапусціце Apache, Postfix і Opendkim
# Пакажыце IPv6 і OpenDkim для дамена
Перш чым запусціць гэты код, пераканайцеся, што набыты вамі дамен падключаны да сервера. Каб зрабіць гэта, адкрыйце тэрмінал на вашай мясцовай машыне і запусціце гэтую каманду з вашым даменам:
ping femmebabe.com # Устаўце сюды свой дамен, пасля пінга
Калі ўсё выглядае добра, і сервер адпраўляе адказы, мы гатовыя запусціць сцэнар і ўсталяваць пакеты, а таксама пачаць, уключыць і сертыфікаваць наш сервер Apache.
Гэта не ўсе ўстаноўкі, неабходныя для налады PostFix, мы разгледзім гэтую ўстаноўку больш пазней. Пакуль запусціце гэты код налады, і для ўстаноўкі і сертыфікацыі вашага сервера трэба спатрэбіцца некалькі хвілін. Яшчэ раз, пераканайцеся, што замяніце імя, электронную пошту і даменнае імя ў сцэнарыі ў адпаведнасці з набытым вамі назвай.
Цяпер, калі сервер прадастаўляецца, вы можаце перайсці да URL у любым вэб -браўзэры і праверыць, каб пераканацца, што сервер працуе HTTPS. Калі гэта не так, паспрабуйце чакаць крыху часу, каб DNS Records дагнала, а затым запусціце наступную каманду, каб паўтарыць сертыфікацыю 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>
Пераканайцеся, што ў гэтым прыкладзе замяніце імя праекта, каталогаў і дамена пры наладзе вашага сервера. Цяпер нам трэба будзе адключыць сайт па змаўчанні. Гэта можна зрабіць з дапамогай баша.
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, прасачыце іх туды, дзе яны знаходзяцца, і выправіце іх. Магчыма, вы не зможаце ўбачыць усе свае памылкі ў залежнасці ад таго, дзе яны знаходзяцца, таму, калі ў вас ёсць памылка, у якой проста кажа: "Пасеў не паўторна", адрэдагуйце наступны файл у віртуальнай асяроддзі, рэестр.py, каб выкрыць памылку.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Пракруціце да радка 83, дзе ўзнікае гэтая памылка выканання (падніміце RuntimeError ("Populate () не паўторна")), і дадайце каментар перад гэтым радком, а потым даданне, з тым жа паглыбленнем, self.app_configs = {}. Гэта выглядае так:
# Прадухіліць паўторныя званкі, каб пазбегнуць запуску AppConfig.Ready ()
# Метады двойчы.
# Падняць RuntimeError ("Populate () не паўторна")
Затым вы можаце праверыць праект яшчэ раз і выкрыць памылку.
python manage.py check
Тады вы можаце ўбачыць памылку і выправіць яе. Калі ў вас гэта выпраўлена, і код складаецца без памылак, пераканайцеся, што змяніце файл назад, так што гэта выглядае так:
# Прадухіліць паўторныя званкі, каб пазбегнуць запуску AppConfig.Ready ()
# Метады двойчы.
# self.app_configs = {}
Пры ўмове, што сервер знаходзіцца ў Інтэрнэце, калі мы ўносім дадатковыя змены ў яго, нам трэба выкарыстоўваць наступную каманду для перазагрузкі сервера:
sudo systemctl reload apache2
Дзіўна! А як наконт адпраўкі пошты? Каб пачаць адпраўляць электронную пошту, спачатку трэба будзе абнавіць канфігурацыю дамена. Гэта павінна быць на вашай панэлі DNS у Squarespace, альбо любы рэгістратар даменаў, які вы абралі. Нам таксама трэба будзе ўсталяваць і дадаць канфігурацыю і запусціць некалькі каманд.
Па -першае, давайце атрымаем адрас IPv6 на серверы. Затым мы адкрыем ваш DNS і дадамо запісы.
Каб атрымаць адрас IPv6 сервера, выкарыстоўвайце гэтую каманду:
ip -6 addr
Цяпер мы можам дадаць наступныя запісы ў налады DNS. Мае запісы выглядаюць так. Аднак для вашых запісаў вы павінны замяніць IP -адрас сваім IP (а не 75.147.182.214, гэта маё). Таксама дадайце свой дамен замест femmebabe.com, а таксама ваш адрас IPv6, знойдзены ў папярэдняй камандзе (вы не можаце выкарыстоўваць Mine, FE80 :: 725A: FFF: FE49: 3E02). Не хвалюйцеся пра DomainKey. Мы наладзім гэта апошняе.
@ А Н/а 75.147.182.214
@ Mx 10 femmebabe.com
@ PTR Н/а femmebabe.com
@ Txt Н/а Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ Усе
па змаўчанні._bimi Txt Н/а v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt Н/а v = dmarc1; p = няма
sendonly._domainkey
Txt
Н/а
Цяпер нам трэба будзе дадаць устойлівай канфігурацыі для PostFix. Усё, што нам трэба зрабіць, гэта пераканацца, што мы замяняем даменнае імя Femmebabe.com, даменным імёнам, якое вы выкарыстоўваеце. Давайце разгледзім усе файлы канфігурацыі адзін за адным і ўсталюем іх у каталог пад назвай Config у нашым праекце, каб усталяваць у АС.
nano config/etc_postfix_main.cf
Дадайце гэты тэкст у файл
# Глядзіце /usr/share/postfix/main.cf.dist для пракаментаванай, больш поўнай версіі
# Debian Special: Указанне імя файла прывядзе да першага
# радок гэтага файла, які будзе выкарыстоўвацца ў якасці імя. Па змаўчанні Debian
# is /etc /mailname.
# myorigin = /etc /mailName
# Дадатак. Дамін - гэта праца MUA.
# Адключэнне наступнага радка для атрымання папярэджанняў "затрымкі пошты"
# затрымка_Warning_time = 4h
# Гл. Http://www.postfix.org/compatibility_readme.html
# свежыя ўстаноўкі.
# Параметры TLS
# Канфігурацыя Milter
Наступная канфігурацыя!
nano config/etc_postfix_master.cf
Дадайце гэтыя радкі:
#
# Файл канфігурацыі асноўнага працэсу PostFix. Больш падрабязна пра фармат
# з файла глядзіце старонку Master (5) ручной старонкі (каманда: "Man 5 Master" альбо
# он-лайн: http://www.postfix.org/master.5.html).
#
# Не забудзьцеся выканаць "PostFix Reload" пасля рэдагавання гэтага файла.
#
# =========================================================================================================================
# Тып службы Прыватнае Unpriv Chroot Wakeup MaxProc Command + Args
# (Так) (так) (не) (ніколі) (100)
# =========================================================================================================================
# smtp inet n - y - 1 пасля экрана
# SMTPD PASS - - Y - - SMTPD
# dnsblog Unix - - Y - 0 DNSBlog
# tlsproxy unix - - y - 0 tlsproxy
# Абярыце адзін: Уключыце прадстаўленне толькі для кліентаў, альбо для любога кліента.
# 127.0.0.1:submission inet n - y - - smtpd
# -o syslog_name = postfix/Прадстаўленне
# -o smtpd_tls_security_level = шыфраванне
# -o smtpd_sasl_auth_enable = так
# -o smtpd_tls_auth_only = так
# -o smtpd_reject_unlisted_recipient = не
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o SMTPD_RELAY_RESTRICTIONS = дазвол_SASL_AUTHENTICED, Адхіляйце
# -o milter_macro_daemon_name = паходжанне
# Абярыце адзін: Уключыце SMTPS толькі для кліентаў, альбо для любога кліента.
# 127.0.0.1:SMTPS inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = так
# -o smtpd_sasl_auth_enable = так
# -o smtpd_reject_unlisted_recipient = не
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o SMTPD_RELAY_RESTRICTIONS = дазвол_SASL_AUTHENTICED, Адхіляйце
# -o milter_macro_daemon_name = паходжанне
# 628 inet n - y - - qmqpd
# qmgr Unix n - n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# =====================================================================================
# Інтэрфейсы з праграмным забеспячэннем без Postfix. Не забудзьцеся вывучыць кіраўніцтва
# Старонкі праграмнага забеспячэння, якое не з'яўляецца Postfix, каб даведацца, якія варыянты ён хоча.
#
# У многіх наступных паслугах выкарыстоўваюцца дастаўка Postfix трубы (8)
# агент. Глядзіце старонку трубы (8) Чалавек для інфармацыі пра $ {атрымальнік}
# і іншыя варыянты канверта паведамленняў.
# =====================================================================================
#
# MailDrop. Падрабязнасці глядзіце ў файле PostFix MailDrop_ReadMe.
# Таксама ўкажыце ў main.cf: mailDrop_destination_recipient_limit = 1
#
#
# =====================================================================================
#
# Апошнія версіі Cyrus могуць выкарыстоўваць існуючы запіс Master.cf "LMTP".
#
# Укажыце ў Cyrus.Conf:
# lmtp cmd = "lmtpd -a" solution = "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/veld -e -e -r $ {sender} -m $ {пашырэнне} $ {user}
#
# =====================================================================================
# Стары прыклад дастаўкі праз Сайрус.
#
# Старая кірус Unix - n n - - труба
# Flags = r user = cyrus argv =/cyrus/bin/velope -e -m $ {extension} $ {user}
#
# =====================================================================================
#
# Для дэталяў канфігурацыі глядзіце файл PostFix UUCP_README.
#
#
# Іншыя метады знешняй дастаўкі.
#
І канфігурацыя Opendkim. OpenDkim ідэнтыфікуе серверы электроннай пошты з даменнымі клавішамі, каб зрабіць іх больш бяспечнымі. Без гэтага пошта не падпісана і можа не дабрацца да паштовай скрыні.
nano config/etc_default_opendkim
Дадайце гэтыя радкі:
# УВАГА: Гэта файл канфігурацыі спадчыны. Ён не выкарыстоўваецца Opendkim
# SystemD Service. Калі ласка, выкарыстоўвайце адпаведныя параметры канфігурацыі ў
# /etc/opendkim.conf замест гэтага.
#
# Раней можна было б рэдагаваць налады па змаўчанні тут, а затым выканаць
# /lib/opendkim/opendkim.service.generate для стварэння SystemD Пераадрасацыі файлаў у
# /etc/systemd/system/opendkim.service.d/override.conf і
# /etc/tmpfiles.d/opendkim.conf. Хоць гэта ўсё яшчэ магчыма, гэта зараз
# Рэкамендуецца наладзіць налады непасрэдна ў /etc/opendkim.conf.
#
# Daemon_opts = ""
# Зменіце/var/spool/postfix/run/opendkim, каб выкарыстоўваць разетку Unix з
# postfix у Chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Адкрыцце для вызначэння альтэрнатыўнай разеткі
# Звярніце ўвагу, што ўстаноўка гэта адмяніць любое значэнне разеткі ў OpenDkim.conf
# па змаўчанні:
# Слухайце ўсе інтэрфейсы на порце 54321:
# Socket = Inet: 54321
# Слухайце ў пятлі на порце 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
# inet_listener lmtp {
# Пазбягайце зрабіць LMTP бачным для ўсяго Інтэрнэту
# адрас =
# порт =
# }
# Большая частка памяці пераходзіць у файлы MMAP (). Магчыма, вам спатрэбіцца павялічыць гэта
# Ліміце, калі ў вас ёсць велізарныя паштовыя скрыні.
# vsz_limit = $ default_vsz_limit
# Макс. Колькасць працэсаў IMAP (злучэнні)
# process_limit = 1024
# Макс. Колькасць працэсаў POP3 (злучэнні)
# process_limit = 1024
# Макс. Колькасць працэсаў падачы SMTP (злучэнні)
# process_limit = 1024
# Auth_Socket_Path паказвае на гэтую разетку userDB па змаўчанні. Гэта звычайна
# Выкарыстоўваецца DoveCot-LDA, DoVeadM, магчыма, працэсу IMAP і г.д.
# Поўныя дазволы ў гэты разетку могуць атрымаць спіс усіх імёнаў карыстальнікаў і
# Атрымайце вынікі пошуку карыстальнікаў.
#
# Рэжым па змаўчанні 0666 дазваляе любому падключыцца да разеткі, але
# Пошукі userdb атрымаюць поспех толькі ў тым выпадку, калі userdb верне поле "UID", якое
# адпавядае UID працэсу абанента. Таксама, калі UID або GID Caller адпавядае
# UID Socket альбо GID, пошук дасягнуў поспеху. Усё яшчэ выклікае няўдачу.
#
# Каб даць абаненту поўныя дазволы на пошук усіх карыстальнікаў, усталюйце рэжым на
# Нешта іншае, чым 0666 і DoveCot, дазваляе ядром ажыццяўляць
# Дазволы (напрыклад, 0777 дазваляе ўсім поўным дазволам).
# Працэс Working Auth запускаецца па змаўчанні як корань, каб ён мог атрымаць доступ
# /etc/цень. Калі гэта не трэба, карыстальнік павінен быць зменены на
# $ default_internal_user.
# user = root
# Калі выкарыстоўваецца Proxy Dict, паштовыя працэсы павінны мець доступ да сваёй разеткі.
# Напрыклад: Рэжым = 0660, група = Vmail і Global Mail_access_Groups = Vmail
# Рэжым = 0600
# user =
# група =
Яшчэ раз, пераканайцеся, што замяніце дамен ва ўсіх гэтых файлах, femmebabe.com, выбраным вамі даменам. Адрэдагуйце наступны файл, канфігурацыя DoveCot,
nano config/etc_dovecot_dovecot
І дадайце гэтыя радкі
## Файл канфігурацыі DoveCot
# Калі вы спяшаецеся, глядзіце http://wiki2.dovecot.org/quickconfiguration
# Каманда "doveconf -n" дае чысты выхад змененых налад. Выкарыстоўвайце яго
# Замест файлаў капіравання і ўстаўкі пры размяшчэнні ў спісе рассылкі DoveCot.
# '# "Характар і ўсё пасля яго разглядаюцца як каментары. Дадатковыя прасторы
# і ўкладкі ігнаруюцца. Калі вы хочаце выкарыстоўваць любы з іх відавочна, пакладзеце
# value inside quotes, eg.: key = "# char and strifting chitsepace "
# Большасць (але не ўсе) налады могуць быць адменены рознымі пратаколамі і/або
# Напрыклад, крыніца/прызначэнне IPS, размясціўшы налады ўнутры раздзелаў: Напрыклад:
# Пратакол IMAP {}, мясцовы 127.0.0.1 {}, выдалены 10.0.0.0/8 {}
# Значэнні па змаўчанні прыведзены для кожнай налады, гэта не патрабуецца адрывацца
# тыя. Гэта выключэнні з гэтага: ніякіх раздзелаў (напрыклад, прастора імёнаў {})
# Або налады плагіна дадаюцца па змаўчанні, яны пералічаны толькі ў якасці прыкладаў.
# Шляхі таксама проста прыклады, калі рэальныя па змаўчанні грунтуюцца на наладзе
# параметры. Шляхі, пералічаныя тут
# --sysconfdir =/etc-localstediR =/var
# Уключыць усталяваныя пратаколы
# Коска, падзелены спісам IPS або размяшчае, дзе слухаць злучэнні.
# "*" Слухаецца ва ўсіх інтэрфейсах IPv4 ",:" Слухаецца ва ўсіх інтэрфейсах IPv6.
# Калі вы хочаце ўказаць парты, якія
# Рэдагаваць conf.d/master.conf.
# Слухайце = *, ::
# Базавы каталог, дзе захоўваць дадзеныя пра выкананне.
# base_dir =/var/run/dovecot/
# Назва гэтага асобніка. У Multi-Instance Setup DoVeadM і іншых камандах
# можа выкарыстоўваць -i <instance_name>, каб выбраць, які асобнік выкарыстоўваецца (альтэрнатыва
# да -c <config_path>). Імя асобніка таксама дададзена ў працэсы DoveCot
# у PS вывад.
# instance_name = dovecot
# Прывітанне для кліентаў.
# Login_Greeting = DoveCot Ready.
# Спіс аддзеленых касмічных дыяпазонаў сеткавых дыяпазонаў. Злучэнні з іх
# IPS дазваляецца адмяняць свае IP -адрасы і парты (для высечкі і
# для праверкі аўтэнтыфікацыі). Disable_plaintext_auth таксама ігнаруецца для
# гэтыя сеткі. Звычайна вы ўказваеце свае серверы проксі IMAP тут.
# login_trusted_networks =
# Спіс раздзелаў праверкі ўваходу ў разеткі для ўваходу (напрыклад, TCPWrap)
# login_access_sockets =
# З proxy_maybe = так, калі проксі -прызначэнне адпавядае любому з гэтых IPS, не трэба рабіць
# перанос. Гэта не трэба звычайна, але можа быць карысна, калі пункт прызначэння
# IP, напрыклад, IP нагрузка IP.
# auth_proxy_self =
# Пакажыце больш шматслоўных загалоўкаў працэсу (у PS). У цяперашні час паказвае імя карыстальніка і
# IP -адрас. Карысна бачыць, хто на самой справе выкарыстоўвае працэсы IMAP
# (Напрыклад, для некалькіх уліковых запісаў выкарыстоўваецца адзін і той жа UID).
# verbose_proctitle = не
# Калі ўсе працэсы загінуць, калі майстар -працэс DoveCot адключаецца.
# Усталяванне гэтага "не" азначае, што DoveCot можна мадэрнізаваць без
# прымушае закрыць існуючыя кліенцкія сувязі (хаця гэта таксама можа быць
# Праблема, калі мадэрнізацыя, напрыклад, з -за выпраўлення бяспекі).
# shutdown_clients = так
# Калі не нулявы, запусціце каманды пошты праз гэтыя шматлікія злучэнні з серверам DoVeadM,
# Замест таго, каб запусціць іх непасрэдна ў тым жа працэсе.
# doveadm_worker_count = 0
# Unix Socket або Host: Port, які выкарыстоўваецца для падлучэння да сервера DoVeadM
# doveadm_socket_path = doveadm-server
# Аддзелены ў прасторы спіс зменных навакольнага асяроддзя, якія захоўваюцца на DoveCot
# Стартап і перададзены ўсім сваім дзіцячым працэсам. Вы таксама можаце даць
# ключ = пары значэння, каб заўсёды ўсталяваць пэўныя налады.
# import_environment = TZ
##
## Налады сервера слоўніка
##
# Слоўнік можа быць выкарыстаны для захоўвання спісаў ключа = значэння. Гэта выкарыстоўваецца некалькімі
# убудовы. Слоўнік можа атрымаць доступ альбо прама, альбо хоць
# Слоўнік слоўніка. Наступныя імёны слоўніка Block Maps у URIS
# Калі выкарыстоўваецца сервер. Затым іх можна спасылацца з выкарыстаннем URIS у фармаце
# "Proxy :: <name>".
# Quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Большая частка фактычнай канфігурацыі ўключаецца ніжэй. Імёны файлаў ёсць
# Спачатку адсартаваны па значэнні ASCII і разбіты ў гэтым парадку. 00-Prefixes
# У файлах прызначаны для палягчэння разумення замовы.
# Файл канфігурацыі таксама можа паспрабаваць быць уключаны, не даючы памылкі, калі
# Гэта не знойдзена:
# Дазваляе 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 для поўнага
# Дакументацыя даступных параметраў канфігурацыі.
# Log Why No
# Агульныя параметры падпісання і праверкі. У Debian "ад" загалоўка ёсць
# перабудаваны, таму што гэта часта ключ ідэнтычнасці, які выкарыстоўваецца сістэмамі рэпутацыі
# і, такім чынам, некалькі адчувальны да бяспекі.
# Падпісанне дамена, селектара і ключа (патрабуецца). Напрыклад, выканаць падпісанне
# Для дамена "example.com" з селектарам "2020" (2020._domainkey.example.com),
# Выкарыстоўваючы прыватны ключ, які захоўваецца ў /etc/dkimkeys/example.private. Больш дэталёвы
# Параметры налады можна знайсці ў /usr/share/doc/opendkim/readme.opendkim.
# Domain example.com
# Селектар 2020
# Keyfile /etc/dkimkeys/example.private
# У Debian Opendkim працуе як карыстальнік "opendkim". Калі патрабуецца Umask 007
# Выкарыстоўваючы лакальную разетку з MTA, якія атрымліваюць доступ да разеткі ў выглядзе непрывілеяў
# Карыстальнік (напрыклад, postfix). Магчыма, вам спатрэбіцца дадаць карыстальніка "postfix" у групу
# "Opendkim" у гэтым выпадку.
# Разетка для злучэння MTA (патрабуецца). Калі МТА знаходзіцца ў турме Chroot,
# Неабходна пераканацца, што разетка даступная. У Debian Postfix працуе ў
# Chroot у/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 Service. Калі ласка, выкарыстоўвайце адпаведныя параметры канфігурацыі ў
# /etc/opendkim.conf замест гэтага.
#
# Раней можна было б рэдагаваць налады па змаўчанні тут, а затым выканаць
# /lib/opendkim/opendkim.service.generate для стварэння SystemD Пераадрасацыі файлаў у
# /etc/systemd/system/opendkim.service.d/override.conf і
# /etc/tmpfiles.d/opendkim.conf. Хоць гэта ўсё яшчэ магчыма, гэта зараз
# Рэкамендуецца наладзіць налады непасрэдна ў /etc/opendkim.conf.
#
# Daemon_opts = ""
# Зменіце/var/spool/postfix/run/opendkim, каб выкарыстоўваць разетку Unix з
# postfix у Chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Адкрыцце для вызначэння альтэрнатыўнай разеткі
# Звярніце ўвагу, што ўстаноўка гэта адмяніць любое значэнне разеткі ў OpenDkim.conf
# па змаўчанні:
# Слухайце ўсе інтэрфейсы на порце 54321:
# Socket = Inet: 54321
# Слухайце ў пятлі на порце 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.
# !/bin/bash
# Налада PostFix
Цяпер запусціце запоўнены сцэнар, каб наладзіць PostFix, OpenDkim і DoveCot.
./scripts/postfixsetup
Пасля таго, як гэты сцэнар запусціўся, скапіруйце апошні радок, які ён друкуе і ўстаўце яго ў канфігурацыю DNS як значэнне для sendonly._domainkey. Гэта ключ Opendkim, які выкарыстоўваецца для ідэнтыфікацыі вашага дамена пры адпраўцы бяспечнай пошты.
Дзіўна! На працягу некалькіх дзён вы павінны мець магчымасць адпраўляць пошту з сервера пры ўмове, што ўсё наладжана правільна.
Калі вы толькі што наладзілі DNS для вашага паштовага сервера, для абнаўлення запісаў павінна спатрэбіцца менш за 72 гадзіны. Звычайна гэта значна хутчэй. Вы можаце праверыць, ці працуе ваш сервер, выкарыстоўваючы гэтую каманду, пастаўляючы вашу электронную пошту:
echo "test" | mail -s "Test Email" youremail@gmail.com
Калі ўсё, здаецца, працуе правільна, вы павінны мець магчымасць адпраўляць электронную пошту са сваім серверам. Калі гэта не працуе, паспрабуйце паглядзець часопісы, каб даведацца, якая можа быць памылка.
tail –lines 150 /var/log/mail.log
Гэта прапануе шматслоўную інфармацыю пра пошту, якая адпраўляецца серверам і ці працуе ён належным чынам. Вы павінны мець магчымасць убачыць электронную пошту і ў паштовай скрыні, калі яго няма, праверце тэчку спаму.
Вам таксама трэба будзе наладзіць свае налады ў вашых наладах. Дадайце або заменіце гэтыя радкі ў наладах
EMAIL_HOST_USER = 'team' # "Love@mamasheen.com"
Звярніце ўвагу, што мы выкарыстоўваем файл канфігурацыі, каб атрымаць пароль. Давайце загрузім гэты файл у налады, як так, у самым пачатку файла.
# Адкрыйце і загрузіце канфігурацыю
Давайце стварым гэты файл і дадамо да яго сакрэтны ключ, а таксама пароль пошты. Каб стварыць сакрэтны ключ, выкарыстоўвайце гэтую каманду з любой даўжынёй, якая вам падабаецца ў канцы:
openssl rand -base64 64
Цяпер скапіруйце тэкст, які OpenSSL згенераваў, і рэдагаваць /etc/config.json
sudo nano /etc/config.json
Дадайце ў свой файл наступныя радкі з ключом, які OpenSSL генеруецца ў якасці сакрэтнага ключа.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
Фармат JSON просты і просты ў выкарыстанні, мы можам аб'явіць іншыя ключы, якія мы таксама хочам выкарыстоўваць у нашым праекце, і трымаць іх асобна ад нашага каталога праектаў, каб іншыя карыстальнікі не маглі пісаць ім, і таму яны не могуць быць прачытаныя толькі з нашага каталога праектаў. Гэта рэкамендуецца практыкаваць для ключоў API, з якіх мы будзем выкарыстоўваць тут больш за некалькі.
Вы таксама захочаце стварыць рэзервовую копію свайго праекта, каб пераканацца, што ўсё захавана, і вы зможаце аднавіць працу пазней, нават калі вы больш не хочаце арандаваць сервер.
sudo backup
Зараз паспрабуйце адправіць HTML -ліст з вэб -сервера, пры ўмове, што адпраўка з каманднага радка працуе. Запытайце экземпляр карыстальніка ў абалонцы і адпраўце HTML -ліст гэтаму карыстачу праз Django. Змяніце маё імя ў кодзе, Шарлота, на імя карыстальніка.
python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()
Калі першая каманда не працуе, абавязкова выкарыстоўвайце
source venv/bin/activate
Пры ўмове, што ўсё будзе наладжана правільна, зараз вы атрымаеце прывітальную электронную пошту ў паштовай скрыні, адпраўленай вашым вэб -дадаткам. Добрая праца! Вы прыйшлі доўгі шлях.
Я хацеў дадаць, калі вы калі -небудзь змагаецеся з нейкімі памылкамі, працуючы над такім праектам, не саромейцеся шукаць адказы і звяртайцеся па дапамогу. Google, сярод іншых пошукавых сістэм, - выдатныя рэсурсы для пошуку дапамогі па праграмаванні. Проста шукайце памылку, якую вы атрымліваеце, і вы зможаце ўбачыць, як іншыя людзі вырашаюць праблему. Акрамя таго, вы можаце звязацца са мной, вашымі выкладчыкамі (выкладчыкамі, выкладчыкамі, рэпетытарамі), любымі аднагодкамі ў Інтэрнэце, якія даступныя для дапамогі па праграмаванні, альбо пракансультуйцеся з гэтай кнігай яшчэ раз, альбо іншымі рэсурсамі, каб знайсці рашэнні праблем, якія вы выпрабоўваеце. Я разумею, што гэта няпроста, але нават калі вы чыталі так далёка і не пішаце ніякага кода, вы шмат чаму даведаецеся пра стварэнне вэб -прыкладання з нуля. Пагладзьце сябе па спіне, вы выдатна працуеце.
Дзякуй, што знайшлі час, каб прачытаць гэтае кіраўніцтва па распрацоўцы вэб -распрацоўкі трэцяга выдання. У будучых выданнях я ўключу больш важных прыкладаў, разгледжаных у пачатку дакумента, і мы будзем пагрузіцца значна глыбей у свет праграмнага і абсталявання. Сачыце за тым, што наперадзе, і я з нецярпеннем чакаю навучыць вас будаваць неверагоднае праграмнае забеспячэнне. Да сустрэчы ў наступным выданні!
да 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 -
Пакіньце мне падказку ў Bitcoin, выкарыстоўваючы гэты адрас: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE