Misal ilə praktik veb əsaslı dərin öyrənmə və təhlükəsizlik

Daisy'profil şəkli

Tərəfindən Daisy

Practical Web Based Deep Learning and Security by Example Third Edition Charlotte Harper July 3, 2024 Updated/Converted June 3, 2025 Foreword: Security considerations in building software for the web are an important part of any web developer's plan and execution while engineering a prototype that is dependable, stable, and useful for practical purposes. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking to kill time or get something done on the internet, usually on a touchscreen smartphone device. Most people wouldn't even know where to start when they want to build a website from scratch, they would tend to start on another person's website and build something limited in functionality, dependability, ease of use and especially creativity when they could have had all the latest powerful tools at their disposal in order to build something useful without wasting time pressing buttons, and especially wasting money paying for expensive subscriptions to software few people wanted to use anyway given it's limitations in ease of use and flexibility. If you have a few minutes to read through this book and learn what I want to teach you, or even speak with me personally about your goals and get some guidance in the right direction, and are motivated to learn to code and write your own software, take this book home and set aside some time to learn to build the next influential, powerful, streamlined and important web application, a website that is all on you and does exactly what you want and meets the needs of your audience. About me: I am a software developer with a wide range of experience in C/C++, Java, Python, HTML, CSS and JavaScript. I build websites people want to use, want to visit, and even get addicted to using just to learn, recreate and kill time, and most importantly, I sell software. If you had an idea as to exactly how you wanted a website to look and function, you were willing to support me so I can meet my own needs while I meet yours, and you are willing to cover the costs of running a website yourself, I would build you the next YouTube, TikTok, Twitter, Google, or even a high-tech security app only you can access. Instead of trying to sell you my time, I'm trying to buy yours: I want to talk you into building an app (website) yourself with the information that already exists, and teach you what you need to be an independent software developer, entrepreneur, leading a successful career in whatever field you desire. And let me be clear, the education I give you will be informal. You could go to school and learn all of this with a formal education, or even read this book in school, complete your assignments, and take away a great deal from your education, but I won't formally put you in the hot seat and ask you to complete assignments. I'm not your professor, you can think of me like a friend who wants to guide you toward a career driven by your own personal success. And I'm not selling you success either, you will need to buy it with your time. Learning to code has a steep learning curve and was never easy, or even supposed to be. You need to work as hard as you possibly can and continue to try and fail and try again even when you are frustrated in order to learn and build apps yourself. That's in the nature of code itself. Code is run by a compiler that is designed to give the programmer error messages, and these will teach you how to code, even if you are simply copying the error into your search engine and reading other people's examples. And I must say, you don't need to be extremely rich, smart, successful, or even detail oriented or organized to build an app. The computer takes care of that organization for you. You just need to persevere through the trial and error, maintain focus and work hard at what you do, and you will have a very successful career in the entirety of what you do. Who I am: I realize that the last section was more about learning and your take a ways from this book. Who am I exactly? That's a complicated question. I am unclear on that myself, as I suffer from medical conditions that can make it difficult for me to even code or write this book at times, while presenting challenges with socialization and identity issues that make my life more difficult when it comes to introducing myself. In short, if you are reading this book, you brought it home because you flipped through it and thought it was useful, or even if you just read this far in, to you I am a like minded individual who wants to see you succeed in everything that you do. I am an engineer myself, a software developer, and a student, and I am writing this book for other students who want to make their lives easier by having a handbook of the software they need making their lives easier by giving examples to copy that fit together like a big puzzle into a working, useful, large, functional, cohesive, and engaging app that can drive success no matter the line of business. Largely, this is what I do: I build apps to help myself and other people succeed. I am an author as well, though this is my first publication that I intend to complete in order to put my portfolio together into a useful document, and I am an artist as well. I'll admit this to you, I'm sort of a strange person. I'm not perfect, I've had run ins with the law even leading me to leave colleges and universities and leave states in order to try to make a name for myself with more success. I am a woman by birth, I wear makeup, take photos of myself, wear dresses and other womens clothing, and I stay conscious of myself as a female by nature. I've had issues with other people in the past that lead to struggles with writing and building webapps, and I apologize that I haven't been able to get this book in your hands sooner: You needed this. You will want to read and write code that looks like mine and works like mine and does the same thing but even better, because if you can afford to buy this book instead of mashing your keyboard like I do just to create a book yourself asking money for it, you have the resources you need to be successful in your life. I had all sorts of issues with family growing up, health conditions, doctors, the media, and the law, and my code deeply reflects the struggle that is feminism and female nature in a divided and frustrated world. However, this book is something I deeply care about, my baby, my portfolio, and my livelihood, so I appreciate your consideration when you take the text home and carefully pore over it in order to learn from me. Please keep in mind I am not perfect, this book will have errors, revisions, and new editions, and you will need to think with your logical brain as best you can in order to have a successful experience with my writing. Also, understand that I mean well for you even when you face challenges when writing. Think about it like this: When you can just rent a computer system to do anything you can possibly imagine in the digital space, store all the information you encounter, analyze and organize it, and come to understand it, you will inevitably encounter difficulties with the information you are ingesting and even publishing. I tell you this because I encounter the same difficulties. Use this book at your own risk, work with your community and communities available to you to build software within a safe setting, and don't take things to personally when you fail or even succeed in the wrong way: That's how I got this far, and why I can bring you this text and help you succeed without diverging off on a path of madness that leaves me ruined, torn and frayed while I encounter the ordinary problems everyone does on a global scale thanks to the paralellistic global scale of the network on which we will work, the internet. You might not be very familiar with who I am with just a few words, but I encourage you to read on, you will get to know me as you continue to read and understand me while building your own projects to complete your work. There will be no homework with this book, as long as your professors or teachers don't assign you any, but I highly encourage you to build a portfolio of projects yourself as you read along, as well as a capstone project showcasing how you can apply what you have learned. My capstone project is the basis for most of what you will read in this book, as it incorporates code from my previous projects, code I have created and learned to write methodically by hand, and a wide range of ideas and tips that have helped me succeed to the point where I can spin up a simple app that is fully featured and looks and behaves like a popular app you might see your friend or family using, on the internet, advertised to you, or in the news. What this book is: This book is a tutorial by example. You can find code here, instructions for how to learn to code, information on debugging code and fixing errors, troubleshooting steps, instructions on how to back up and save your code, re-deploy if anyone breaks your code, secure your code, deploy your code, build interactive websites that are entertaining, engaging, and addictive, and you will get a sense of who I am, why this is important, and how to portray yourself, your app and company image, as well as the software you build in the absolute best light to be the most attractive as possible to your end users, your website's visitors. In this book, I will demonstrate a number of examples of software design with a focus on the web as a platform as well as security. We will initiate the learning experience ...
Misal ilə praktik veb əsaslı dərin öyrənmə və təhlükəsizlik

Misal ilə praktik veb əsaslı dərin öyrənmə və təhlükəsizlik Üçüncü nəşr Şarlotte Harper 3 iyul 2024 Yenilənib / 3 İyun, 2025-ci il

Ön söz:

İnternet üçün internet üçün təhlükəsizlik mülahizələri, mühəndislik mühəndisliyi, etibarlı, sabit və praktik məqsədlər üçün faydalı olan prototipi mühəndisliyinin vacib hissəsidir. HTML, JavaScript və CSS-nin tətbiqi ilə, həmçinin Python, C / C ++, Java və Bash tətbiq etmək, veb tərtibatçıları, yaradıcılığı və funksionallıq rahatlığı, təvazökarlıq və xarakterin rahatlığı, həm də orta Joe, həm də rahatlıq və vacib xidmətlər göstərmək üçün, son istifadəçi üçün rahatlıq və vacib xidmətlər təqdim etmək Vaxtı öldürmək və ya internetdə bir şey əldə etmək, ümumiyyətlə toxunma ekranlı smartfon cihazında bir şey əldə etmək. Sıfırdan bir veb sayt qurmaq istədikləri zaman, başqa bir şəxsin veb saytında başlamağı və funksionallıq, asılılıq, istifadə etmək üçün istifadə etmək üçün bir neçə insanın istifadə etmək istədikləri üçün bir neçə insanın istifadəsi və rahatlıqdan istifadə etmək istədikləri zaman öz sərəncamında, xüsusən də yaradıcılığın olması və xüsusilə yaradıcılıq, istifadəsi və xüsusən də yaradıcılıq. Bu kitabı oxumaq və sizinlə öyrətmək istədiyimi öyrənmək və hətta məqsədləriniz barədə şəxsən mənimlə danışmaq və özünüzə uyğun bir rəhbərlik etmək, bu kitabı evləndirmək və özünüzə uyğun bir şey etmək üçün bir az vaxt ayırın və istədiyinizi və istədiklərinizi və tamaşaçılarınızın ehtiyaclarını ödəməyi öyrənmək üçün bir az vaxt ayırın.

Mənim haqqımda: Mən C / C ++, Java, Python, HTML, CSS və JavaScript-də geniş təcrübə olan bir proqram inkişaf etdiriciyəm. İnsanların istifadə etmək istədiklərini, ziyarət etmək və hətta öyrənmək, yenidən öyrənmək və öldürmək üçün istifadə etmək istədikləri veb saytlar qururam və hətta vaxt və öldürməyə alışıram və ən başlıcası, proqramı satıram. Bir veb saytın görüntüsü və işləməyinizi necə istədiyinizi düşündünüzsə, mən sizinlə görüşərkən öz ehtiyaclarımla görüşə bilərəm və özünüzə bir veb saytın işləməsi xərclərini ödəməyə hazırsınız, növbəti YouTube, TIKTOK, Twitter, Google və ya yalnız əldə edə biləcəyiniz yüksək texnologiyalı bir təhlükəsizlik tətbiqetməsini qurardım. Vaxtımı satmağa çalışmaq əvəzinə, sənin almağa çalışıram: Mən sizinlə birlikdə mövcud olan məlumatlarla bir tətbiq (veb sayt) özünüzü bir tətbiq qurmaq və istədiklərinizdə müvəffəqiyyətli bir karyera quraraq müstəqil bir proqram geliştirici, sahibkar olmağınız lazım olanı öyrədir. Və məlum olum, sizə məlumat verdiyim təhsil qeyri-rəsmi olacaq. Məktəbə gedə və bütün bunları rəsmi təhsillə öyrənə və ya hətta bu kitabı məktəbdə oxuya, tapşırıqlarınızı yerinə yetirir və təhsilinizdən çox şey götürməyəcəyəm və tapşırıqları yerinə yetirməyəcəyəm. Mən sizin professorunuz deyiləm, məni şəxsi müvəffəqiyyətinizlə idarə etdiyi bir karyeraya yönəltmək istəyən bir dost kimi düşünə bilərsiniz. Və mən sizə uğurlar da satmıram, vaxtınızla satın almalı olacaqsınız. Kod deməyi öyrənmək dik bir öyrənmə əyrisi var və heç vaxt asan deyil və ya hətta olmalı idi. Ehtiyacınız ola bilər və cəhd etmək və uğursuz olmaq və tətbiq etmək və tətbiq etmək üçün əsəbiləşdiyiniz zaman yenə də cəhd etməyiniz üçün çətin bir şəkildə çalışmalısınız. Bu kodun özünün təbiətindədir. Kod, proqramçı səhv mesajlarını vermək üçün hazırlanmış bir tərtibçi tərəfindən idarə olunur və bunlar sadəcə səhvinizi axtarış motorunuza kopyalayıb və digər insanların nümunələrini oxuyun. Deməliyəm ki, son dərəcə zəngin, ağıllı, uğurlu və ya hətta detallı və ya bir tətbiq qurmaq üçün təşkil etmək lazım deyil. Kompüter sizin üçün həmin təşkilata qayğı göstərir. Sadəcə sınaq və səhv yolu ilə davam etməlisiniz, diqqəti qorumalı və etdiyiniz işdə çox çalışmalısınız və etdiyiniz işin bütövlüyündə çox uğurlu bir karyera quracaqsınız.

Mən kiməm: Son hissənin öyrənmə və bu kitabdan bir yol çəkdiyini başa düşürəm. Mən dəqiqəm kiməm? Bu mürəkkəb bir sualdır. Tibbi şəraitdən əziyyət çəkdiyim kimi, tibbi şəraitdən əziyyət çəkdiyim kimi, özümü tanıtmağa gələndə həyatımı daha da çətinləşdirən və ya şəxsiyyət məsələləri ilə çətinliklər təqdim edərkən, bu kitabı da çətinləşdirə bilər və ya bu kitabı da çətinləşdirə bilər. Bir sözlə, bu kitabı oxuyursanız, onu evə gətirdin, çünki bu, onun arasından keçdiyin və ya bu günə qədər oxusanız, gördüyünüz hər şeydə uğur qazanmağınızı düşünən kimi düşünən bir insanam. Mən bir mühəndis, bir proqram geliştiricisi və bir tələbədir, bir tələbə və bu kitabı öz həyatlarını etmək istəyən digər şagirdlər üçün həyatlarını asanlaşdırmaq istəyən, iş, faydalı, böyük, işlək, işləmə, iş xəttindən asılı olmayaraq müvəffəqiyyəti idarə edə biləcək bir kopyalamaq üçün nümunələri asanlaşdırır. Əsasən budur: Mən özümə və digər insanlara uğur qazana kömək etmək üçün tətbiqlər qururam. Mən bir müəllifəm, baxmayaraq ki, bu mənim portfelimi bir araya gətirmək üçün portfelimi bir araya gətirmək üçün başa çatdırmaq niyyətindəyəm və mən də sənətkaram. Bunu sizə etiraf edəcəyəm, mən qəribə bir insanam. Mükəmməl deyiləm, hətta daha çox müvəffəqiyyətlə özüm üçün bir ad hazırlamaq üçün kollec və universitetləri tərk etmək və dövlətləri tərk etmək üçün məni aparıcı olan qanunlarla işlətmişəm. Doğuşdan bir qadınam, makiyaj geyinirəm, özümün şəkillərini çəkirəm, paltarlar və digər qadın geyimləri geyin və mən təbiətcə qadın kimi özümü şüurlu qalıram. Keçmişdə digər insanlarla bağlı problemlər yaşanmış və WebApps-ı bina ilə mübarizə aparan və üzr istəyirəm ki, bu kitabı daha tez əlinizdə ala bilmədim: buna ehtiyacınız var. Mina kimi görünən və mina kimi işləyən və eyni şeyi oxumağı və eyni şeyi etməsini istəyərsən, amma daha da yaxşıdır, çünki bu kitabı özünüz üçün pul istədikləri kimi, həyatınızda uğur qazanmağınız lazım olan mənbələriniz var. Ailə böyümək, sağlamlıq şəraiti, həkimlər, media və qanunla hər cür problem yaşadım və qanun və məyus olan və məyuslanan dünyada qadın təbiəti olan mübarizəni dərindən əks etdirir. Ancaq bu kitab, bu kitab, körpəm, mənim portfelim və dolanışığımdan, mənimsəməyimdən və məndən öyrənmək üçün diqqətinizi diqqətlə izlədiyim bir şeydir. Zəhmət olmasa, mükəmməl olmadığımı unutmayın, bu kitab səhvlər, düzəlişlər və yeni nəşrlər olacaq və mənim yazımla uğurlu bir təcrübəyə sahib olmaq üçün edə biləcəyiniz ən yaxşı kimi məntiqi beyninizlə düşünməlisiniz. Ayrıca, yazarkən çətinliklərlə üzləşdiyiniz zaman da sizin üçün yaxşı demək olduğunu başa düşürəm. Bu barədə bu barədə düşünün. Eyni çətinliklərlə qarşılaşdığım üçün bunu sizə deyirəm. Bu kitabı öz riskinizlə istifadə edin, icma və icmalarınızla işləyin və yanlış yolda olmadıqda və ya niyə bu mətni gətirə və ya niyə bu mətni gətirə bilməyəcəyəm və niyə bu mətni gətirməyinizə kömək etdim. Biz işləyəcəyik, İnternet. Bir neçə kəlmə ilə kim olduğum üçün çox tanış olmaya bilərsən, amma oxumağımı tövsiyə edirəm, işinizi başa çatdırmaq üçün öz layihələrinizi qurarkən məni oxumağa və başa düşməyə davam edərkən məni tanıyacaqsınız. Bu kitabla bu kitabla heç bir ev tapşırığı olmayacaq, çünki professorlarınız və ya müəllimləriniz hər hansı birinizi təyin etmədikcə, həm də oxuduqlarınızı oxuduğunuz kimi özünüz, həm də öyrəndiyiniz bir portfelin portfelini, həmçinin öyrəndiklərinizi necə tətbiq edə biləcəyinizi nümayiş etdirməyi məsləhət görürəm. Mənim Capstone layihəm bu kitabda oxuduğunuzun əksəriyyəti üçün əsasdır, çünki əvvəlki layihələrimdən kodu özündə cəmləşdirdiyim və mənimlə birlikdə və ya ailənizi istifadə edərək, və ya xəbərlərdə, və ya xəbərlərdə dostunuzu və ya ailənizi görə biləcəyiniz sadə bir tətbiqə bənzər bir tətbiq və davranmağımda müvəffəq olmağımıza uyğun gəlir.

Bu kitab nədir: Bu kitab nümunə ilə bir dərslikdir. Kod, kodlaşdırma kodu, kodunuzu və kodunuzu düzəltmək üçün necə öyrənmək, kodunuzu necə qorumaq və saxlamaq üçün təlimatları, kodunuzu necə saxlaya, kodunuzu idarə etmək, kodunuzu yerləşdirmək, kodunuzu idarə etmək, interaktiv veb saytları, niyə bu vacibdir və özünüzü, tətbiqinizi və şirkətin necə də vacib olduğunu düşünəcəksiniz Mütləq ən yaxşı işıqda qurursunuz, son istifadəçiləriniz, veb saytınızın ziyarətçilərinizə mümkün qədər cəlbedici olmaq. Bu kitabda, bir platforma və təhlükəsizlik kimi internetdə bir fokus olan proqram dizaynının bir sıra nümunələrini nümayiş etdirəcəyəm. Unix Shell, yedekləmə və skript xüsusiyyətləri ilə istifadə edərək əsas bir layihə quraraq öyrənmə təcrübəsinə başlanacağıq. Sonra, əsas blog veb saytını araşdıracağıq, blogumuzu foto və video xüsusiyyətləri ilə təkmilləşdirəcəyik, həm də pulsuz proqramdan istifadə edərək təhlükəsizlik həllərini istifadə etmək və serverimizi istifadə etmək üçün istifadə edərək serverimizi təmin etmək və serverimizi təmin etmək və serverimizi təmin etmək üçün istifadə edin. Daha sonra digər anlayışlar arasında video redaktə, səsvermə, barkod tarama və optik xarakter tanınması araşdırmaq, faylla işləmə və işləmə, araşdırma aparacağıq. Yol boyu, proqramımızı pulsuz və ödənişli seçimləri ilə daha faydalı və etibarlı olmağımıza kömək edəcək API-ləri araşdıracağıq. Yolda, yanğınsöndürənlər və batırma dizaynı, qüllə və dükan dizaynı və digər müdirlər də daxil olmaqla, proqramımızı qorumaq və özünü müdafiə və təkrarçatcılığı göstərmək üçün mövcud şəbəkədə proqramımızla birləşdirəcəyimiz digər müdirlər kimi fiziki təhlükəsizlik və yaraqlı alətləri araşdıracağıq. Oyunlar, 2D və 3D göstərmə mühərrikləri qurmaq, əsas ölçülü göstərmə proqramının öyrənilməsi və silikon kauçukda elektron titrəyən masajçı nümunələrində, quraşdırılmış aparat ilə işləmə yolu ilə fasilə alacağıq və quraşdırılmış aparat ilə işləyəcəyik. Yolda, proqramımızı daha yaxşı təmin etmək üçün artıq mövcud olan maşın öyrənmə həllərini də işə götürəcəyik. Prosesi asanlaşdırmaq və təmin etmək üçün internet üçün mövcud olan səhm alətlərini də işə götürəcəyik. Bu kitab bir veb tətbiqi qurmaqda uğurunuz üçün bir bələdçidir və kompüter və quraşdırılmış mexaniki sistemlərin peşəkar şəbəkəsi ilə birləşdirir və heç bir fon biliyi və ya əvvəlki təcrübəsi olmayan proqram təminatı və quraşdırılmış aparat yaratmaq üçün bələdçi.

Bu kitab nə deyil: Həqiqətən bir veb sayt keçirmək istəyirsinizsə, sadəcə sadə bir mağaza qura və sizə lazım olanı sata, bir blog, post foto və ya video göndərə, ya da başqa bir kod xətti yazmadan bir blog göndərə bilərsiniz. Bu kitab bu deyil. Bu kitab artıq tapa biləcəyiniz hər bir proqramdan daha faydalı, tam özellikli, işlək, işlək və etibarlı olan proqramı necə qurmağı öyrədəcəkdir, çünki hələ də prototiplər olan ən son proqramı yerləşdirə bilər və həqiqətən heç bir şey etməyən insanlar üçün pul qazanmaq üçün qurulmuşdur. Bu kitabı yaxından izləsəniz, kod, tədqiqat kodu yazmaq, öz tətbiqlərinizi yaratmaq və nə etdiyinizdən pul qazanacaqsınız. Mən bu kitabdan, erkən mərhələlərdə belə pul qazanacağam, çünki bu, insanların ehtiyac duyduğu və oxumaq istədikləri və ya tətbiqlərimi aldıqda və ya istifadə etdikdə artıq satın aldıqları üçün pul qazanacağam. Bu kitab sizin üçün bir tətbiq qurmayacaq, ancaq sizə lazım olan vasitələrlə işarə edəcək və internet üçün bir nümunə olaraq özünüzə uyğun olaraq öz uğurlarını asanlaşdıracaq bacarıq və tövsiyələr, hər bir kodunuzu sizin və tərəfdarlarınız, müştəriləriniz, dostlarınız, ailəniz, ziyarətçilər, podratçılar və internetin insanları və dəstəkləmək istəyərsiniz.

Nə öyrənəcəksiniz: Bu kitab, proqramı, həqiqətən işləyən, faydalı proqram təminatı, media qeydləri, media qeydləri, media qeydləri, maşın oxunan zona barkod tarama, video və fotoşəkilləri təsdiqləmək, rekord və şəkillər (NFC) rabitə kimi birja mesajları necə qurmağı və satmaq barədə məlumat verməyi öyrədir. Bu kitab, Debian Linux-a diqqət yetirərək, Debian Linux-da, Avtomatik Meydanı quraşdırmaq və dəstəkləmək üçün, Python kodunu necə quraşdırmaq və dəstəkləmək üçün, Python kodunu necə qurmaq üçün necə qurulması, şəbəkəli cihazlar vasitəsilə istifadəçi girişləri və interaktivliyini təmin etmək, interaktiv media və digər veb saytlarla interaktiv media və şəbəkə qurmaq üçün digər veb saytları ilə interaktiv media və şəbəkə qurmaq Məqsədlər, şəxsiyyət sənədləri, şəkil və video moderasiyası, proqram təminatını, ödəniş emalı, kriptovalyutası ticarət, asinxron vəzifələr və s. Solder, tel və 3D çap materiallarından istifadə edərək, batareyalar, şarj cihazları, mikroontroldaşlar, sxemlər, mühərriklər və sensorlar, habelə çap materialları olan öz bluetooth cihazlarınızı necə qurmağı öyrənəcəksiniz. Mən əlavə istehsal və alətə tətbiq olunan 3D dizayn prinsiplərini nümayiş etdirəcəyəm, buna görə də ölmək və ölmək, öz quraşdırılmış, cihaz cihazlarınızı inteqrasiya edilmiş batareyalar, şarj cihazları, elektron sxemlər və funksional çıxışlar istehsal edə bilərsiniz. və onları Bluetooth və İnternetlə şəbəkələşdirin. Xüsusilə, hər ikisi, hər ikisini bir qrafik interfeys və ya əmr satırı proqramı və ya əmr satırı proqramı və ya komandanlıq xətti proqramı kimi proqramlaşdırılmış və daha sürətli nəticələr əldə etmək üçün bir internetə inteqrasiya edilə bilən iki qutu araşdırmasını araşdıracağıq. Əvvəlcədən təcrübəsiz bir veb sayt qurmağı və yerindən heç bir təcrübə olmadan necə qurulacağını və yerləşdirməyi öyrənəcəksiniz, işlək, təhlükəsiz, gözəl, faydalı və ən əsası praktik olun. Saytın etibarlı və daha praktik, video və audio etmək üçün maşın öyrənmə və kompüter görüntülərindən necə istifadə edəcəyinizi öyrənəcəksiniz, səsinizi bağışlayın, təklif etməli olduğunuz bütün faydalı məlumatları bölüşmək üçün digər saytları istifadə edərək səs-küydən necə keçin və insanları proqram və biznesinizə daha da vacibdir. Bu kitab ən çox media, təhlükəsizlik və maşın öyrənməsinin ən ağır şəkildə yönəldiləcək, bu, düzgün istifadəçiləri cəlb etmək və yanlış olanları real, praktik, əl və cəlbedici bir şəkildə, həm də avtomatik və möhkəm bir şəkildə yayındırmaq üçün faydalı proqram təminatına kömək edəcəkdir. Bu kitab UNIX, xüsusi olaraq Debian (Ubuntu), Bash Shell, HTML, HTML, CSS, JavaScript və Python kimi bir sıra faydalı proqram paketləri, habelə git və ffmpeg kimi faydalı bash proqramını öyrədir. Ayrıca, kriptovalyutası avtomatik olaraq necə ticarət etməyi və kriptovalyutada və ya mütəmadi debet kartlarından, hətta bunu etməyi seçsəniz, gəlininizin payıını ödəyərkən daimi debet kartlarından almağı da öyrədəcəyəm. Veb saytınızdan reklam vasitəsi ilə necə pul qazanmağı, axtarış motorları üçün tətbiqinizi necə hazırlamağı və müştərilərin sizi tapmaq üçün axtaracağı və mümkün qədər çox ümumi axtarışlarda sıralamasında yer almağı öyrədirəm. Proqramınızı necə satmaq, reklam etmək, xidmətlərinizi axtaran müştərilərə müraciət etməyi öyrədəcəyəm və artıq mövcud olan prospektlər vasitəsilə internetdə özünüz üçün bir ad hazırlayacağam və yaxşı işləyin. İstifadəçilərinizin istədiyi və istədiyinizi və istədiyinizi və istədiyiniz bir veb saytına necə qurtarmaq və necə istifadə etməklə məşğul olan bir veb saytına necə qulluq etmək üçün necə saxlanmağınızı və istifadəçilərinizi necə saxlayacağınızı necə saxlamağı öyrənin və istifadəçilərinizi yalnız sizə təmin etmək üçün bir düyməni tipli bir veb saytına qoyaraq necə saxlayacaqsınız. Bu kitab, medianın çox miqdarda, medianın çox miqdarda fotoşəkilləri səsini və yayılmasının praktikliyinə, son istifadəçilərin (müştərinizdə), yalnız sizin və yalnız sizin və şirkətinizin ən yaxşı şəkildə yaxşı görünməsi üçün etdiyiniz hər hansı bir şəkildə özünüzü satın alma və özünüzü satın almağın praktikasına diqqət yetirəcəkdir. Ayrıca, kodlaşdırma məsləhətlərindən, makiyaj və fotoqrafiya, modelləşdirmə və aktyorluq kimi bir neçə məsləhət və fiş, modelləşdirmə və aktyorluq kimi praktik boşluqları və daha çox şeydən istifadə etmək üçün lazım olan bütün vasitələrdən istifadə etmək üçün vacib olan bütün vasitələrdən istifadə etmək üçün vacib olan bütün vasitələrdən istifadə etmək üçün vacibdir. Bu kitab "praktik" adlanırVeb əsaslı dərin öyrənmə və təhlükəsizlik üçün "Bir səbəbdən:" bu mətnin öyrənmə komponenti, praktik bir nöqteyi-nəzərindən xüsusi diqqət mərkəzində, kompüterin öyrənmə, üz tanınması, görüntü və video moderasiya, görüntü inkişaf etdirmə, qətnamə İnkişaf etdirmə, görüntü başlığı və digər vəzifələr, görüntülərin xarakteri kimi digər vəzifələr, orijinal, kompüter köçürülmüş bir şəkil və ya bir optik surət (və ya çap şəklinin bir fotoşəkili kimi olması çox vacibdir. Üzünüz. Bir istifadəçi adı və şifrə və ya yeni bir IP ünvanı üçün bir istifadəçi adı və şirkəti və ya yeni bir IP ünvanı üçün bir təsdiqləmə, bəlkə də bir istifadəçi proqramı, proqramınızın təhlükəsizliyi və ya mətn mesajı kimi olması üçün bir kompüterinizi birləşdirə biləcək bir kompüter edə bilərsiniz. istifadə etmək). Qeyri-qüsursuz olan proqramı quran hər kəs bunun nə demək olduğunu bir hissi var. Proqram, istifadə etdiyimiz qurğular və hesablar həmişə bizim ixtiyarımızda deyil, proqramın özü üçün xəstə niyyəti olan hər kəsin əlində ola bilər və buna görə də proqramın özü üçün risk yarada bilər. Bu kitabın diqqət mərkəzində olan bir şeydir. Şəbəkə edilmiş bir kompüter, uzun bir açar token, adlı və ssh və ya etibarlı qabıq açarı ilə təmin edilmiş və başqa bir veb server ilə ən yaxşı şəkildə təmin edilmişdir, çünki veb server, eləcə də serverin özündə olan sənət təhlükəsizlik vasitələrinin vəziyyətini təmin edir. Veb server istifadəçinin veb brauzerinə, bu istifadəçinin cihazının ən güclü hissəsi olan istifadəçinin veb brauzerinə giriş imkanı var, çünki istifadəçinin şəbəkəli proqram təminatına daxil ola biləcəyi yerdir. Bu alət dəsti, gördüyünüz veb, səs və video (üz və ya bir şəxsin şəxsiyyəti şəkli kimi), həm də Bluetooth radio cihazlarını oxuya və yaza və yaza və yazıla bilən və hətta veb saytına bağlanan məlumatlar ilə oxuya və yazıla bilən unikal seriya implantları ilə oxuya və yaza bilər. Vasitələrin hamısını sizin ixtiyarınızdadır, bu kitabla özünüzü etibarlı bir veb sayt qurmaq üçün özünüzü biliklə təchiz edəcək və ümumiyyətlə sizin üçün işləyən təhlükəsiz şəbəkə edilmiş kompüter sistemi, təklifinizi edir və görünür və hiss edir

Harada başlamaq lazımdır: Bu kitabı və ya hər hansı bir bölmədə sizə ehtiyac duyduğunuz dəqiq kodla başlamağımdan keçmişəm, xüsusən də bu kitabdan əvvəl və ya hər hansı biri də bu kitabda ətraflı təsvir olunacağımı və bununla yanaşı, istifadə halları və praktik nümunələr barədə ətraflı təsvir olunacağam. Yazı kodunda təcrübəniz yoxdursa, bu kitabın hamısını oxumağı məsləhət görürəm və bu kitabın sizin üçün uyğun olduğundan əmin olmaq üçün əvvəlki bölmələri oxumağı tövsiyə edirəm. Bu kitab sizin üçün uyğun deyilsə, veb inkişafı özləri haqqında öyrənməkdə maraqlı ola biləcək bir dostunuza və ya qohumuna hədiyyə etməyi düşünün və hətta bir müəllim kimi və ya əvvəllər mənimdən başqa müəllimlər olduğum boşluqları doldurmaq üçün onları geri qaytarmağı və onlardan öyrənməyi düşünün. İstədiyiniz yerə başlayın, bu kitabın hər bir hissəsi faydalı bir tətbiq qurmaq niyyətindəsiniz və ən yaxşı tətbiqlərin son istifadəçi ilə inşa edildiyini düşünün: Müştərinizi bilin. İndi məni tanıyırsan, bu kitabı tanıyırsan və başlamağa hazırsan. Başlamaq üçün bir kompüterə (hətta bir qutu mağazasından, Amazon və ya köhnə bir masaüstündən ən ucuz noutbuku da (hətta köhnə masaüstündən istifadə edin və sizin üçün işləyən bir şəkildə qurun.

Bu kitabı necə oxumaq olar: Mətn vurğulanmış, mətnin bir əmr təklifinə aid olduğunu göstərir, burada işlədiyiniz kodu yazacaqsınız. Əmr əmri ağır klaviatura yönəldilmiş və heç bir tıklayarak, iş axınını sürətləndirərək və sizə daha asan bir şey tələb edir.

Başlamaq: Gəlin içəri girək. Yerli bir maşında kodu quraraq İnternetə qoşulmuş bir veb sayt qurmadan başlayacağıq. Bu, başlamaq üçün daha təhlükəsizdir, heç bir şey deyil və sizin üçün asandır. Əməliyyat sisteminizdən asılı olaraq, bir baş qabığına girmək bir az fərqli olacaq. Mac OS üçün, bir virtual maşınla ən uyğunluğu əldə edəcəyiniz üçün bu nöqtədə bir virtual maşın quraşdırmağı məsləhət görürəm. VirtualBox və Paralelllər kimi müxtəlif provayderlər sizin üçün bir virtual maşın idarə edə bilər, baxmayaraq ki, sürətli, düzəldilmiş təcrübə yaratmaq üçün tövsiyə olunan doğma mühitdən istifadə etməyi üstün tutursanız, maşınla birbaşa maşın üzərində quraşdırmaq mümkündür. Tövsiyə etdiyim Linux və ya Windows istifadə edirsinizsə, bir layihə yaratmaq olduqca asan olmalıdır. Terminalınızı açın, ölçünü uyğun gördüyünüz kimi tənzimləyin və 2-ci addımdan sonra başlayın. Pəncərələrdən istifadə edirsinizsə, 1-ci addımı izləyin.

Addım 1: - Yalnız Windows istifadəçiləri Windows-da, idarəçi və növ kimi Açıq əmr təklifi WSL -INSTALL

Addım 2: - Burada davam edin və ya Windows istifadə etməsəniz, 1-ci addımı atın Açıq Terminalda, (OS-dən asılı olaraq, Windows-da Ubuntu, Mac və ya Linux-da Terminal və ya oxşar bir ad), bir layihə yaratmaqla başlayır. Bunu bir qovluq yaradan MKDIR əmri ilə edirik. Tövsiyə olunan layihənizi saxlamaq üçün bir qovluq yaratmaq lazımdırsa, qovluğa dəyişdirmək üçün CD əmrindən istifadə edin və və

CD / PATH / TO / Directory - Yol, təyinat qovluğunuzu, standart yolunuzdan əvvəl, defolt yolunuzdan və ya / ev / istifadəçi adıdır (istifadəçi adı istifadəçi adınızdır). Defolt qovluğuna dəyişmək, CD və ya CD yazın ~ MKDIR Misal - Kataloq adı ilə "Nümunə" əvəz edin

İndi layihəniz üçün bir işçi qovluğunuz var. Fərqli bir maşına keçməyiniz və ya yazdığınız kodu yerləşdirməyiniz üçün bu qovluğunun saxladığınız qədər vacib olduğu üçün, vebin hazır olduğu üçün kodu yerləşdirin, növbəti bir neçə addımdakı qovluğunuzu yedekləmək üçün bir skript quracağıq. Ancaq bir skript qurmaq bir az kod götürür və kodun mümkün qədər faydalı olması üçün avtomatlaşdırılmalıdır. Beləliklə, əvvəlcə skript yaratmaq üçün bir skript quraq. Ssenari yaratmaq və icra etməklə başlayaq. Sudo, Chmod və bunun üçün toxunuşdan istifadə edəcəyik və "Ascript" skriptinə zəng edəcəyik.

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

İndi skript yaratdıq, bunu icra edilə bilən və onu redaktə etməyə hazır olduq. Nano, tıklayarmadan mətni düzəltməyə imkan verən mətn redaktorudur, bu, qrafik istifadəçi interfeysindən istifadə etməkdən daha asandır. Nano ilə bir faylı redaktə etmək üçün Nano və sonra faylın yolunu istifadə edin. Bir skript edən bir skript etmək üçün, ilk növbədə skriptimizi düzəltməyə kifayət qədər oxşardır. Skriptin adını, "ascript" adını, bir mübahisə parametri ilə əvəz edən eyni kodu istifadə edəcəyik. Bu, skripti yazaraq skripti yazmağa çağırırıq, bu nöqtədə yazdığınız "newscript" ni skriptinizin adı ilə dəyişdirərək yeni bir skript yarada biləcəyimizi yazmağa imkan verir. Nanodakı kod kimi görünməlidir:

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

Nano bağlamaq üçün, Nəzarət düyməsini basıb X düyməsini basıb X düyməsini, sonra faylın saxladığını və geri qayıtdığımızı ifadə edə bilərik. İndi bu üç əmri skriptini redaktə etmək üçün yazmaq əvəzinə, skriptin yenidən redaktə etmək üçün sudo ascript tipini yaza biləcəyik. Bu işləyir! Və hər hansı bir yeni skript, qabığa zəng edərək asanlıqla işləyə bilər. Gəlin işimizi indi saxlayaq: yeni skriptimizi saxlamaq və sonra ehtiyat skriptini dəstəkləyərkən, sonra yeni skriptimizi saxlamaq üçün bir yedek skriptini yazaq.

sudo ascript backup

İndi, Nano-da:

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

Harada / yol / qovluq MKDIR ilə yaratdığınız layihəyə gedən yoldur. Sonradan bu kimi təkrar yolları bir döngə və bir siyahı ilə necə kopyalamağı öyrənəcəyik, bu da daha az koddur, lakin bu da bu sadə saxlayaq və bir neçə sətirdə olaq. Bu skriptinizi idarə etmək və kodunuzu nüvəni idarə etmək, Nano-da Nano-da qeyd edin

backup

Bu kitabı oxuyarkən və qabıqda izləyərkən bir parol üçün heç bir şəkildə istənirsinizsə, istifadəçi şifrənizi düzgün daxil edin, əmrini yenidən işə salmadan əvvəl üç cəhdiniz olacaq. Rerun əmrlərinə qədər yuxarı və aşağı oxlardan istifadə edə və iki dəfə bir şey işlətməlisiniz. Sadə bir əmr seçmək üçün ara-sıra, bir əmr seçmək üçün, sağa, sol oxlar və açarı silmək və klaviatura və geri dönməklə işləyərək bir əmr seçmək üçün

Təbrik edirəm! İşçi qovluğunuzda iki vacib qabıq skriptini dəstəkləyən zəhmli bir ehtiyat skript yaratmağı bacardınız. Layihə daha da böyüdükcə hər şeyi daha da hərəkət etdirə bilərik, amma bu, bu iş üçün işləyir. Buludda böyümək üçün davam edək, bunun üçün Github-dan istifadə edəcəyik (yedek üçün çox sayda digər git həlli olsa da, hər şey eynidir. Xüsusilə proqramınızı qənaət etmək üçün instrumentaldır, xüsusən də bir kod xətti uğursuz olduqda, kilidlənməyəcəyiniz zaman kilidlənməyəndə, onu avtomatik olaraq geri qaytarmaq olmazsa, kodunuzu geri qaytarmaq olmaz.

Bu nöqtədə bir Ubuntu Virtual Maşınından istifadə etmirsinizsə, bu nöqtədə bir Ubuntu virtual maşınını istifadə edərək, işləyən veb sayt qurmaq və kompüterinizdə dərin öyrənmə əməliyyatlarını hazırlamaq üçün zəruri olan paketləri quraşdırarkən həyatınızı asanlaşdıracaqdır. Kodu yaxın gələcəkdə bir veb serverinə köçürəcəyik, ancaq bu, фишингəyə davamlı olan veb serverimizin ən azı bir neçə təhlükəsizlik təbəqəsinin olduğunu və bunun üçün bir sıra Linux paketlərini işə götürdüyünə əmin olmaq istəyirik. Hələ də Mac OS-dən istifadə etmək istəyirsinizsə, lazımi paketləri onlayn axtarmaq və quraşdırmaq üçün xoş gəlmisiniz, lakin hər paket üçün alternativ olmaya bilər, bu kitab və ya seriya əhatə edəcəkdir.

Sudeo SuboSpipt Backup-u işləyərək işimizi backup skripti ilə yerinə yetirmək üçün bir neçə əmr əlavə edək.

# ...

Bir daha qənaət etmək üçün X idarə edin.

İndi bu layihə üçün birdəfəlik konfiqurasiya etməliyik. Tezliklə bir git layihəsi olacağına görə, bir git depozitariyadan yerləşdirdiyimiz hər şeyi yazmağa ehtiyac duymuruq, ancaq yerləşdirmə skriptlərimizi yazanda bunun asğunu alacağıq. Başlamaq üçün, düzgün qovşaqda olduğumuzu və Git depo-nu işə saldığımızdan və SSH düymələrini yaratdığımızdan əmin olaq.

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

Ssh-Keygen yazdıqdan sonra yeni açar ev qovluğunda deyilən bir qovluq altında saxlanılmalıdır .Ssh .Ssh. ID_RSA.PUB adlanır. Bu açarı tapıb kopyalayaq. Görmək üçün,

cd ~
cat .ssh/id_rsa.pub

Son əmrlə geri qaytarılmış mətni kopyalayın və hesabınızdakı SSH düyməsini əlavə etmədən əvvəl GIT təminatçısı (ideal github) ilə bir hesab yaradın. Bir hesabınız varsa, SSH və Menyuda giriş altındakı SSH və GPG düymələrində SSH düyməsini əlavə etmədən əvvəl yuxarı sağ menyuya vurun və parametrləri vurun. Bir ssh düyməsini əlavə edin və yeni bir depo yaratmaq üçün Github-a qənaət etmədən və Github-a qayıtmadan əvvəl bir ssh açar əlavə edin və onu əlavə edin. Bu, digər git provayderləri üçün oxşardır, sənədlərini oxumalı olacaqsınız. Yeni depozitura konfiqurasiyasında depolarınızı təsviri ad verin və dərc etmək istəməyinizə qərar verin və hələ də daxil olmadığı üçün heç bir fayl konfiqurasiya etməyinizə əmin olun. Repozitoriya yaradıldıqdan sonra klonunu SSH URL ilə kopyalayın və aşağıdakı əmrinə yapışdırın.

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

İndi CD ilə depo-ya qayıda bilərsiniz, bu ilə tanış olacaqsınız. Yedekləmə yazısını indi yedeklə sınayın

Əla! İndi kodlaşdırmanı həqiqətən əldə edə bilərik. İndi Django quraşdıraq ki, bash və git-də yaxşı bir şey var. Django, bizə avtomatik olaraq proqramımızı geri qaytarmağa imkan verəcək, amma Django daha sadə bir tətbiqə sahib ola bilər (əlil və asanlıqla konfiqurasiya edilə bilər).

Proqramı Ubuntu-da quraşdırmaq üçün Sudo Apt-Get əmrindən istifadə edəcəyik. Birincisi, artıq yaşadığımız proqramı yeniləyək və təkmilləşdirək. Bu, Sudo Apt-Get Update və Sudo Apt-Get yeniləmə ilə edilə bilər. Sonra, Python və virtual mühitimizi, kodumuzun evi, aşağıdakı əmri ilə, Python-Is-Python3 Python3-Venv quraşdırın

Ubuntu instansiyasında proqram quraşdırması baxımından Django ilə getməyiniz lazımdır. Windows və Linux üçün bu kifayət qədər sadə olmalıdır, ancaq Mac üçün virtualbox və ya paralells masaüstündəki pulsuz və ya Pinalds masaüstündən istifadə edərək bir virtual maşın və Linux quraşdırmaq istəyə bilərsiniz və bir Ubuntu mühitini qurmaq üçün yuxarıdakı addımları yenidən qurun. Ubuntu bu vəziyyətdə kritikdir, çünki bu veb saytların işlədiyi proqramdır və bu, yuxarıda göstərilən proqramların hamısı ilə veb saytlara ev sahibliyi etməyə imkan verir.

Gəlin Djangoya qazaq.

CD ilə yenidən bizim qovluğunda:

python -m venv venv # Kodun saxlandığı virtual mühiti yaradır
source venv/bin/activate # Virtual mühiti aktivləşdirir
django-admin startproject mysite . # MySite'nin indiki qovluğumda başladığım layihə olduğu yerdir.

Django, yalnız bizi işə salır, çünki Django veb serverə ev sahibliyi edir və əsas yerli veb saytı əldə etmək üçün lazım olan hər şeyi edirik. İndi Django quraşdırıldığımız, onu necə ehtiyac etdiyimizi işlətmək üçün parametrləri bir az düzəltək. Əvvəlcə yeni bir tətbiq yaradaq

python manage.py startapp feed

İlk tətbiqin yem adlandırıldığını görəcəksiniz. Tətbiqə istədiyiniz hər şey adlandırılmalı və yeni tətbiqlər yaradacağıq, lakin hər tətbiqin adı hər dəfə tətbiqin kodda istinad edildiyi zaman ardıcıl olmalıdır. Yeni bir tətbiq əlavə etmək üçün, Tətbiqin yaratdığı digər qovluqdakı parametrləri həmişə düzəldəcəyik. Nano istifadə edərək,

nano app/settings.py

Parametrlərdə quraşdırılmış_Apps tapın və [] (] birini 3 xəttə ayırın. Boş mərkəz xəttindəki dörd boşluqdan istifadə edərək, 'yem' və ya tətbiqinizin adını əlavə edin. Parametrlərin bu bölməsi.py kimi görünməlidir:

INSTALLED_APPS = [
    'feed',
]

Unutmadan əvvəl, Djangonun işlədiyini sınayaq. Command Python.py RunServer 0.0.0.0:8000-dən istifadə edərək, serveri işlədə bilərik və sonra kodu http: // localhost: 8000-ə işləyən kompüterdə bir veb brauzerində (işləyir!) Nəzarət C-yə baxın.

İndi bir az Python kodu yazmağa girək. Django'nun üç əsas komponenti var, hamısı tamamilə kodla idarə olunur. Komponentlər model, görüntüləmə və şablon adlanır və hər biri veb səhifənin istifadəçiyə çatdırılmadan əvvəl müvafiq olaraq daha yüksək və aşağı səviyyədədir.

Model, axtarış, çeşidləmə və göstərmə üçün məlumat bazasında məlumat saxlayan koddur.

Görünüş, modelin necə göstərildiyini, manipulyasiya edilmiş və dəyişdirildiyini, demək olar ki, hər görünüşə birbaşa bir modeldən istifadə edəcəkdir.

Şablon, şablon dili adlanan bəzi əlavə zəng və fitləri olan HTML kodudur. Şablon, məsələn, piton kodu və modellər və məlumatlar (USUALL və tam) kimi kontekstlə doldurulduğu görüntü ilə göstərilir.

Django da digər komponentlərə malikdir, lakin bunlarla məhdudlaşmır:

Müzakirə etdiyimiz kimi tətbiqin konfiqurasiyası olan parametrlər.

İstifadəçinin veb tətbiqinin müəyyən hissələrinə giriş əldə etmək üçün izlədiyi naxışlar olan URL-lərdir.

Serverə göndərilən məlumatların nə qədər məlumatı, eləcə də istifadəçiyə, eləcə də verilənlər bazasına (verilənlər bazasına (verilənlər bazasına (verilənlər bazasına) müəyyənləşdirən formalar. Bunlar server tərəfində məlumatların işlənməsi əsasıdır və hər hansı bir məlumat növünü kompüter mağazalarını, ən çox mətn ipləri, nömrələri və həqiqi / saxta booleans (adətən onay qutuları) qəbul edə bilər.

HTML kodu və şablon dili olan və Python və HTML arasındakı boşluğu olan şablonlar, Python məlumatları, Python kodunu internetdə əldə edə bilsə də, Python kodu əldə edə biləcək və serverin yaxınlığında olmaması üçün bir sıra məqsədlər üçün faydalı bir veb saytı olan HTML kodu kimi təqdim edilə bilər.

Adətən JavaScript və serverin xidmət etdiyi və şablon ilə əlaqəli olan kitabxanalar olan statik sənədlər.

Serverin xidmət etdiyi və ya xarici ev sahibliyi etdiyi və ya işlənmədən əvvəl serverə yazdığı və başqa bir serverə (bir çömçə) göndərilən media faylları.

Hər mənzərə ilə eyni vaxtda işləyən və görüntüdə "daxil edilmiş" sayılan kod parçaları olan orta proqram.

Hər bir görünüşün kontekstini emal edən və əlavə kontekst əlavə etmək üçün istifadə olunan kontekst prosessorları.

İstifadəçi və ya sorğunun görüntüləmədən əvvəl müəyyən tələblər keçdiyini təsdiqləyən testlər.

Webcockets-in necə idarə olunduğunu və ünsiyyətə cavab verdiyini diktə edən istehlakçılar.

Modelləri qeydiyyatdan keçmək üçün istifadə olunan admin, bu, verilənlər bazasının qrafik interfeys vasitəsilə idarə oluna biləcəyi Django Admin səhifəsi daxilində ətraflı şəkildə idarə oluna biləcəklər.

Asinxron tapşırıqları müəyyənləşdirən kərəviz Django kodunun hissələri dərhal növbəti vəzifəyə və ya kod xəttinə keçmədən əvvəl işə başlaya bilər.

Django burada ətraflı müzakirə edəcəyimiz bir çox digər komponentlərə sahib ola bilər. Django daha funksional halına gətirməyin, sürətli, düzəldilmiş rabitə kanalları olan, asinxron vəzifələri icra edən kərəvizlər və Django'nun çox sayda digər proqramının, xüsusən də kodun əksəriyyətinin icra olunduğu görüntü funksiyalarında çox sayda proqram təminatını əlavə etmək üçün çox sayda funksionaldır. Görünüş funksiyaları, adətən müəyyən bir URL nümunəsinə və ya serverin bir hissəsinə xas olan hər kod parçasını elan etdikləri üçün açardır.

Birincisi, Görünüş funksiyalarını araşdıraq. Görünüş funksiyaları, görünüşdə istifadə ediləcək və müntəzəm funksiya tərifləri və ya dərslərdən istifadə edərək müəyyənləşdirilmiş idxal ilə başlayır. Ən sadə mənzərələr funksiya tərifi defi ilə müəyyən edilir və əsas şablon ilə bir httpresponse geri qaytarılır. "Salam Dünyası" mətnini qaytarmaq üçün əsas mənzərəni təyin etməklə başlayaq. Unutmayın ki, hər dəfə def kimi bir ifadədən sonra kod əlavə etdikdə, əgər, əgər, əgər və s. Əgər və s. Tezliklə bu vasitələrin hər birinin nə etdiyinə girəcəyik.

Saytın qovluğundan, nano istifadə edərək yem / baxış.py faylını düzəldin və faylın sonuna aşağıdakı xətləri əlavə edin.

from django.http import HttpResponse

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

Django'nun HTTPrespesponse, açılış və bağlanması ilə işarələnmiş bir mətn sətri ilə cavab verir '. Hər dəfə bir funksiyaya və ya sinifdə, istək və ya bir sətir kimi bir funksiya və ya sinfə ötürdüyünüz zaman, mötərizədən (, açılır və bağlanır) istifadə etməlisiniz.

Bu, hələ də fikrimizi görməyimiz lazım deyil. Əlbəttə ki, mənzərənin tam olduğu serverə deyilməmişik, baxışı hələ də göstərməli olan bir yolu təyin etməliyik. App / Urls.py-də əsas yolu təyin etməklə başlayaq və daha sonra yol qruplarına girəcəyik.

App / Urls.py-də, yalnız yaratdıqdan sonra görüntü idxalını idxal etdikdən sonra idxal hesabatlarından sonra bir xətt əlavə edin.

from feed import views as feed_views

İndi görünüş nümunəsini təyin edək. Nümunələrə baxın, baxışların server daxilində mövcud olan serverdə mövcuddur (veb səhifəni daxil etmək üçün istifadəçinin naviqasiya çubuğuna daxil olan URL yolu), görüntü üçün bir şablonun görüntüsünü və başqa bir görünüş üçün yer dəyişdirmək və ya daha çox məntiqi bir ad çəkmək üçün bir şəkil dəyişdirilə və yenilənə bilər. Bu şəkildə iş görməyin mənası var və çevik olun, çünki kod bazanız, qiymətli və işləmək üçün rahatlıq və doğaçlama ehtiyacı olan hər zaman dəyişən bir mühit olacaqdır. Görünüşünüz budur, bunu Urlpatters = [Tətbiq / Urls.py bölməsinə əlavə edə bilərsiniz. Görünüş nümunəsi yuxarıda təsvir olunan üç komponent və yol adlanan bir funksiya ilə müəyyən edilir. URL nümunələriniz bir siyahıdır, buna görə hər şeyi bir vergüllə hər bir elementi bitirməyə əmin olun, çünki bu, hər birini ayırır. Hər bir maddə də yeni bir xəttə getməlidir, bir daha dörd boşluq ilə bir daha, parametrlərdəki tətbiq kimi. Veb serverin kök qovluğunda işləyən bir görünüş yaratmaq üçün görünüşün ilk komponentini boş bir simli funksiyası ilə təyin edəcəyik. Urls.py indi belə görünməlidir:

from feed import views as feed_views

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

Bu, tamamilə statik olan Django ilə bir veb sayt yaratmaq üçün əsasdır. Şəkillər, videolar, audio və daha çox kimi məlumatı əldə edə biləcəyimiz daha dinamik bir veb sayt etmək üçün, növbəti araşdıracağıq modellərdən istifadə etməliyik. İndi kodumuzu yoxlayaq və serveri işə salaq. Səhvlər üçün kodu yoxlamaq üçün qaçın:

python manage.py check

Hər hansı bir səhv mesajı varsa, tətbiqinizə edilən dəyişiklikləri diqqətlə nəzərdən keçirməlisiniz və kənar və ya olmaması, əlverişsiz bir sim, istənilən tip, istənilən tip, hər hansı bir tip, istənilən tip, və ya başqa bir şey kimi düzəldilməlidir. Səhv mesajı ilə oxuyun (əgər varsa), bir xətt nömrəsi ilə birlikdə yaratdığınız və ya redaktə etdiyiniz bir faylın yolunu görə bilməlisiniz və orada olan hər şeyi düzəldə biləcəyinizə baxın. Məsələni həll etmisinizsə, yuxarıdakı əmri yenidən işə salın. Proqramınız işləməyə və işləməyə hazır olduqda, "Sistem yoxlanışı heç bir problemi müəyyənləşdirməmiş" çıxışını görəcəksiniz. İndi getməyə hazırsınız. Serveri işə salın:

python manage.py runserver 0.0.0.0:8000

İndi bir veb brauzerini açın və http-ə gedin: // LocalHost: 8000. Görünüşünüzdə HTTPresponse funksiyasının mötərizəsində və sitatlarında geri qaytarılmış mətni görməlisiniz. Bu, sadəcə əsas nümunədir, amma bu günə qədər etmisinizsə, Linux, Bash, Python və Django'nun əsaslarını başa düşürsən. Bəzi verilənlər bazası modelləşdirməsində daha dərin qazaq və məlumatların saxlanması sahəsində piton sinifinin gücünü araşdıraq. Sonra, JavaScript və maşın öyrənmə istifadə edərək saytımızı tam özəl, çevik və etibarlı etməzdən əvvəl HTML və CSS-də bir tutuş almağa başlayacağıq.

Dərslər tətbiqetmənin modellərində saxlanılır. Nano istifadə edərək, tətbiq / modelləri düzəldin və yeni bir sinif əlavə edin. Bir sinif sinif tərifi ilə müəyyən edilir və bu vəziyyətdə modellər.model-dən miras alan super bir yerdən keçir. Sinifin adı sinif tərifindən sonra gəlir və sinif tərifindən sonra A: (Colon) istifadə olunur, sinfə bağlanan atribut və funksiya təriflərindən əvvəl aşağıda qeyd olunur. Sinifimizi almaq üçün istifadə edə biləcəyimiz və özünəməxsus saxlamaq üçün istifadə edə biləcəyimiz bir şəxsiyyət vəsiqəsinə ehtiyac duyur və bəzi məlumatları saxlamaq üçün bir mətn sahəsinə ehtiyac duyur. Sonralar, bir zaman işarəsi, fayllar, booleans əlavə edə bilərik, kodumuzun modellə nə etmək lazım olduğu barədə qərar qəbul edə bilər və onu sıralamaq üçün istifadə edilə bilər), modeli serverə daxil edilmiş bir istifadəçiyə bağlamaq üçün bir nümunə və daha çox. Aşağıdakı kodu çıxaraq:

from django.db import models # Sinifimizi müəyyənləşdirmək üçün istifadə olunan idxal və bu xüsusiyyətlərdir
class Post(models.Model): # Sinifimizin özünün tərifi
    id = models.AutoField(primary_key=True) # Modelimizin şəxsiyyəti, modelin sorğusuna, onu unikal saxlamağa imkan verən avtomatik yaradılan bir açar və yaradıldıqdan sonra modellə qarşılıqlı əlaqə qurmağınız lazım olduqda faydalıdır.
    text = models.TextField(default='') # Sinif mağazalarımız, bu vəziyyətdə, bəzi mətn, boş bir sətrə defolt.

Faylı bitirməkdən əvvəl və qeydiyyatdan keçməyimizi bağlayın.

Bu sinfi tətbiqimiz inkişaf etdikcə bu sinfi yenilədikdə araşdıracağımız bir çox sahə və seçimlər var, ancaq bu, bəzi mətn göndərmək üçün bir tətbiq yaratmaq üçün əsas ehtiyaclardır. Ancaq bu model tək işləməyəcək. Daha əvvəl təsvir olunduğu kimi, bu model işləməsi üçün xüsusi bir görünüş və xüsusi bir URL nümunəsinə ehtiyac duyacağıq və şablon ilə birlikdə bir forma ehtiyac duyacağıq. Əvvəlcə formanı araşdıraq.

Bir formanı təyin etmək, Nano ilə tətbiq / formaları düzəldin və aşağıdakı xətləri əlavə edin. İki idxal, forma sinifimizi, habelə yaratdığımız model, həmçinin formaya bənzər bir sinif tərifi və bir sinif şəklində bir sahə ilə birlikdə meta olan bir sinif tərifi və bir sahə ilə birlikdə əlaqə qurma modelini müəyyənləşdirəcəkdir. Formanın sorğusu, model və ya başqa şəkildə məlumatlara əsasən müəyyən edən bir başlanğıc funksiyası da ola bilər, bu sonradan araşdıracağıq.

Model formaları bu qədər faydalıdır, çünki bir model yarada və ya bir modeli redaktə edə bilər, buna görə də onlardan ikisindən istifadə edəcəyik. Aşağıdakı Forms.py-də birini təyin edək.

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

Bu bir forma və modelin göründüyü əsaslardır. Bu model forması, bir yazını dəyişdirmək və ya redaktə etmək, tərkibindəki mətni dəyişdirmək üçün istifadə edilə bilər. Bu formanı sonrakı bir görünüşə inteqrasiya etməyə baxacağıq. Birincisi, miqrasiyanı düzəltək və verilənlər bazasını köçürək, buna görə kodumuz işlədikdə modellə qarşılıqlı əlaqə qura bilər. Bunu etmək üçün aşağıdakı əmrləri işə salın:

python manage.py makemigrations
python manage.py migrate

Bu, icra etmək üçün bir dəqiqə çəkəcək, ancaq bir dəfə də bir dəfə modelə baxışlarda, orta qab və ya proqramda başqa bir yerdə daxil olmağa imkan verəcəkdir. Modelimizi görə biləcəyimiz bir fikir söyləyərək davam edək. Feed / Baxışları düzəldin və qeyd etdiyi kimi aşağıdakı kodu əlavə edin. # İşarədən sonra bir şey əlavə etməyinizə ehtiyac olmayacaq, bu kod kod haqqında məlumatı ifadə etmək üçün istifadə olunan şərhlərdir. Modelimizi fikirlərdə idxal edərək başlayacağıq və onu bir şablonda göstərə biləcəyimiz bir kontekstə əlavə edəcəyik. Sonrakı, modelə əsaslanan yeni bir obyekt yaratmaq və serverə göndərin və bir düymə ilə forma və modeli bir düymə əlavə edə biləcəyimiz bir şablon əlavə edəcəyik. Bu mürəkkəb səslənir, buna görə addım-addım ataq. Görünüşü bitirmədən əvvəl, yalnız modeli təqdim edən bir şablon yaradaq və qabıqda yeni bir yazı yarataraq görə biləcəyimizə əmin olun. Bu baxımdan necə görünməlidir:

    posts = Post.objects.all() # İndiyə qədər verilənlər bazasındakı bütün yazıları sorğu

Altına çatana qədər hamısı olduqca sadə görünür. Göstərilən, əvvəlki nümunə kimi bir HTTP cavabının əvəzinə funksiyanın əvəzinə, ilk giriş kimi bir sorğu tələb edir, həmişə şablonda göstərilə bilən bir konteksti (bu vəziyyətdə verilənlər bazasında yazılar) qəbul edir və funksiyada müəyyənləşdirilmiş şablonu geri qaytarır. Şablon, Python məlumatlarını HTML-ə təqdim edən Jinja2 adlı bir az bir dildə HTML sənəd olacaqdır.

Şablonlar yaratmağa başlamaq üçün yemdə iki qovluq hazırlayın.

mkdir feed/templates
mkdir feed/templates/feed

Sonra, yuxarıdakı qovluqda bir şablon redaktə edin, qidalandırın / şablonlar / yem və bu nümunə üçün kodu əlavə edin. Bu nümunə üçün şablona baxaq.

Bu çox sadə bir şablondur. HTML etiketlərini, bir sənəd tipi etiketi, bir əfsanə adı olan bir lövhə titulunu, bir lövhə tüfəngi, ekranda kiçik bir xətt əlavə edən bir bədən etiketini və şablondakı yazıların siyahısında hər bir yazını verən bir braunt etiketi və bir braunt etiketi, bir braunt etiketi və bir break etiketi, bir break etiketi və bir braunt etiketini müəyyənləşdirir. Bu, ismarıcları göstərmək üçün lazım olan şeydir, ancaq hələ verilənlər bazasında heç biri yoxdur. Qabıqla bəzilərini yaradaq. Qabığı idarə edə bilərik.

python manage.py shell

İndi post modelimizi idxal edək

from feed.models import Post

Sonra, bir simli bir sadə yazı yaradırıq və qabıqdan çıxacağıq. Sətir bir şey ola bilər, çünki etibarlı mətndir.

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

Nəhayət, yemimizə bir URL nümunəsi əlavə etməliyik. Feed tətbiqetməmizdən çox URL-lərdən istifadə edəcəyik və fayl ölçülərini kiçik saxlamaq istəyirik, gəlin bu kimi görünən yem tətbiqimizdə yerli URLS.PY yaradaq:

from django.urls import path
from . import views

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

Baza tətbiqetməsindəki URLS.PY-ni də redaktə etməliyik, buna zəng etmək qərarına gəldiyimiz hər şey yaratdığımız ilk qovluq idi. Tətbiq / app.py redaktə edin və URL nümunələrinə aşağıdakıları əlavə edin

from django.urls import include # başında
    # ... əvvəlki kod burada

İndi Python idarəedicisi ilə serveri işlədiyimiz zaman, yaratdığımız səhifəni, çünki məlumat bazasında olan maddələrlə birlikdə model, görüntü və şablon, həm də URL naxışımız var. Sonra, yaratdığımız formanı həyata keçirək və öz yazılarımızı yaratmağa başlayaq. Ancaq çox kod yazmadan əvvəl, əvvəllər yazdığımız skriptdən istifadə edərək yedekləmə edək. Bu skriptin qabığına işlədin, bir neçə dəqiqə gözləyin və bütün kodu Git depolarımıza dəstək veriləcəkdir.

backup

Formanı həyata keçirmək nisbətən sadədir. Formamızı idxal edəcəyik, bir yazı sorğusu işləyicisi əlavə edəcəyik və eyni mənzərəyə yönləndirmədən əvvəl verilənlər bazasında yazını saxlayacağıq. Artıq idxal etdiyimiz yönləndirmə funksiyasından istifadə edə bilərik və görüntü nümunəsi üçün URL-ni əldə etmək üçün tərs adlandıra bilərik. Daxil edilmiş naxışın adları yemi, çünki bu, 'yemi: yemi' ilə soruşacağıq, çünki daxil edilmiş naxışın adları qidalandırılır və görünüş də yem adlanır.

    posts = Post.objects.all() # İndiyə qədər verilənlər bazasındakı bütün yazıları sorğu
    if request.method == 'POST': # Yazı tələbini idarə edin
        form = PostForm(request.POST) # Formanın nümunəsi yaradın və məlumatları ona saxlayın
        if form.is_valid(): # Formanı təsdiqləyin
            form.save() # Yeni obyekti xilas edin
        return redirect(reverse('feed:feed')) # Bir tələbi ilə eyni URL-ə yönləndirin
        'form': PostForm(), # Formanı kontekstə keçdiyinizə görə, buna görə də göstərə bilərik.

İndi şablonu yeni formanı hesablamaq üçün yeniləməliyik. Bunu istifadə edərək bunu edə bilərik

HTML-də etiket və bir təqdim düyməsi ilə HTML şablonundakı formanı göstərin. Xarici saytların bir səhifəni ilk yükləmədən formaya göndərilməsinin qarşısını alan bir token, bir tokenə də ehtiyac duyacağıq.

Bunu qıraq. Yeni bir forma sinfi, bir əlamət, forma özü və bir təqdim düyməsi var. Olduqca sadə, ancaq bir nəzər saldığımızda, onu daha yaxşı görünmək istəyə bilərik. Bu işləyir, yeni yazıları forma ilə göndərə bilərik və indi bazada saxlanılır. Burada bir neçə şey davam edir. Sənədin HTML sənədi olduğunu elan etmək üçün HTML etiketlərindən istifadə edirik, forma üçün işarəni və digəri, digəri, {% ...%}} şəklini göstərmək üçün bir şablon etiketindən ({% ...%} istifadə edirik) istifadə edirik. Blok etiketlərindən və şablon etiketindən istifadə edərək mətni göstərmək üçün bir döngəmiz var. Blok etiketləri həqiqətən vacibdir, çünki şablonun onlarla necə qurulduğunu müəyyənləşdirə bilərik və şablon etiketləri dəyişənlərimizi kodumuza necə qoyduğumuzun əsasını təşkil edə bilərik.

İndi tətbiqimizi daha yaxşı görüntüləməliyik, çünki indi həqiqətən əsas görünür. Bunu CSS-dən istifadə edərək, ya da, ya da sənəddəki hər bir obyektə bağlanmış siniflərdə edə bilərik. CSS həqiqətən gözəldir, çünki səhifədəki hər şeyi necə görünməlidir və onu həqiqətən yaxşı görünə bilər. Bunu edə biləcək bir neçə kitabxana var, amma şəxsi gedişim Bootstrap.

Bootstrap veb saytından yüklənə bilər,getbootstrap.com/. Orada bir dəfə quraşdırma sənədlərini oxumaq və kodu CDN bölməsi vasitəsilə daxil etmək üçün kodu kopyalayın. HTML sənədinizin başında bu koda, baş adlı bir etiketdə ehtiyacınız olacaq. Ayrıca, hər şablonda bu bağlantıları yenidən yaratmağa ehtiyac duymadığımız üçün bir əsas şablon yaradaq.

MKDIR şablonları ilə şablonlar adlı yeni bir qovluq edin və sonra şablonları / baza.html redaktə edin.

Bu belə görünməlidir:

CSS və JavaScript, .css və .js sənədlərini, çünki saytımızı gələcəkdə daha funksional etmək üçün JavaScript-ə ehtiyac duyacağıq.

İndi, baş qabığına qayıdaq və sürətli bir əmr qaçaq. Unutmayın ki, virtual mühitə daxil olmağınız lazımdırsa, mənbə Venv / bin / aktivləşdirin. Bu, Python paketlərini yerli olaraq Django-nun onlara daxil olmasına imkan verən bir şəkildə quraşdırmağa imkan verəcəkdir. Django Bootstrap dərsləri tərəfindən yaradılan formalarımızı vermək üçün, xırtıldayan formalar adlanan bir python paketindən istifadə edəcəyik. Bunu aşağıdakı əmrlə yükləyə bilərik

pip install django-crispy-forms

Bu quraşdırıldıqdan sonra Parametrlər.py-ə əlavə edin

    # ... əvvəlki kod burada

İndi yem şablonumuza qayıdın, bəzi şeyləri silə bilərik. Sənədin başlanğıcını və sonunu çıxaraq və uzanan və blok tərifindən istifadə edərək baza şablonumuzdan mirasla əvəz edək. Ayrıca, forma və şablon filtri ilə şablon filtr idxalı əlavə edəcəyik. Nəhayət, daha çox düyməyə bənzəmək üçün formadakı düyməyə düyməsinə düyməsinə əlavə edək. Bu belə görünməlidir:

Gözəl! Artıq onsuz da bir az koddur. Sonra, onu sınamalı və hər şeyin gözəl göründüyünü və hər şeyin düzgün işlədiyinə əmin olmalıyıq. Əvvəlki təlimatlara uyğun olaraq serveri işə salın və saytın göründüyünə və yaxşı işlədiyinə əmin olun. Əla iş! Bənzər URL, Formalar, Formalar, Baxışlar və Şablonlardan istifadə edərək istifadəçi giriş funksiyasını əlavə edəcəyimiz növbəti mərhələyə keçməyə hazırsınız. Baza şablonu vacibdir və onu dəyişdirməyə və lazım olduqda dəyişiklik etməyə davam edəcəyik, lakin bu gün istifadəçilərin istifadəçi adı və parol kodu ilə daxil olmağa və yalnız sizin tərəfindən əldə edilə bilən daha vacib məlumatlar hazırlayaraq, saytımızı daha etibarlı şəkildə düzəltməyə diqqət yetirək.

Bunu etmək üçün, Django-ya quraşdırılmış istifadəçi modelindən istifadə etməliyik. İstifadəçi modeli, bir istifadəçiyə veb saytına daxil olmaq üçün göstərilə bilən bir verilənlər bazası modelidir. Gələcəkdə saytı internetə yerləşdirməzdən əvvəl bu modeli ona aid digər modellərlə uzatacağıq və fişinqə davamlı olan giriş üçün əlavə təhlükəsizlik tədbirləri quracağıq. Django'nun təmin etdiyi giriş formalarında bəzi quraşdırılmış bəzi istifadə edərək başlayacağıq. Birincisi, əsas giriş səhifəsi üçün şablon və fikirləri göstərmək üçün istifadə edəcəyimiz yeni bir tətbiq yaradaq. Ayrıca, bir pinkode, üz tanınması, sahə rabitəsi, xarici cihazların, çox amil identifikasiyası və barmaq izi tanınması daxil olmaqla, tətbiqin təmin edilməsi üçün davamlı giriş problemlərini də təmsil etmək üçün digər tətbiqlər də yaradacağıq.

Artıq bir tətbiqə başlamaq barədə danışdıq. Virtual mühitin içərisində olan qovluğumuzdan, bu dəlilləri keçin

python manage.py startapp users

İndi yeni tətbiq üçün bir qovluq olmalıyıq. İstifadəçi girişinə uyğun gələn bu qovluqda bir görünüş yaratmaqla başlayaq. Django istifadəçi girişləri üçün fikirlər qurdu, lakin bu, bizə uyğun olmayacaq, çünki bir təriflə edilən xüsusi bir görünüşə ehtiyacımız var.

Bu baxımdan, bir poçt sorğusu, sorğu keçirərək, Django-dan idxal edilən bir giriş formasına keçərək, istifadəçi hesabını təsdiqləməyinizə və istifadəçiyə yönləndirmədən əvvəl istifadəçiyə daxil olacağıq.

İstifadəçilər / Baxışlar.py-də, aşağıdakı kodu əlavə edin

        username = request.POST['username'] # İstifadəçi adı və şifrənizi poçt sorğusundan alın
        password = request.POST['password'] # İstifadəçini təsdiqləyin

Əsas giriş görünüşü üçün lazım olan hər şey budur. İndi baza şablonunu uzatmaqla görünüş üçün bir forma yaradaq. İstifadəçilər qovluğundakı şablonlar üçün yeni bir qovluq yaratmaqla başlayacağıq.

mkdir users/templates
mkdir users/templates/users

İndi istifadəçilər / şablonları / istifadəçiləri / Giriş.html-i düzəldə bilməliyik. Bunda olduğumuz zaman, istifadəçiyə də qeydiyyatdan keçmək üçün bir şablon yaradacağıq.

nano users/templates/users/login.html

İndi şablonda,

Bu giriş şablonunun əsaslarıdır. Bu, həqiqətən quruluşdakı digər şablon kimidir, ancaq göstərildiyi zaman bir az fərqli görünür. Bu kodu qeyd edə biləcəyimiz və qurulduğumuz yeni bir forma istifadə edəcəyimiz bir qeydiyyat.html adlı digər oxşar bir şablon qurmaq üçün kopyalaya bilərik. Əvvəlcə şablonu edək. İstifadəçilər / şablonlar / istifadəçiləri / Qeydiyyatdan istifadə edin / Qeydiyyat.html və Aşağıdakı kodu əlavə edin:

İndi istifadəçi qeydiyyatı üçün bir forma quraq və bir model ilə istifadəçi girişlərimizi təkmilləşdirməzdən əvvəl fikirlərə yenidən çevrək. Bu formanı başlamaq üçün əsas hala gətirəcəyik, lakin gələcəkdə razılaşmalar və captcha kimi daha çox məlumat və təhlükəsizlik xüsusiyyətlərini özündə birləşdirəcəyik. Nano istifadəçiləri / forma.py ilə formaları düzəldin və aşağıdakı kodu əlavə edin.

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

Beləliklə, burada ədalətli işləyən başqa bir forma var. Bir istifadəçi adı, e-poçt və şifrə, eləcə də bir istifadəçi qeydiyyatı forması, eləcə də bir parol sahəsidir. Qeyd edək ki, bu forma müntəzəm formaları uzatmır. Bir sahə eyni şəkildə müəyyən edilir və Sinif meta formasını müəyyənləşdirir, formanın formaya yazılacaq məlumatların qalan hissəsinə uyğundur. Bunun əksəriyyəti Djangonun istifadəçi tərəfindən qurulmuş istifadəçi formasında quraşdırılmışdır, buna görə də bu sinif üçün əsas kimi istifadə edəcəyik (mötərizədə keçdi).

Sonrakı, indi bir forma və şablonumuz olan bir istifadəçiyə qeydiyyatdan keçmək üçün görünüşü araşdıracağıq. Bu, yeni yazı baxımından biri kimi bir modelformdur. İstifadəçiləri / Views.py redaktə edin və aşağıdakı kodu əlavə edin:

# ... İdxal

Bu, istifadəçi qeydiyyatdan keçmiş bir istifadəçi almalıyıq, amma daha çox məlumatımız olmalıdır. İstifadəçinin qeydiyyata alındığını, saytda sonuncu dəfə, onlar haqqında bəzi məlumatlar, bir tərcümeyi-halı, vaxt qurşağı və s. Bildiyiniz bir məlumat, postumuzu istifadəçi modeli və hər bir istifadəçiyə atribut yazılarımızı yeniləməliyik. Bunu etmək üçün hər iki tətbiqdə modelləri yeniləyəcəyik. Yem modelini redaktə etməklə başlayaq. İndi belə görünməlidir:

from django.db import models # ... İdxal
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Bu xəttə əlavə edin

Faylın əlavə edilmiş ikinci xəttə diqqət yetirin. Bu, hər bir yazını bir post başına bir istifadəçiyə aid edəcək bir xarici açardır, buna görə istifadəçi başına bir istifadəçi əsasında ismarıcları saxlamadığımızdan əmin ola bilərik və bir istifadəçiyə aid deyil. Bu xarici açarı təmsil etdiyi siniflə müəyyənləşdiririk, mesajları təmin etmək üçün istifadəçilər, null və boş arqumentlər, lazım olduqda istifadəçini silə bilməyəcəyimiz və istifadəçinin yaratdığımız, istifadəçinin yaratdığı yazı obyektlərinə istinad etdiyimizi və istifadəçi adının yaratdığımızdan istifadə edə biləcəyimizi və boş bir arqumentlə silinir. Bu əlaqəli ad, post.author'dan fərqli olaraq, postun müəllifi, postun özündən yerləşdirən istifadəçisini verir. İndi mesajları istifadəçi ilə istifadəçi, istifadəçi və ya müəllifi () və ya müəllif.posts.all () tərəfindən hazırlaya bilərik.

İndi girişlərimizi daha rahat edək. Saytımıza bir giriş sayını məhdudlaşdıracağıq, saytın sayına girməyimizi məhdudlaşdırmaq üçün saytımızı daha az həssas edə bilərik, bu, bu olduqca asandır. Tətbiqimizi inkişaf etdirməyə davam etdikdən sonra hər bir istifadəçi haqqında bəzi məlumatlar da saxlayaq. İstifadəçilər / modelləri düzəltmək, aşağıdakı kodu əlavə edin.

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

Qeyd edək ki, bu model post modelinə kifayət qədər bənzəyir. Bizdə DateTime sahələrində defoltları təyin etməyə imkan verən əlavə bir idxal, vaxt zonası var və həm də post kimi bir simvolfeild və mətn sahəsi var. Bu timestampların hamısından istifadə saytın təhlükəsizliyinə və istifadəsini başa düşməyə kömək edir və mətn sahələri hər bir istifadəçi və ya müəllif haqqında məlumat verməyə imkan verir. OneToonefield, yeganə kiçik düşüncə olmalıdır, bu, bir foreginkey ilə eyni davranır, ancaq sonrakı model üçün yalnız biri ilə. Bu yolla, istifadəçinin yalnız bir profilinə malikdir, bir çox ismarıc ola bilər.

İndi, Girişimizi yaxşılaşdıraq və profil üçün hesablama üçün görüntüləri qeyd edək. Birincisi, istifadəçiləri düzəldin / Views.py və Reyestr görünüşünə diqqət yetirin:

# ... İdxal
            Profile.objects.create(user=user) # İstifadəçi üçün bir profil yaratmaq üçün bu xətti əlavə etdiyinizə əmin olun

Bu, sadəcə məlumatı doldurmadan istifadəçi üçün bir profil yaradır. İndi istifadəçi hesabının çox tez-tez daxil ola bilmədiyinə və ya ən azı şifrələrə çox tez-tez cəhd edilə bilməyəcəyinə əmin olmaq istəyirik, buna görə giriş görünüşünü yeniləyək.

# ... İdxal
        if user and user.profile.can_login < timezone.now(): # Qeyd edək ki, istifadəçinin daxil ola biləcəyi olub olmadığını yoxlayırıq
        else: # Giriş uğurlu olsaydı,
            user = User.objects.filter(username=username).first() # Bu istifadəçilərin profilini yenilədiyimiz bir hissədir
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Beləliklə, bir neçə saniyə yenidən daxil ola bilmirlər

Bu, təhlükəsizliyin əsas fundamentaldır. Saytın eyni zamanda hər mümkün şifrə birləşməsini və ya hətta bir neçəsini sınamaq üçün saytın həssas olmadığından əmin olun. Bu, onların parol kodunu bilən və yalnız bir neçə cihazda qeyd edən adi istifadəçiyə əsəbi olmayacaq, lakin bu, çox sayda phishing robotlarını tətbiqdən kənarda saxlayacaqdır. Qeyd edək ki, dəyişən, Can_login, keçmişdə bir zaman olmalıdır və eyni istifadəçi adından istifadə edərək hər uğursuz giriş ilə yeniləyəcəyik. Bu yolla, zərərli bir istifadəçi tez yaxın bir yerdə bir parol təxmin edə bilməz. Datetime.Timedelta () saniyələrin sayı da yenilənə bilər və veb sayt daha rahat olacaq, lakin daha çox saniyə ilə biraz daha az istifadə edilə bilər. İlə başlamaq üçün 15 tövsiyə edirəm.

Unutmayın, işimizi xilas etmək üçün bir ehtiyat skript qurduq, buna görə də, hər şeyin saxladığımızdan əmin olmaq üçün indiyə qədər əldə etdiyimiz şeyləri geri və geri çəkək. Əmri işə salın:

sudo backup

Bir daha, bu günə qədər işinizi xilas edəcəkdir. İşinizi saxlamaq üçün tez-tez ehtiyat nüsxələrini işlətməyi məsləhət görürəm və hətta avtomatik olaraq bir ehtiyat işi idarə etmək istəyə bilərsiniz. Bunu Cron adlı bir UNIX yardım proqramından istifadə edərək edə bilərsiniz. Bu yardım proqramını aktivləşdirmək üçün aşağıdakı əmri işə salın və şifrənizi daxil edin:

sudo crontab -e

Nano üçün 1-ci seçim seçməmisinizsə, onsuz da tanış olmalı olduğunuz mətn redaktoru və ox düymələrindən istifadə edərək faylın altına gedin. Aşağıdakı sətri əlavə edin:

0 * * * * sudo backup

Cron format dəqiqəsində, saat, ay, ay, ayın günü, bir * və ya bir nömrənin əmrini nə vaxt işlədikləri zaman bir * və ya bir nömrəni təmsil edir. Dəqiqə və * Vestlər üçün 0-dan istifadə etmək üçün, dəqiqələrin başlanğıcında hər saatın ilk dəqiqəsində bir əmr edə bilərik. Bu, kodu avtomatik olaraq geri qaytarmağa imkan verir. Sudo ilə icra edildikdə bütün Cronun işləri kök kimi çalışır, buna görə hər saatda bir parol yazmağa ehtiyac qalmayacağıq.

Bir şifrə istifadə etmədən kodumuzu yedekləməyi asanlaşdırmaq üçün, yedək əmrimiz üçün şifrəni deaktiv edək. Bunu aşağıdakı əmri yerinə yetirmək və şifrə daxil etməklə edəcəyik:

sudo visudo

İndi faylın altına gedək və başqa bir xətt əlavə edək:

ALL ALL=NOPASSWD: /bin/backup

Bu, hər hansı bir istifadəçi olaraq "Yedekləmə" əmrini hər hansı bir istifadəçi kimi işə salmağa imkan verir. Bunun üçün format asandır, sadəcə "Hamısı = Nopasswd: / bin /" ilə xətti önə çəkin və əmrlə, məsələn / usr / bin / bacı / BİN / yedekləmə.

İndi e-poçtla işə başlayaq. Elektron poçt, veb saytlar üçün həqiqətən vacibdir, çünki veb saytın daha etibarlı olmasının bir yolu, istifadəçilərin real insanlar və hətta müştərilərə bazar məhsulları və ya xidmətləri olduğunu yoxlayın. İnternetdən tez-tez tez-tez bir çox insan e-poçtlarını yoxlayır və maraqlandıqları məhsul və xidmətlər haqqında hər cür marketinq e-poçtunu alır. Bir Django veb saytında e-poçtu işə salmağa gəldikdə bir neçə seçim var və sizin üçün ən yaxşı işləməyi seçsəniz.

Birincisi, domeninizdən e-poçt göndərməyinizə və minimal kod tələb etməyinizə imkan verən bir e-poçt xidməti üçün ödəyə bilərsiniz. Google Workpace, SendinBlue, Mailgun və sair kimi bunu təklif edən bir çox xidmətlər var.

Əks təqdirdə, sıfırdan serverinizdə öz e-poçt xidmətinizi qurmadan yaxşısınız. Daha çox kod və xüsusi hosting tələb edə bilsə də, bu seçimi tövsiyə edirəm. Çox güman ki, ev kompüterinizdən bir poçt serverinə başlaya bilməyəcəksiniz, buna görə də buludda bir serverə başlamazdan və öz poçt serverimizi yaratmadan əvvəl e-poçt göndərmək üçün konfiqurasiya və kodu göndərək.

Əvvəlcə aşağıdakı əmr ilə parametrləri düzəldin:

nano app/settings.py

Tətbiq başlanğıc ilə yaratdığınız tətbiqin adıdır.

Aşağıdakı xətləri əlavə edin:

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)

Tətbiqinizi yerləşdirməyə hazır olduğunuzda bunları dəyişdirdiyinizə əmin olun, bu barədə sonra yenidən baxacağıq. Email_Address qəbulu göndərmək istədiyiniz e-poçt olmalıdır və şifrəniz (e-poçt_host_password) server üçün yaraddığınız şifrəyə təyin olunmalıdır. Şifrəni konfiqurasiya faylından bir konfiqurasiya faylından, aşağıdakı məntiqdən istifadə edərək, parametrlərdəki bu sətirlərdən istifadə edərək, bu sətirlərdən istifadə edərək yükləyirəm.

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

Sonra Nano istifadə edərək Nano istifadə edərək /etc/config.jon konfiqurasiya ilə bir json faylı qurdum.

Faylın redaktəsi üçün:

sudo nano /etc/config.json

Aşağıdakı xətləri əlavə edin:

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

Konfiqurasiya faylını redaktə etməyə və tətbiqdə istifadə edəcəyimiz bütün şifrələrin və düymələrin hamısını əlavə etməyə davam edəcəyik. İndi, Python istifadə edərək e-poçtu necə göndərəcəyinizi tez bir zamanda araşdıraq. Birincisi, istifadəçilərimizə göndərə biləcəyimiz bir yoxlama e-poçtu üçün bir şablon yaradaq və istifadəçi şablonları qovluğuna qoyun. Bu şablon HTML-də yazılacaq.

nano users/templates/users/verification_email.html

Bu e-poçt kifayət qədər sadədir. Bir istifadəçi, sayt üçün baza URL və istifadəçinin e-poçtunu yoxlamaq üçün istifadə olunan bir istifadəçi id və əlamətləri bir konteksti və bir istifadəçi identifikatoru və Token tələb edir. Şablonu göstərmək üçün bəzi Python kodunu yazmadan əvvəl parametrlərdə əsas URL-i təyin etdiyinizə əmin olun. Gedin və başlanğıc yaxınlığında tətbiq / parametrlər.py üçün aşağıdakı xətləri əlavə edin.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Nəhayət, saytınız internetə hazır olduqda və onu yerləşdirdiyiniz zaman, ərazinizi təmsil etmək üçün satın aldığınız domen adı olaraq domeninizi təyin etmək istəyəcəksiniz. Bu saytınıza daxil olmaq üçün Navbar-da yazacağınız addır. Hələlik, domeni boş buraxa və ya bir yerdən istifadə edə bilərsiniz. Site_name saytınızı seçdiyiniz saytınıza vermək istədiyiniz bir ada dəyişdirmək istəyəcəksiniz.

E-poçt göndərməzdən əvvəl, bir token generatoru yaradaq ki, heç vaxt bitməyən bir hesab aktivləşdirmə tokeninə sahibik. Bunu aşağıdakı kimi görünən bir hesab aktivləşdirmə əlaməti quraraq idxal etməklə edə bilərik. Faylı düzəldin:

nano users/tokens.py

Aşağıdakı kodu əlavə edin:

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

Bu əsas token generatoru istifadəçiyə bir URL-də göndərə biləcəyimiz bir token yaradır və istifadəçi e-poçtlarını yoxlamaq və hesablarını aktivləşdirmək üçün istifadə edə bilər.

Sonra, bir e-poçt göndərməyinizi görək. Nano istifadə edərək istifadəçilər / e-poçt.py.

nano users/email.py

Doğrulama HTML e-poçtunu göndərmək belə görünəcəkdir:

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)

Bu olduqca sadədir. E-poçtu göndərməyimiz lazım olan funksiyaları idxal edirik, elektron poçtu şablon və parametrlərimizlə göstərin və sonra şablon adı ilə e-poçtu müəyyənləşdiririk və istifadəçiyə bir funksiya istifadə edərək göndəririk. Məktubu göndərmək üçün funksiyanı müəyyənləşdirməməyimizi görəcəksiniz, beləliklə, hələ istifadəçilərə / e-poçt.py-də əlavə etdiyimiz kodun altından yazaq

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

Bu bir az daha mürəkkəbdir və bu kodun hamısını hələ də işləməyə hazır deyilik. Diqqət yetirin, istifadəçinin e-poçtlarımızdan imtina etmək üçün istifadə edə biləcəyi bir link. Bu vacibdir, çünki istifadəçilər istənilən vaxt görmək istəməsələr, e-poçtlarımızdan imtina edə biləcəklər. HTML etiketlərinin soyulduğu HTML mesajı olan mesajımıza bir mətn alternativi əlavə edirik. Nəhayət, e-poçtun göndərildiyini yoxlayırıq və etməsəydi, e-poçtlarının etibarlı olmadığının istifadəçisinin profilində qeyd edirik.

Bütün işləri edə biləcəyimiz üçün istifadəçi modellərinə qayıdaq. Abunə olmaq üçün bir link yaratmaq üçün bir funksiyanı müəyyənləşdirməliyik və istifadəçinin e-poçtunun etibarlı olmadığını qeyd etmək üçün bir boolean sahəsini təyin etməliyik.

Əvvəlcə istifadəçilərin / modellərin başına aşağıdakı idxalı əlavə edin.

nano users/models.py
# ...

Sonrakı, işarəni etmək və e-poçtu aktivləşdirmək üçün istifadə olunan işarəni, eləcə də istifadəçini müvəffəqiyyətlə poçtlarını alıb-verməməsini saxlamaq üçün istifadə olunan işarəni yoxlamaq üçün istifadəçi modelinə funksiyaları əlavə edək. İstifadəçilər / modellər.py-də yenidən modelin sonuna aşağıdakı kodu əlavə edin (girilmiş kod)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 30 gündür etibarlıdır

Bu olduqca sadədir, müəyyən bir müddətdən sonra başa çatacaq bir əlamət yaratmaq üçün əsas kriptoqrafiya vasitəsi olan bir timestampsigner istifadə edirik və bunun etibarlı olub olmadığını yoxlamaq üçün başqa bir funksiyadan istifadə edirik. Bu ayələrdən iki dəfə, bir dəfə e-poçtu yoxlamaq və bir dəfə link üçün bir dəfə istifadə edirik.

İndi bunların olduğunu, görməli olduğumuz işlərin sonuncusu var. İstifadəçilər / Baxışlar.py daxilində, e-poçt adresini yoxlamaq və abunə olmaq üçün fikir əlavə edək.

nano users/views.py

Əvvəlcə aşağıdakı idxal əlavə edin. Bir neçə əlavə atdım, buna görə daha sonra daha çox məhsul idxal etməyəcəyik.

from .email import send_verification_email # Doğrulama e-poçt göndərmə funksiyasını idxal etdiyinizə əmin olun

Artıq bu idxalımızdan bir neçə ola bilər, ancaq onları təkrarlamaq zərər vermir. Doğrulama e-poçt göndərmə funksiyasını, eləcə də istifadəçilərdən, digər idxal arasında istifadəçi ilə hesab_aktivation_token idxal etmək lazımdır.

İndi, faylın altındakı, aşağıdakı kodu əlavə edin:

        # Onları abunə olun
    # Əks halda giriş səhifəsinə yönləndirin
# SendWelcomeMail (sorğu, istifadəçi)

Bu çox koddur. Gəlin onu qıraq. İlk funksiyanı təmiz və sadə, istifadəçini poçt siyahısından çıxarır. İkinci funksiya onların e-poçtlarını aktivləşdirir və şərh olunan bir funksiyanı, göndərməceleMail əlavə etdiyimi görəcəksiniz. Xoş bir e-poçt göndərmək üçün bir e-poçt şablonu və funksiya tərifindən istifadə etmək üçün xoş gəlmisiniz. Atladığım son funksiya vacibdir, çünki aktivləşdirmə e-poçtları sona çatır. Buna görə də aktivləşdirmə e-poçtunu bir müddət geri qaytarmalıyıq. Bunun üçün əsas bir forma istifadə edə bilərik və yoxlama e-poçtunu göndərmək üçün funksiyanı çağıra bilərik. Bunu etməzdən əvvəl, qeydiyyat görünüşünə bir funksiya çağırışı əlavə edərək, ilk növbədə göndərildiyinə əmin olaq. İstifadəçilər / baxışlarda, Def Qeydində, Def Qeydində, Def qeydində bu xətti əlavə edin.

nano users/views.py
# ... (sonra) def qeydiyyatı (sorğu):
# ... (əvvəl) yönləndirmə (

Bu kod parçasını birinci və son sətirləri əlavə etmək lazım deyil, reyestr görünüşünün yoxlama e-poçtunu istifadəçiyə göndərdiyinə əmin olun. Bu belə görünməlidir:

# ... İdxal
            send_verification_email(user) # Bu xətti əlavə etdiyinizə əmin olun!

İndi aktivləşdirmə e-poçtunu yenidən göndərmək üçün bir forma əlavə etməliyik. İstifadəçilər / Forms.py-də aşağıdakı formanı əlavə edin:

# ... (idxal)

Bu, e-poçt aktivləşdirmə formasına uyğun bir şablona da ehtiyacımız olacaq. Bu şablonu əlavə edək. Faylını redaktə edin:

nano users/templates/users/resend_activation.html

Sonra, faylı aşağıdakı kodu əlavə edin.

Whew, bu çox şeydir! İndi, kodu serverimizə yerləşdirdiyimiz zaman, HTML e-poçtunu göndərə və istifadəçi hesablarını e-poçtdakı bir kliklə aktivləşdirə biləcəyik. Sadə bir xoş bir e-poçt göndərmək istəyə bilərik, buna görə bunu necə edəcəyimizi görək. Geri istifadəçilər / e-poçt.py, aşağıdakı kodu əlavə edin:

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)

Ayrıca, bu məlumatların hamısını göstərmək üçün şablona ehtiyacımız olacaq. Veb saytımda şablon aşağıdakı kimi görünür, ancaq bəyəndiyiniz kimi format-formatlamağa xoş gəlmisiniz.

Qeyd edək ki, bağlama orqanı və ya HTML etiketləri yoxdur, çünki HTML abunə linkini əlavə etdikdə bunları əlavə edirik. Bunlar vacibdir, amma onları iki dəfə müəyyənləşdirmək istəmirik.

Bəs növbəti nədir? Uzun bir yol qət etdik. Həqiqətən, saytı bir serverə yerləşdirməyə hazır olmalıyıq. @Login_Requared Decoratoru əlavə edə və fikirlərimizi etibarlı şəkildə əlavə edə, istifadəçi qeydiyyatdan keçirə, uyğun e-poçt və cache məlumatlarını göndərə bilərik, bu da veb saytın aktual olmaq üçün nə etməsi üçün nə etməli olduğunu əsaslandırıcı göndərin. Daha bir neçə faydalı xüsusiyyət əlavə edəcəyik və sonra kodumuzu uzaq bir serverə yerləşdirmək, poçt serveri, domen konfiqurasiyasını və filtrləri qurmaq üçün süzgəclərimizi etibarlı və uyğunlaşdırmaq üçün bir əsas quracağıq.

Şifrə sıfırlama görünüşünə də ehtiyac duyacağıq, buna görə də bunu həqiqətən tez bir şəkildə əlavə edək. Djangonun parol sıfırlanması görünüşü bəzi funksiyalarda pozulmuşdur, ancaq öz görünüşümüzü, e-poçt şablon, formaları və URL nümunələrini necə yazacağınıza baxacağıq. Budur, görünüşü, istifadəçilər / baxışsızdır.

# ... İdxal

Bu forma Django-ya quraşdırılmışdır, ancaq parol sıfırlamasını, istifadəçilər / şablonları / istifadəçiləri / istifadəçiləri təsdiqləmək üçün bir şablona ehtiyacımız olacaq

Sadə bir forma ilə, istifadəçilər / şablonlarda / istifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / Sıra / İstifadəçiləri ilə Şifrə sıfırlama e-poçtu göndərmək üçün bir şablonuz var

E-poçtun özü üçün şablon sadədir, şifrəni sıfırlamaq üçün bir link, istifadəçilər / şablonlar / istifadəçilər / istifadəçilər / parol_reset_email_email.html. Django avtomatik olaraq bu faylı şərh edəcəkdir.

Daha iki şablona da ehtiyacımız olacaq. Birincisi, e-poçtun göndərildiyini təsdiqləməkdir. Bunlar üçün baxışlar artıq Django-dadır, buna görə də onları URLS.PY-də həll etməliyik. Bu şablon istifadəçilər / şablonlar / istifadəçilər / parol_reset_done.html-də yerləşir

Və nəhayət, parol sıfırlamasının tamamlandığını təsdiqləmək üçün istifadəçilər / şablonlar / istifadəçilər / parol_reset_complete.html

İndi bu görüşlər üçün URL nümunələrinə ehtiyacımız var. İstifadəçilər / Urls.py-də aşağıdakı URL nümunələrini əlavə edin:

    # ... əvvəlki urls burada

Dörd şablon, bu çox şeydir! Ancaq indi istifadəçinin şifrəsini istədiyimiz vaxt, hamısını veb brauzerdən sıfırlaya biləcəyimizə əmin ola bilərik.

Bu çox kod olduğunu başa düşürəm. Başınızın üstündə bir az görünsə, yaxşıdır. Siz yaxşılaşacaqsınız, anlayışınız yaxşılaşacaq və kodla daha çox bacarıqlı olacaqsınız. Tamamilə itirmisinizsə, onlayn olaraq bu proqrama qayıdandan sonra bu proqrama qayıtmağı məsləhət görürəm. Bunlar ümumiyyətlə işə başlamaq üçün pulsuzdur və bu layihəyə qayıdanda uğurlu olmağınız lazım olan hər şeydən sizə yol göstərəcəkdir. Əgər davam etməyə hazır olduğunuzu hiss edirsinizsə, yanında oxuyun, sonrakı, kodunuzu uzaq bir serverə yerləşdirməyi və bir neçə sadə əmr ilə yeni bir layihə qura biləcəyiniz üçün bir poçt serverinə, həm də bir poçt serverinə yerləşdirilməsini təmin edəcəyik.

Uzaq bir serverə yerləşdirmədən əvvəl etməyimiz lazım olan son şey saytımızı bir az daha etibarlı edir. Giriş görünüşünün yalnız bir istifadəçi adı və şifrə aldığını görəcəksiniz və çox amil identifikasiyası və ya birdəfəlik kod yoxdur. Bu asan bir düzəlişdir və eyni kodla saytımızı mətn mesajları göndərə bilərik və hətta serverə göndərilən mətn mesajlarına cavab verə bilərik. Başlamaq üçün istifadəçi modellərinə qayıdacağıq və hər bir girişi təmsil edəcək bir vaxt işarəsi işarəsi əlavə edəcəyik. Girişimizə əlavə təhlükəsizlik əlavə etmək üçün istifadə ediləcək istifadəçi modelinə bənzərsiz, fırlanan identifikator əlavə edəcəyik. İstifadəçi modellərini, istifadəçiləri / modellərini düzəltmək, aşağıdakı kodu əlavə edin:

# UUID, Timestamp imza və URL generatorunu idxal etdiyinizə əmin olun (tərs)
    # Bu kodu burada əlavə edin
    # Və bu funksiyanı əlavə edin
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 3 dəqiqə etibarlıdır

İstifadəçilər / modelləriniz, şərhlərdən başqa, bu kimi göründüyünüzdən əmin olun. Bunu aşağı salmaq, sadədir. Təhlükəsiz bir kod yarada biləcək bir kriptovalyutası olan bir neçə idxal, bir timestampsignerimiz var və etibarlı olduğundan əmin olmaq üçün yoxlaya biləcək bir timestampsignerimiz var, yalnız bir dəfə və ya bir neçə saniyəlik yaşlı deyil, yaşlı deyil. Həm də istifadəçimizi işarənin imzalanmasında və işarənin istifadəçiyə göndərildiyi URL-də müəyyən edən unikal identifikator olan bir UUID istifadə edirik. İki amil identifikasiyası görünüşü yaratmaq üçün bu əsas kriptoqrafiyadan istifadə edəcəyik. Başqa bir şey etməzdən əvvəl, istifadəçi modellərimizin yenilənməsi üçün miqrasiyaları işlətək. İdarəetmə.ple olan qovluqda miqrasiyaları etmək və tamamlamaq üçün aşağıdakı əmrləri işləyin.

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

Bu vacibdir, çünki hər dəfə modellərdə dəyişiklik etdikdə, modellərdən istifadə etməzdən əvvəl cədvəllər yaratmalı və defoltlarla verilənlər bazasını yeniləməliyik.

Sonra, ikinci dərəcəli identifikasiya görünüşünə yönləndirmək üçün giriş görünüşümüzü inkişaf etdirək. İstifadəçilər / Baxışlar.py-də, giriş funksiyasını çıxarın və yalnız istifadəçi modellərində yaratdığımız URL-ə yönləndirin.

# ... İdxal
        if user and user.profile.can_login < timezone.now(): # Qeyd edək ki, istifadəçinin daxil ola biləcəyi olub olmadığını yoxlayırıq
            # Burada olan Auth_login funksiyasını çıxarın
                return redirect(user.profile.create_auth_url()) # Qeyd edək ki, burada yeni bir URL-ə yönləndiririk
            else: # İstifadəçi çox faktorlu identifikasiyadan istifadə etmirsə, onları daxil edin.
        else: # Giriş uğurlu olsaydı,
            user = User.objects.filter(username=username).first() # Bu istifadəçilərin profilini yenilədiyimiz bir hissədir
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Beləliklə, bir neçə saniyə yenidən daxil ola bilmirlər

Beləliklə, bu olduqca sadədir, indi yaratdığımız zaman iki amil identifikasiyasına yönləndirmə yolunuz var. İstifadəçi telefon nömrəsi əlavə etmədiyi təqdirdə bir daim bir dönüşümüz var. Tezliklə bir telefon nömrəsi əlavə etmək və tezliklə mətn mesajı ilə daxil olmaq üçün əsas bir görünüş əlavə edəcəyik.

Birincisi, kodumuzdan mətn mesajı göndərmək üçün asan bir yola ehtiyacımız var. Bunu etmək üçün bir sıra API-dən birini seçə bilərik, amma mənim fikrimcə ən asan biri Twilio. Kiçik layihələr, habelə toplu endirimlər üçün də yaxşı qiymət təklif edirlər. Twilio.com-da bir hesab yaradın, layihəniz haqqında bəzi təfərrüatları doldurun, telefon nömrəsini satın alın və API düymələrinizi parametrlərinizə kopyalayın. Sonra bu kodu yeni bir fayl, istifadəçilər / sms.py altında əlavə edin.

nano users/sms.py
# Bütün lazımi paketləri idxal edin
# Bu kod mətni Twilio ilə göndərir
# Çox sayda rəqəmlə bir nömrə almaq üçün bir köməkçi funksiyası
# İstifadəçini yoxlamaq üçün mətni göndərin
# Bu funksiya ilə istifadəçi istənilən mətn göndərin
# Kodu bu funksiya ilə təsdiqləyin
# Vaxtı təsdiqləyin

Parametrlərinizi lazımi qaydada dəyişdirdiyinizə əmin olun, bu xətləri açarlarınızla əlavə edin:

# Bunları Twilio tablosunuzdan kopyaladığınızdan əmin olun
AUTH_VALID_MINUTES = 3 # TFA səhifəsinin bir neçə dəqiqə ərzində aktivdir

Birincisi, iki amil identifikasiya baxışı üçün formalara ehtiyacımız olacaq. İstifadəçilər / Formalar.py redaktə etmək, aşağıdakı kodu əlavə edin.

# ... İdxal
# Telefon nömrəmizə daxil olmaq üçün bir forma
# İdentifikasiya üçün bir forma

Sonrakı, istifadəçilərdə / baxışsız görüntülər yaradaq

# ... İdxal

Bu baxışların hər ikisi üçün şablonlara da ehtiyacımız olacaq. Əvvəlcə MFA şablonunu əlavə edək.

nano users/templates/users/mfa.html

Bu html kodu şablona əlavə edin

Bu olduqca izahlıdır. Forma ya kodu, ya da boş kodu göndərir və boş kodu alsaq kodu göndərdiyimiz görünüşü görəcəyik. Sonra yalnız iki təqdimetmə düyməsinə sahibik və bu yolla kodu ya düymə ilə göndərə bilərik. Sonra, telefon nömrəsi əlavə etmək üçün sadə bir forma əlavə edəcəyik.

nano users/templates/users/mfa_onboarding.html

Aşağıdakı HTML əlavə edin:

Bu forma çox sadədir, yalnız yaratdığımız telefon nömrəsi formasını təqdim edir və istifadəçiyə telefon nömrəsini əlavə etməyə imkan verir.

Bu, həqiqətən yaxşı görünür! Hər şey düzgün qurulduğuna qədər, mesaj göndərə və URL nümunələrini əlavə etdikdən sonra istifadəçini telefon nömrələri ilə daxil etməliyik. Quraşdırma üçün lazım olan son şey, istifadəçiyə daxil olmadan istifadəçinin telefon nömrələrini dəyişdirə biləcəyinə əmin ola biləcəyimizə görə, nəticədə "STOP" seçimini əlavə etmək istəyəcəyik, buna görə də istifadəçi gələcək mətn mesajlarından imtina etmək üçün "STOP" yaza bilər.

Gəlin istifadəçilərə profil görüntüləri əlavə edək. Bu görünüş istifadəçinin bio, e-poçtu, istifadəçi adını və telefon nömrəsini, həmçinin çox amil identifikasiyasını təmin etməyə imkan verəcəkdir. Birincisi, istifadəçilər / formalarda daha iki formaya ehtiyacımız olacaq

# ... İdxal

Sonra, bu formaların hər ikisini istifadə etmək üçün bir fikir yarada bilərik. İstifadəçiləri / Views.py redaktə edin və görünüşü əlavə edin.

# Bu idxalı əlavə edin

Bu görünüş üçün də şablona ehtiyacımız olacaq.

nano users/templates/users/profile.html

Bu kifayət qədər sadə bir forma olduğunu görəcəksiniz, ancaq yenilənən şəklin məzmununu avtomatik olaraq göndərən bəzi javascript var. Bu, hər dəfə təqdim etmədən düzəlişlər edə bilməyiniz üçün bu faydalıdır.

Sonrakı, istifadəçilərin URL pitterlərində bütün bu fikirləri təmsil edən URL-lərə ehtiyacımız var. İstifadəçilər / Urls.py redaktə edin və bu kodu əlavə edin:

# ... əvvəlki kod, idxal
# ... əvvəllər daxil etdiyimiz URL nümunələri, növbəti üç xətti əlavə edin

İndi layihəmizi sınamaq üçün yaxşı vaxtdır. Ancaq əvvəlcə başqa bir ehtiyat nüsxəsini işə salaq.

backup

Və serveri işə salın. Bir Linux serverinə yerləşdirmədən əvvəl, hesabdakı iki amil identifikasiyasını təmin etmək üçün yaxşı bir fikirdir. Bunu profilimiz URL, / istifadəçilərimiz / profilimizə və telefon nömrəmizə daxil olduqdan sonra və sonra formanı təqdim etdikdən sonra identifikasiyasını təmin etmək üçün qutuya yoxlanacağıq.

python manage.py runserver localhost:8000

Veb brauzerinizə gedərək veb səhifəni ziyarət edin, bu nümunədəki Google Chrome istifadə edirəm və URL-ləri daxil edirəm: // LocalHost: 8000 / Hesab / Profil /

Lazım gələrsə daxil ola və iki amil identifikasiyasını aktivləşdirə biləcəksiniz.

Bu layihənin həqiqətən poçt göndərə biləcəyi üçün işə başlamaq üçün bir server lazımdır. Ancaq əvvəlcə səhvləri görmək üçün bir yola ehtiyacımız var. Serveri Debug rejimində idarə etsəniz, Parametrlər.Debug ilə serveri olan server avtomatik olaraq səhvləri göstərir. Bir istehsal serveridə təhlükəli olan Debug rejimindən istifadə etmədən səhvləri göstərmək üçün, bunun üçün bir görünüş əlavə etməliyik. Dəstəyə biləcəyimiz ən vacib səhvlər:

Səhv 500 - Kodumuzdakı bir problem Səhv 404 - tapılmayan bir səhifə (qırıq url) Səhv 403 - bir icazə rədd edilmiş səhv

Səhvlər adlanan bu səhvləri idarə etmək üçün yeni bir tətbiq əlavə edək.

python manage.py startapp errors

Bunu əvvəllər etdiyimiz kimi parametrlərə əlavə edin.

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

Səhv mənzərələri, şablonları və bir az orta proqramdan başqa ehtiyacımız var. Bunları belə təyin edək:

# Baxışlarınızı burada yaradın.

Sonra, bu səhvləri idarə etmək üçün orta proqramı təyin edək. Bunu əvvəlcə orta proqramın adı ilə Parametrlər.py-dəki MiddleWare_Classes-ə əlavə edərək edəcəyik.

    # ... əvvəlki orta proqram

Sonra, orta proqram əlavə edək.

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

Məcəllənimizdə hər hansı bir səhvi izləməyə kömək edən bir iplikli bir yerli istifadə edərək cari istisnanı əldə etmək üçün bir funksiya əlavə edirik. Şablonlar baxımından yalnız birinə ehtiyacımız var, çünki mənzərədəki başlığı dinamik şəkildə müəyyənləşdiririk. Şablon, sadəcə başlığı və "izi", kontekstdən səhv izləməyimizə ehtiyac duyur.

nano errors/templates/errors/error.html

Bu hələ ən sadə şablonumuzdur, ancaq layihəmizdəki səhvləri görmək nə qədər asandır. Sonra, parametrlərdə debugu deaktiv edək.

nano app/settings.py

Bu xətti doğru yönəldildiyi yerə tapın və yalançıya dəyişdirin

DEBUG = False

İndi tətbiq edin və indi tətbiq edin. Uzaqdan Linux serverinə yerləşdirməyə hazırıq və oradan xüsusiyyətlər əlavə etməyə hazırıq.

sudo backup

Bu kodu bir serverə göndərməzdən əvvəl, kodla bağlı bəzi problemlər ola biləcəyini düşünməliyik. Davadan asılı olaraq, onlara göndərilən məlumatları qəbul edən saytlar spam göndərilən və spamın çıxarılması ilə bağlı problemlər olacaqdır. Bu, dərhal baş verməməlidir, amma sonradan saytdakı spamı avtomatik olaraq mülayim bir şəkildə mülayim və robotların saytına necə daxil olmasını, barmaq izi və ya üz tanınması kimi bir istifadəçinin şəxsiyyətini və ya biometrik tarama ilə bir istifadəçinin şəxsiyyətini yoxlayacağını yoxlayacağıq.

Təqdim etdiyimiz çox amil identifikasiya nümunəsinə baxaraq, istehsalda, əşyalar fərqli ola bilər. Girişləri məhdudlaşdıran və tokensləri necə qiymətləndirdiyimizə diqqət yetirin. Robotlar bir sayta daxil olarsa, iki amil identifikasiyası daha çətin ola bilər, çünki istifadəçi eyni vaxtda kodları daxil edə bilər. Bu mübarizə aparmaq üçün, telefon nömrəsi ilə çox amil identifikasiyasından istifadə edərək, saytla necə qarşılıqlı əlaqə qurduğumuzu elan edərək, istifadəçi modellərində bir modeldən istifadə edək. E-poçtla eyniləşdirmək üçün bir seçim də əlavə edəcəyik. Nano ilə istifadəçi modellərini redaktə etməklə başlayın.

nano users/models.py

Əlavə etdiyimiz modelin görünməsi budur. Hər hansı bir üsula, bir nömrəni, istifadəçi, vaxt işarəsi, bitmə müddəti və hər hansı bir çox amil identifikasiyasına qarşı cəhdləri (bir telefon və ya e-poçta göndərilən bir kod) saxlamaq üçün dəyişənlərə ehtiyac yoxdur.

# Veb saytına daxil olmaq üçün istifadə olunan əsas token

Gəlin də istifadəçimizə bir imtiyaz əlavə edək və sonda imtiyazlı istifadəçiləri avtomatik olaraq qeyd etmək üçün köç etməzdən əvvəl indi bunu əl ilə təyin edəcəyik. İstifadəçi modellərində bu xətti profildə əlavə edin:

    vendor = models.BooleanField(default=False)

Verilənlər bazasında hər hansı bir dəyişiklikdə olduğu kimi, Django-da bir model.py faylını redaktə etdiyimiz zaman köçürmə və verilənlər bazasını köçürməliyik. Unutmayın ki, bunu etmək üçün əvvəlcə mənbədən istifadə edirik (terminal açıq olduğundan artıq istifadə edilməmişdirsə) və sonra Python.py-ni köçürmək və köç etmək.

cd project-directory-you-named # (lazım olduqda)

Hələlik, qabığından istifadə edərək satıcı kimi yaratdığınız hər hansı bir hesabı cəlb edə bilərsiniz.

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

İndi bu möcüzədən istifadə etmək üçün çox amil identifikasiyasını inkişaf etdirək. Birincisi, MFA köməkçi kommunallarımızı dəyişdirməliyik. Nano istifadə edərək,

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
# E-poçt və ya telefon nömrələrini istifadə edərək istifadəçini təsdiqləyin
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # URL-də (bir UUID) keçən dəyəri ilə işarəni süzgəcdən keçirin
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Bu seans yaradılmasa, yaradın
    user = User.objects.filter(id=token.user.id).first() # İstifadəçini əlamətdən alın
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Əgər onlar artıq təsdiqlənmişdirsə, onları daxil edin
    if not user: raise PermissionDenied() # Heç bir istifadəçi tapılmasa inkar edin
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Auth Token'i yoxlayın
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçi daxil olmadıqda istifadəçiyə daxil olun
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Çox amil identifikasiyasına sona çatır
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # İstifadəçini növbəti səhifəyə yönləndirin
    if not user.profile.mfa_enabled: # MFA-nın aktiv olub olmadığını yoxlayın
        if not check_verification_time(user, token): # Vaxtı yoxlayın
            user.profile.mfa_enabled = False # Telefon nömrəsini təmizləyin
            user.profile.enable_two_factor_authentication = True # XARAZİYA
            user.profile.phone_number = '+1' # Telefon nömrəsini deaktiv edin
            user.profile.save() # Profilinizi qeyd edin
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçini öz mfa effektiv olmadıqda daxil edin
    if request.method == 'POST' and not fraud_detect(request, True): # İstək bir poçt tələbidirsə
        form = TfaForm(request.POST) # Formanı dərhal edin
        code = str(form.data.get('code', None)) # Kodu almaq
        if code and code != '' and code != None: # Boş olmadığından əmin olun
            token_validated = user.profile.check_auth_token(usertoken) # Auth Token'i yoxlayın
            is_verified = check_verification_code(user, token, code) # Kodu yoxlayın
            if token_validated: # Hər şeysə
                if is_verified: # Qaydasındadır
                    user.profile.mfa_enabled = True # MFA-nı aktivləşdirin (onsuz da aktiv olmadıqda)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçiyə daxil olun
                    for key, value in request.GET.items(): # Növbəti parametr üçün bir sorğu qurun (varsa)
                        return HttpResponseRedirect(next) # Yönləndirmək
            elif not token_validated: # Token etibarsız olsaydı
            if p.mfa_attempts > 3: # Çox cəhdlər olsaydı
            if form.data.get('send_email', False): # E-poçtu (və ya mətn) göndərin
    # Formanı göstərin (sorğular üçün)

Bu kodda əlavə etdiyimiz zaman bir e-poçt göndərmək üçün funksiyanı idxal etməyinizə əmin olun. Faylın başında istifadəçi baxışları (digər idxallarla), əlavə edin

from .mfa import send_verification_email as send_mfa_verification_email

İndi bu funksiyanı bu funksiyanı işləyəcəkdən əvvəl yazmalıyıq. Göndərmə e-poçt funksiyamızı genişləndirməlidir və yoxlama kodu ilə istifadəçiyə bir e-poçt göndərməlidir.

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

Beləliklə, hamısı əla işləyir, indi bir telefon nömrəsindən və ya e-poçtdan asılı olan bir çox amil identifikasiya sistemimiz var. Ancaq bizim şərtlərimizlə əməkdaşlıq etməyən istifadəçiləri də gizlətmək üçün bir yola da ehtiyacımız var. Bunlar spam, robotlar və ya işimiz üçün yaxşı demək olmayan hər kəs ola bilər. Veb saytımdakı istifadəçiləri izləmək üçün bir mənzərəyə nəzər yetirin:

# idxal
from .tests import is_superuser_or_vendor # Bu testi yaratmalıyıq
    # İstifadəçilərin siyahısını alın
    return render(request, 'users/users.html', { # İstifadəçiləri şablonda geri qaytarın

Qeyd edək ki, bu kod bir imtahandan istifadə etdiyini, bu testi testlərdə elan etməyəcəyimiz və onu idxal etməliyik. İstifadəçilər / testləri düzəltmək, testi yaradaq.

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

Bu, istifadəçilər / istifadəçiləri ilə birlikdə, bu kimi bir şeyə bənzəyən istifadəçilərlə birlikdədir:

Qeyd edək ki, şablon başqa bir şablon, istifadəçi /İstifadəçi.html. Alttemplate olan və uzanan bir şablon istifadə edərkən, alt bir alt əlavə etmək üçün yaxşı bir fikirdir (şablonları ayırd etmək üçün faylın adı verilmədən əvvəl.

Qeyd edək ki, bu çox Jinja, bu dəyişənlərin hamısının müəyyən olmasına baxmayaraq. Ancaq kodumun göründüyü budur.

      <small># {{istifadəçi.id}} </ kiçik>

Ayrıca başqa bir alt dəsti, toggle_active.html-ə ehtiyacımız var. Bu şablon, bir istifadəçinin aktiv olub olmadığını dəyişməyə imkan verən bir forma olmalıdır.

İstifadəçi fəaliyyətini dəyişdirmək və müvafiq URL nümunələrini dəyişdirmək üçün bir fikir əlavə etməliyik. Bunda olduğumuz zaman, bu, ehtiyacımız olan bir istifadəçini silmək üçün bir görünüş əlavə edək.

# İdxal
    success_url = '/' # Uğur URL-də yönləndirmə
    def test_func(self): # İstifadəçi super istifadəçidirsə və silmək icazəsi varsa test edin

Lazım olduqda bu praktik olsa da, bir istifadəçini silmək çox vaxt lazım olmamalıdır, sadəcə onları işdən çıxarmaq lazımdırsa, saytı ziyarət edən istifadəçilərin görünməsini dəyişə bilərik.

Əlavə etdiyimiz URL nümunələri bu kimi görünür. Nano ilə istifadəçilər / urls.py redaktə edin və bu xətləri əlavə edin:

nano users/urls.py

Xətlər istifadəçi mənzərəsindəki yolların siyahısına, sona qədər "]" başlanğıcından sonra "[" [".

# ...
# ...

İndi, saytı yedekləməyinizə əmin olun ki, onu davam etdirəcəyimiz veb serverdə yükləyə bilərsiniz. Əmr satırından,

sudo backup

İndi saytımız dəstəklənir.

Beləliklə, indi daha faydalı xüsusiyyətimiz var. Bəs burada böyük şəkil haqqında nə demək olar? Bu kod hələ internetdən əlçatan deyil, hələ də poçt serverimiz yoxdur və bizə, həm də, həm də, həm də, güzəştli istifadəçilərin təsdiqlənməsi üçün təhlükəsiz protokollarla yanaşı, hərtərəfli doğrulama prosesi və hamar planları daxil etmək üçün tətbiqimizi genişləndirməliyik.

Bütün bunlara çatacağıq. İndi ən vacib şey, yalnız bir Ubuntu serverində bir neçə sətir ilə edə biləcəyimiz bu kodu onlayn əldə edəcəkdir. Evdə bir serveriniz və limanları açmağa imkan verən bir işçi abunə olmadıqca bunun üçün bir server icarəyə götürməlisiniz. Mən mənim mənzilimdə quraşdırılmış bir HP Z440-da veb saytımı şəxsən idarə edirəm, amma ümumiyyətlə virtual özəl bir server (VPS) icarəyə vermək üçün ümumiyyətlə çox ucuzdur.

Unutmayın ki, indi işlədiyimiz kod nisbətən nazikdir, məhsul qurmalı olduğumuzu istifadə etməyə hazır olduğumuzdan əvvəl saxlanılmalı və təkmilləşdirilməlidir. İnternetlə etdiyiniz işlərə diqqətli olmağınızdan əmin olun, bu saytın bir linux serverindəki vebə açıq şəkildə yerləşdirilmədiyinə əmin olun, veb saytınızla istenmeyen qarşılıqlı əlaqələri bloklamaq üçün bir planınız var. Bu, əvvəlcə bir problem olmayacaq, ancaq bu, maşın öyrənmə, süni intellekt və kompüter görmə də daxil olmaqla, buna qarşı mübarizə üçün müxtəlif həll yollarına baxacağıq. Bir problem halına gəldikdə, bir həll üçün bu mətndə daha da baxın.

Bir VPS icarəsi baxımından, gedə biləcəyiniz çox yer var. Google Cloud VPS serverləri, İonos, Kamatera, Amazon AWS və daha çox provayderlər ehtiyaclarımıza uyğun bulud server həlləri təklif edir.

Onların formalarını tıklamalı və başlamaq üçün bir plan seçməlisiniz. Hər hansı bir provayderlə əsas bir planla gedə bilərsiniz, ancaq provayderin e-poçt göndərmək üçün port poçt server limanlarını açmağa və əmin olun (bu portu 587 və liman olmalıdır), bəzi provayderlər bu limanları bloklayır. İndiyə qədər İonos və Kamatera ilə ən yaxşı təcrübəm var, ikisi də sınırsız e-poçt göndərməyə imkan verəcək və onların qiyməti olduqca ucuzdur.

Şəxsi kompüterinizdən, fərdi kompüterinizdən tam olaraq server ilə uzaqdan interfeysdə olan SSH və ya etibarlı bir qabıq adlı bir protokol üzərində yeni serverinizə qoşulacaqsınız. Server qurduğunuzda, hosting provayderi, ehtimal ki, bir ssh düyməsini əlavə etməyinizi xahiş edir və ya bir istifadəçi adı və şifrə verəcəklər. SSH açarı, kodu düzəltmək üçün əmr satırından serverə necə daxil olacağınızdır. SSH düyməsini yaratmaq üçün aşağıdakı ssh-keygen seçimlərindən istifadə edin.

ssh-keygen

Faylı saxla və ehtiyacınız varsa, ssh düymələrinizi döndərmək yaxşıdır. İndi SSH düyməsini görmək üçün aşağıdakı əmrdən istifadə edə bilərsiniz. Doğrulandırmaq üçün istifadə edə biləcəyiniz üçün onu uzaq serverinizə kopyalamaq istəyəcəksiniz.

cat ~/.ssh/id_rsa.pub

Bu əmr yazarkən bir ssh düyməsini görə bilmirsinizsə, "SSH-RSA AAA" ilə başlayan uzun bir rəqəm və məktublar "), RSA açarı (daha etibarlıdır), onlardan istifadə etməyi məsləhət görürəm.) 4096 bit RSA SSH açarı yaradacaqdır.

ssh-keygen -t rsa -b 4096

Ubuntu-nu işlədən bir VPS yaradın, ancaq bunu etməyi planlaşdırırsınız. Təchizatçılar veb saytındakı (Kamatera.com, ionos.com, ionos.com və ya oxşar) formalarını tıklayarak bir VPS yaratdıqdan sonra daxil olmaq istəyərsiniz. Bunu etmək üçün, SSH əmrindən IP ünvanınızdan istifadə edin (xx.xx.xxx.xx kimi görünən ünvan). Yarandığımız serverdə, məsələn, Ubuntu-nun standart istifadəçi adına həssas olmalısınız.

ssh ubuntu@XX.XX.XX.XX

Şifrə istənən bir şifrə istənə bilər, əgər bir şifrə istənirsinizsə, daxil edin. Defolt istifadəçi adını istifadə etməyəcəyik.

Serverin SSH-dən necə istifadə edəcəyini söyləyən yeni bir sshd_config faylı əlavə edərək başlayaq.

nano sshd_config
# Bu SSHD Server sisteminin geniş konfiqurasiya faylıdır.  Görmək
# Daha çox məlumat üçün sshd_config (5).
# Bu SSHD yolu ilə tərtib edildi
# Defolt sshd_config ilə göndərilən seçimlər üçün istifadə olunan strategiya
# OpenSSH, harada olanların dəyəri olan seçimləri təyin etməkdir
# Mümkündür, ancaq onları şərh edin.  Boşaltılmamış seçimlər ləğv edin
# Defolt dəyəri.
# Port 22
# Ünvansız
# DinyAddress 0.0.0.0
# DinyadAddress ::
# HOSTKEY / ETC / SSH / SSH_HOST_RSA_KEY_KEY
# HOSTKEY / ETC / SSH / SSH_HOST_ECDSA_KEY_KEY
# HOSTKEY / ETC / SSH / SSH_HOST_ED25519_KEY
# CIPHERS VƏ DƏYİŞMƏSİ
# Veylimit default heç biri
# Giriş
# Syslogfacility anh
# Loglevel məlumatı
# Doğrulama:
# Giriş nöqtəsi 2m
# Permitrotlogin qadağan-şifrə
# StrictModes Bəli
# Maxauttries 6
# Maxsessions 10
# Gözləyin .Səfə / səlahiyyətli_keys2 gələcəkdə standart olaraq nəzərə alınmalıdır.
# Yazılan Yoxdur
# AvtorediteKeySCommand Yoxdur
# AvtorediteKeyScommanduser Heç kim
# Bunun üçün işləməyiniz üçün / ssh / ssh / ssh_known_hosts daxilində ev sahibi düymələri də lazımdır
# HostbaseDauthentication yox
# Bəli, ~ / .shsh / tanınan_hosts etibar etməsəniz, bəli dəyişin
# Hostbasedantika
# Ignoreuserknownhosts yox
# İstifadəçinin ~ / .Rhosts və ~ / / .Shosts fayllarını oxumayın
# Cayerhosts bəli
# Tunnelli təmiz mətn şifrələrini deaktiv etmək üçün burda yox!
# İcazə-Passwords YOX
# Çağırış cavab şifrələrini aktivləşdirmək üçün Bəli dəyişin (problemlərdən çəkin)
# Bəzi Pam modulları və mövzuları)
# Kerberos variantları
# KerberoSauthentication yox
# KerberosorlocalPasswd Bəli
# KerberosticketCleanup Bəli
# Kerberosgetafstoken yox
# GSSAPI Seçimləri
# GSSapiAbleMicatication yox
# Gssapicleanupcredimients bəli
# GSSAPIcTRICTACCOCCOCCHECCHECH Bəli
# Gssapikeyexchange yox
# Pam identifikasiyasını, hesabın işlənməsini təmin etmək üçün bunu 'bəli' olaraq təyin edin,
# və seans emalı. Bu aktivdirsə, PAM identifikasiyası olacaq
# KBDinteractiveArtrentication ilə icazə veriləcək və
# Parisiqifikasiya.  Pam konfiqurasiyasından asılı olaraq,
# Pam identifikasiyası KBDinteractiveArtrentication vasitəsilə keçə bilər
# "Perforitlogin şifrəsiz" qəbulu.
# Sadəcə Pam hesabı və sessiya yoxlanılmasını istəsəniz
# Pam identifikasiyası, sonra bunu aktivləşdirin, ancaq şifahi sənədləri təyin edin
# və KBDinteraktiveTifikasiya 'Xeyr'.
# AllowAmporwarding Bəli
# Bəli icazə
# Gatewayports yox
# X11displayoftet 10
# X11uselocalhost bəli
# Permittty bəli
# Printlastlog bəli
# TCPEkeepalive Bəli
# Permituserenvironment yox
# Sıxılma gecikdi
# ClientaliveInterval 0
# ClientaliveCountmax 3
# Ustns yox
# Pidfile /run/sshd.pid
# MaxStartUps 10: 30: 100
# Permittunnel yox
# Chrootdirectory heç biri
# VersiyaDendum heç biri
# Defolt pankart yolu yoxdur
# Müştəriyə yerli mühit dəyişənlərini keçməsinə icazə verin
# Alt systemlərin standartını ləğv edin
# Bir istifadəçi əsasında parametrləri ləğv etmək nümunəsi
# Uyğun istifadəçi anoncvs
# X11orwarding yox
# Lottcporwarding yox
# İcazəli yox
# FORCECOMMAND CVS Server

Yadda saxla, faylı saxlamaq üçün Ctrl + X və Y. Sonra, başlatma adlı əsas skript yazaq (hamısı istifadəçimizin standart ev qovluğunda).

nano initialize

Bu xətləri faylı əlavə edin, dəyişdirinSSH düyməsini istifadə edərək pişik istifadə edərək tapdınız. (.ssh / id_rsa.pub)

# ! / bin / bash

Bu fayl vasitəsilə gəzmək üçün, xətt ilə xəttə başlayaq. Birinci sətir bu tərtibçiyə bu bir baş ssenarisi olduğunu söyləyir. Sonra, sshd_config-in düzgün qovluğa, ssh-lərinə yenidən başladığını, SSH-lərin yenidən başladığını, SSH düymələrini yenidən başladıq, istifadəçi "komandası" adını əlavə edərək, bu üçün bəyəndiyiniz bir ad ala bilərsiniz, adları və əlil parol ilə adduser əmrindən istifadə edə bilərsiniz). Ayrıca sudo qrupuna komanda əlavə edirik, SSH düyməsini yaradırıq, açarlarımızı da səlahiyyətli düymələrimizə və onların açarlarına əlavə edin və açarlarını çap edirik. Bu yeni istifadəçi sayta necə daxil olduğumuz olacaq.

Yeni bir terminalda davam edin və yenidən serveri açın.

ssh team@XX.XX.XX.XX

SSH açarınız olduğu kimi bu dəfə bir şifrə ehtiyacınız olmamalıdır. Saytın daha etibarlı olması üçün şifrə ilə giriş əlil oldu.

İndi bu server bu barədə heç bir məlumat olmadan tamamilə boşalır. Layihəmizi Gitdən klonlaşdırmaqla başlayaq ki, yükləyə və uzaq maşında işləyə bilərik. SSH üzərindən bağlı olan uzaq serverdə əvvəlcə SSH düyməsini çap edin:

cat ~/.ssh/id_rsa.pub

Sonrakı, bu düyməni Git depolarımızı qurmadan əvvəl etdiyimiz kimi git parametrlərinə yapışdırın. İndi layihəmizi birbaşa serverə klonlaya bilərik. Layihəni yerli olaraq dəstəklədiyinizə əmin olun ki, yükləmək üçün GIT serverindədir.

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

Mükəmməl. İndi bütün fayllar burada. Onları ls ilə görə bilərik

ls

İndi server qurmağa başlayaq. Əvvəlcə layihə üçün istifadə edəcəyimiz sadə, yaddaqalan bir ada layihə qovluğunuzu kopyalayın.

cp -r yourproject whatyoucalledit

"Whatyoucalledit" layihənizin yeni adıdır. Sonra, server qurmaq üçün əsas bir yardım proqramı qurmalıyıq. Bu yardım proqramını saxlayacağıq və gələcəkdə istifadə edəcəyik. Bu yardım proqramını qurmaq üçün bir skriptin necə redaktə etdiyimizi müəyyənləşdirmək üçün bir istifadəçi ikili yaradaq. Baş, redaktə / usr / bin / ascript istifadə

sudo nano /usr/bin/ascript

Sudo-nu orada istifadə etdiyinizə əmin olun ki, faylı düzəltmək üçün icazəniz var. Faylda bu xətləri əlavə edin:

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

Unutmayın ki, bu skript, skript adını, $ 1 olaraq bir arqument alır. Əvvəlcə faylın mövcud olub olmadığını yoxlayır, ya da onu yaradır, skriptin yarandığını elan etmək, icazələrini dəyişdirmək, yaratdığımız skriptlərin adlarını saxlamağa imkan verən adını əlavə edir və adını verir. Fayl artıq mövcuddursa, sadəcə icazələri dəyişdirin və redaktə edin. Faylı saxla və sonrakı icazələrini dəyişdirəcəyik. Bu skriptdən istifadə etdiyimiz müddətcə bir daha bunu etməliyik.

sudo chmod a+x /usr/bin/ascript

Mükəmməl. İndi Quraşdırma adlı bir skript yaradaq. Birincisi, səni üstələməmək, ancaq qurulmuş skriptimin göründüyünə nəzər salın. Bu skriptinizin layihənizdə olduğu üçün nə ilə gəzəcəyik, başlamaq üçün skriptimdə hər şeyə ehtiyacınız olmayacaq.

# ! / bin / bash
# sudo chmod a + x skriptlər / istifadəçilər
# ./scripts/usersetup
# ssh-keygen
# Layihə kataloqu
# Giriş əmrləri
# Nano konfiqurasiya
# Git konfiqurasiya
# Yeniləyin və quraşdırın
# Clamav antivirusunu aktivləşdirin
# Host adı təyin etmək
# Setup postgres
# Quraşdırma Database Backup
# Ittable'i deaktiv edin
# Bitdefender quraşdırın
# Setup Postfix
# Dirsəlik
# Quraşdırma virtualenv
# Asılılığı əldə edin və qurun
# Firewall qaydalarını təyin edin
# PYPI asılılıqlarını quraşdırın
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP quraşdırın OpenCV-Python == 4.5.5.64
# PIP quraşdırın OpenCV-töhfə-Python == 4.5.5.64
# Certbot quraşdırın
# Certbotu işə salın
# Poçt serverini yenidən yükləyin
# Sertifikatları kopyalayın
# sudo cp /etc/letcrypry/Live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Yamaq venv
# İstifadəçi parametrlərini təyin edin
# İcazələri təyin edin
# Sudo Chown -r Komandanı: İstifadəçilər / Var / Run /
# sudo shown kök: kök / run / sudo / ts -r
# sudo chmod 664 db.sqlite3
# sudo chowwwn www-data: istifadəçilər db.sqlite3
# Kopyalayın və icazələri təyin edin
# Quraşdırma verilənlər bazası
# Pam Konfiqurasiyanı vurun və səhv SSH Config çıxarın
# sudo sed -i '' $ d'/pam.d/sshd
# sudo sed -i '' $ d '/ s. / Profil
# Kopyalama skriptlərini kopyalayın və icazələri təyin edin
# Xidmətləri yenidən yükləyin və aktivləşdirin
# Apache modullarını aktivləşdirin
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Defolt saytını deaktiv edin
# Saytımızı aktivləşdirin
# Daemonu yenidən yükləyin və Apache, Postfix və OpendKim-i yenidən başladın
# İcazələri təyin edin
# Dəyişdirmə konfiqurasiyası
# TAY TAM TƏHSİLİ
# Quraşdırma git
# Domen konfiqurasiyası üçün IPv6 və OpendKim-ni göstərin
# Quraşdırma tamamlandı

Bu çox quraşdırma! Bir sözlə, bu kod nano və giti, nano və git, yükləmələri, postfixi (verilənlər bazası serverini) konfiqurasiya edir və quraşdırır, UFW-ni (tamamlanmamış bir firewall) konfiqurasiya edir, bir antivirusu hiss edir, qovluqlar, klonuz asılılıqlar qurur Sertifikatlar və sertifikatlar qurur, konfiqurasiya quraşdırır, başlayır və kəsir, dəyişdirir, icazələr ayırır, IP, IPv6 ünvanı və Opendkim düyməsini çap edir. Olduqca sadə, amma çox kod kimi görünür. Bağışlılığımız olmadığına görə, bu, kərəviz, kərəviz və ya Daphne istifadə etmirik, lakin başlamaq üçün onlardan bəzilərini quraşdıracağıq. Bu kodun bir domeninin bir neçə dəfə elan etdiyinə diqqət yetirin.

Ayrıca bir domen adı (kiçik illik ödəniş) almalıyıq. Bir domeni satın aldığına görə snyarpace tövsiyə edirəm, onların düzeni asan və istifadəsi asandır. Seçdiyiniz hər hansı bir domeni ala bilərsiniz, ancaq bu nümunədə domen femmebabe.com saytından istifadə edirəm. Bir domen aldıqdan sonra, Squarespace DNS konfiqurasiya panelinə baş vurun və IP ünvanı ilə serverə domeninizə işarə edən bir qeyd əlavə edin. Bu belə görünməlidir:

@ A xx.xx.xx.xx

Host kimi @ operatoru ilə bu domenin altındakı bütün alt domenlər və kök domeninin hamısı serverə yönləndirəcəkdir. Bəyan etmək üçün daha çox qeyd var, ancaq poçt göndərməyə hazır olduqdan sonra bunlara keçə bilərik. Unutmayın ki, serverdən uğurla poçt göndərməyinizdən əvvəl bir neçə gün çəkə bilər. DNS qeydlərimizi təbliğ etmək üçün vaxt lazım olacaq.

Hər halda, başlamaq lazım olan yeganə qeyd bir rekorddur. Beləliklə, indi aşağıdakı skriptinizi layihəmizə görə doldurub işlətək.

Yalnız əsas tərəqqi üçün lazım olanı yalnız quraşdırmaq üçün daha kiçik bir quraşdırma skriptindən başlayaq. Bu qədər bir çox asılılıq və ya postgresql istifadə etməyəcəyik, yalnız əsas HTTP serverinə başlayacağıq və iş görüldükdə təsdiqləməkdən narahat olacağıq. Unutmayın ki, HTTPS sertifikatı almaq və serveri etibarlı şəkildə idarə etmək üçün bir server icarəyə götürməklə birlikdə bir domen almalıyıq. İndi bu sənəddəki "Komandası" adlı istifadəçinizin adı, "Dir", layihənizin qovluğu ilə "Dir" və <> etiketlərdə e-poçt və domeninizi təmin etməklə əvəz edin.

Bundan əlavə, bu kodu işlətmədən əvvəl, parametrləri Firewall-a aparmalıyıq, hosting provayderinin dəstəkləyir, əgər varsa. Adətən bu, hosting provayderinizin 'şəbəkələrinə' və ya özünüzə hostinqiniz varsa, routerinizin 'port ekspediqi' bölməsindədir. Özünüzə hosting istifadə edirsinizsə, marşrutlaşdırıcı vasitəsi ilə statik bir IP-ni server maşınınızın ünvanı ilə qurmaq istəyəcəksiniz. Oxumaq / yazmaq üçün aşağıdakı limanları açmalısınız.

22 (SSH) 25 (poçt) 587 (poçt) 110 (poçt müştəri) 80 (http) 443 (HTTPS)

# ! / bin / bash
# Giriş əmrləri
# Nano konfiqurasiya
# Git konfiqurasiya
# Yeniləyin və quraşdırın
# Clamav antivirusunu aktivləşdirin
# Host adı təyin etmək
# Quraşdırma Database Backup
# Ittable'i deaktiv edin
# Quraşdırma virtualenv
# Certbot quraşdırın
# Certbotu işə salın
# İstifadəçi parametrlərini təyin edin
# İcazələri təyin edin
# Sudo Chown -r Komandanı: İstifadəçilər / Var / Run /
# sudo shown kök: kök / run / sudo / ts -r
# Xidmətləri yenidən yükləyin və aktivləşdirin
# Apache modullarını aktivləşdirin
# Daemonu yenidən yükləyin və Apache, Postfix və OpendKim-i yenidən başladın
# Domen konfiqurasiyası üçün IPv6 və OpendKim-ni göstərin

Bu kodu işlətmədən əvvəl satın aldığınız domenin serverə qoşulduğundan əmin olun. Bunu etmək üçün yerli maşınınızda bir terminal açın və bu əmri domeninizlə işləyin:

ping femmebabe.com # Pingdən sonra domeninizi buraya daxil edin

Hamısı yaxşı görünsə və server cavablar göndərirsə, skriptini işə salmağa və paketləri quraşdırmağa, həmçinin Apache serverimizi işə salmağa və sertifikatlaşdırmağa hazırıq.

Bu, postfixi konfiqurasiya etmək üçün lazım olan bütün quraşdırma deyil, daha sonra o quraşdırma baxacağıq. İndi bu quraşdırma kodunu işə salın və serverinizi quraşdırmaq və sertifikatlaşdırmaq üçün bir neçə dəqiqə çəkməlidir. Bir daha, satın aldığınız ada görə skript adını, e-poçt və domen adını əvəz etdiyinizə əmin olun.

İndi serverin təmin olunduğu, istənilən veb brauzerdə URL-ə gedə və serverin HTTPS işlədiyinə əmin olun. Əgər deyilsə, DNS qeydləri üçün bir az gözlədiyiniz üçün bir az gözləyin və sonra Certbot sertifikatını təkrar etmək üçün aşağıdakı əmri işə salın:

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

Hər şeyi düzgün konfiqurasiya etdiyiniz müddətcə, kodunuzun işlədiyini və canlı bir veb səhifəsini göstərmək üçün Apache-nin standart səhifəsinə daxil olmağı bacarmalısınız. Sonra, defolt debug rejimimizi istehsal etmək üçün dəyişdirmək üçün parametrləri düzəltək. Parametrlərdə, eləcə də daxili IP-lərdə domeni konfiqurasiya edəcəyik.

nano yourproject/settings.py

Parametrlərdə bu xətləri dəyişdirin / əlavə edin.

# Sayt konfiqurasiya

İndi Apache2-ni konfiqurasiya etməliyik. Bu xətt ilə yerləşdirəcəyimiz konfiqurasiya faylını redaktə edək:

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

Bu konfiqurasiya faylı içərisində domen adımız və istifadəçi və layihənin adı olmalıdır. Mən Domen Adı Femmebabe.com, istifadəçi adı komandası və Layihə adı Femmebabe istifadə edirəm.

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>

Serverinizi konfiqurasiya edərkən bu nümunə kodunda layihənin, qovluqların və domenin adını əvəz etdiyinizə əmin olun. İndi standart saytı deaktiv etməliyik. Bu bash istifadə etmək olar.

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

Sonra, standart saytı aktivləşdirə və Pash istifadə edərək Apache2-i yenidən yükləyə bilərik. Femmebabe'yi redaktə edərkən elan etdiyiniz fayl adı ilə əvəz etməyi unutmayın / Saytlar mövcuddur / mövcuddur.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Navbardakı domeninizə qayıdın. Veb brauzerinizdə konfiqurasiya etdiyiniz saytı görməlisiniz. Təbrik edirəm! Bunu görmürsənsə, bəzi dəyişikliklər etmək lazım ola bilər. Layihənizdəki parametrləri diqqətlə nəzərdən keçirin və heç bir səhviniz olmadığından əmin olun və səhvlər üçün layihəni yoxlamaq üçün aşağıdakı əmrləri işə salın.

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

Python layihənizdə səhvləriniz varsa, onları harada olduqlarını və düzəldin. Sadəcə "Populyasiya vermir" deyən bir səhviniz varsa, səhvinizi ehtiva etmək üçün, registry.

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

Bu iş vaxtı xətası qaldırıldığı 83-ə gedin (RuntimeErroru qaldırın ("Populyasiya () yenidən")))) və bu sətirdən əvvəl bir şərh əlavə edin, sonra eyni girinti, self.app_configs = {}. Bu belə görünür:

                # AppConfig.Ready () işləməməsi üçün təkrar zənglərin qarşısını al
                # metodlar iki dəfə.
# RuntimeErroru qaldırın ("Populyasiya () yenidən göndərilmir")

Daha sonra layihəni yenidən yoxlaya və səhvini ifşa edə bilərsiniz.

python manage.py check

Sonra səhvi görə və düzəldə bilərsiniz. Sabit olduqda və kod heç bir səhv olmadan tərtib edərkən, bu kimi göründüyü kimi faylın geri dəyişdirildiyinə əmin olun:

                # AppConfig.Ready () işləməməsi üçün təkrar zənglərin qarşısını al
                # metodlar iki dəfə.
# self.app_configs = {}

Serverin onlayn olduğu təqdirdə, ona daha da dəyişiklik etdikdə, serverin yenidən yükləmək üçün aşağıdakı əmrdən istifadə etməliyik:

sudo systemctl reload apache2

Doesome! Bəs poçt göndərmək haqqında nə demək olar? E-poçt göndərməyə başlamaq üçün əvvəlcə domen konfiqurasiyasını yeniləməliyik. Bu, Squarespace-də DNS panelinizdə olmalıdır və ya seçdiyiniz domen adı qeydiyyatı. Konfiqurasiyanı quraşdırmalı və əlavə etməli və bir neçə əmr işləməliyik.

Birincisi, serverin IPv6 ünvanını alaq. Bundan sonra DNS-lərinizi açıb qeydləri əlavə edəcəyik.

Serverin IPv6 ünvanını əldə etmək üçün bu əmrdən istifadə edin:

ip -6 addr

İndi DNS parametrlərinə aşağıdakı qeydləri əlavə edə bilərik. Qeydlərim bu kimi görünür. Bununla birlikdə, qeydləriniz üçün IP adresinizi IP ilə əvəz etməlisiniz (75.147.182.214 deyil, bu mənimdir). Ayrıca femmebabe.com saytının yerində domeninizi əlavə edin, eləcə də əvvəlki əmrlə (Mina, Fe80 :: 725a :: 725A istifadə edə bilməzsiniz: fe49: 3E02). İndi Domainkey-dən narahat olmayın, bu, postfix, poçt serveri, opendkim ilə, açarı çap etdikdə yaradılmışdır. Bu sonu konfiqurasiya edəcəyik.

@ Bir N / a 75.147.182.214

@ Mx Əqrəb femmebabe.com

@ Ptr N / a femmebabe.com

@ Txt N / a TXT @ v = SPF1 MX IP75.147.182.214IP6: FE80 :: 725A: FFF: FFF: FE49: 3E02 ~ Hamısı

Default._Bimi Txt N / a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg

_dmarc Txt N / a v = dmarc1; p = heç biri

sendonly._domainkey Txt N / a

İndi postfix üçün bəzi davamlı konfiqurasiya əlavə etməliyik. Etməyimiz lazım olan hər şey, istifadə etdiyiniz domen adı ilə domen adını, femmebabe.com-u əvəz etdiyimizə əmin olmaqdır. Bütün konfiqurasiya fayllarına bir-bir baxaq və onları yenidən quraşdırıldığınız üçün konfiqurasiya adlanan bir qovluğa quraşdıraq.

nano config/etc_postfix_main.cf

Bu mətni fayla əlavə edin

# Bir şərh üçün / daha çox istifadə üçün / postfix/main.cf.dist baxın
# Debian Xüsusi: Bir fayl adının müəyyənləşdirilməsi birinci yerə səbəb olacaq
# ad kimi istifadə ediləcək bu faylın xətti.  Debian defolt
# / və s. / poçt adı.
# myorigin = / s. / poçt adı
# əlavə .Domain MUA-nın işidir.
# "Gecikmiş poçt" xəbərdarlıqlarını yaratmaq üçün növbəti sətirdən kəsilmir
# talk_warning_time = 4h
# Http://www.postfix.org/compatity_readme.html - default 3 3.6-a baxın
# Təzə quraşdırır.
# TLS parametrləri
# Milail konfiqurasiya

Növbəti konfiqurasiya!

nano config/etc_postfix_master.cf

Bu xətləri əlavə edin:

# 
# Postfix Master Procure konfiqurasiya faylı.  Format haqqında ətraflı məlumat üçün
# Faylın, Master (5) Manual səhifəsinə baxın (əmr: "Man 5 Master" və ya
# On-line: http://www.postfix.org/master.5.html).
# 
# Bu faylı redaktə etdikdən sonra "postfix yenidən yükləmə" icra etməyi unutmayın.
# 
# ==========================================================================================================================================================================================================================================
# Xidmət tipi Şəxsi IPSSIP Chroot Wakeup MaxProc əmri + Args
# (bəli) (bəli) (yox) (heç vaxt) (100)
# ==========================================================================================================================================================================================================================================
# smtp inet n - y - 1 poster
# SMTPD Pass - - Y - - SMTPD
# DNSBLOG UNIX - - Y - 0 dnsblog
# TLSPROXY UNIX - - Y - 0 TLSPROXY
# Bir birini seçin: Yalnız və ya hər hansı bir müştəri üçün loopback müştəriləri üçün təqdim etməyin.
# 127.0.0.1:submission inet n - y - - smtpd
# -O syslog_name = postfix / təqdim
# -O smtpd_tls_security_level = şifrələyin
# -O smtpd_sasl_auth_enable = bəli
# -O smtpd_tls_auth_only = bəli
# -O smtpd_reject_unlisted_realIpient = yox
# -O smtpd_client_grutrictions = $ mua_client_grutricks
# -O smtpd_helo_grutrictions = $ mua_helo_grutricks
# -O SMTPD_Sender_Qeestallıq = $ mua_sender_Qeestallıq
# -O smtpd_reecientient_grutriction =
# -O smtpd_relay_hestallıq = icazə_sasl_aUrentifikasiya edilmiş, rədd et
# -O milter_macro_daemon_name = yaranan
# Biri seçin: Yalnız və ya hər hansı bir müştəri üçün SMTPS-i aktivləşdirin.
# 127.0.0.1:mtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -O syslog_name = postfix / smtps
# -O smtpd_tls_wrappermode = bəli
# -O smtpd_sasl_auth_enable = bəli
# -O smtpd_reject_unlisted_realIpient = yox
# -O smtpd_client_grutrictions = $ mua_client_grutricks
# -O smtpd_helo_grutrictions = $ mua_helo_grutricks
# -O SMTPD_Sender_Qeestallıq = $ mua_sender_Qeestallıq
# -O smtpd_reecientient_grutriction =
# -O smtpd_relay_hestallıq = icazə_sasl_aUrentifikasiya edilmiş, rədd et
# -O milter_macro_daemon_name = yaranan
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -O smtp_helo_timeut = 5 -o smtp_connect_timeut = 5
# 
# =======================================================================================================================================================================================================================================================================
# Postfix proqram təminatına interfeyslər. Təlimatı araşdırdığınızdan əmin olun
# İstədiyini tapmaq üçün qeyri-postfix proqram səhifələrinin səhifələri.
# 
# Aşağıdakı xidmətlərin bir çoxu postfix boru (8) çatdırılma istifadə edir
# Agent.  $ {Alıcının} haqqında məlumat üçün boru (8) man səhifəsinə baxın
# və digər mesaj zərf variantları.
# =======================================================================================================================================================================================================================================================================
# 
# Mailild. Ətraflı məlumat üçün postfix mailildrop_readme faylına baxın.
# Main.cf-də də göstərin: Mailildrop_Destination_ReciPient_limit = 1
# 
# 
# =======================================================================================================================================================================================================================================================================
# 
# Son Cyrus versiyaları mövcud "LMTP" magistr.cf girişindən istifadə edə bilər.
# 
# Cyrus.conf-də göstərin:
# lmtp cmd = "lmtpd -a" qulaq asmaq = "Localhost: lmtp" proto = tcp4
# 
# Əsas.cf-də aşağıdakılardan biri və ya daha çoxunu göstərin:
# poçtbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# =======================================================================================================================================================================================================================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Ayrıca Main.CF-də göstərin: Cyrus_Destination_ReciPient_limit = 1
# 
# Cyrus Unix - N N - - Boru
# bayraqlar = drx istifadəçi = Cyrus Argv = / Cyrus / Bin / çatdırılma
# 
# =======================================================================================================================================================================================================================================================================
# Cyrus vasitəsilə çatdırılmanın köhnə nümunəsi.
# 
# Old-Cyrus Unix - N N - - Boru
# Bayraqlar = R İstifadəçi = / Cyrus Argv = / Cyrus / Bin / çatdırılma -M-in -m $ {Genişləndirmə} $ {İstifadəçi}
# 
# =======================================================================================================================================================================================================================================================================
# 
# Konfiqurasiya təfərrüatları üçün postfix uucp_readme faylına baxın.
# 
# 
# Digər xarici çatdırılma üsulları.
# 

Və opendkim konfiqurasiya. Opendkim, onları daha etibarlı etmək üçün domen açarları olan e-poçt serverlərini müəyyənləşdirir. Onsuz, poçt imzalanmadı və onu bir qutuya çevirə bilməz.

nano config/etc_default_opendkim

Bu xətləri əlavə edin:

# Qeyd: Bu bir miras konfiqurasiya faylıdır. Opendkim tərəfindən istifadə edilmir
# Sistemd xidməti. Zəhmət olmasa, müvafiq konfiqurasiya parametrlərindən istifadə edin
# /etc/opendkim.conf əvəzinə.
# 
# Əvvəllər, burada standart parametrləri redaktə etmək və sonra icra etmək olar
# / klib/opendkim/opendkim.service.generate Sistemd-də faylları ləğv etmək üçün
# /etc/systemd/system/opendkim.service.d/override.conf və
# /etc/tmpfiles.d/opendkim.conf. Bu hələ mümkündürsə, indi budur
# Parametrləri birbaşa /etc/opendkim.conf-də tənzimləmək tövsiyə olunur.
# 
# Daemon_opts = ""
# Bir Unix Soket istifadə etmək üçün / Var / Spool / PostFix / Run / Opendkim
# Bir Chroot-da postfix:
# Rundir = / Var / Spool / Postfix / Run / Opendkim
# 
# Alternativ bir yuvanı təyin etmək üçün kasx
# Qeyd edək ki, bu tənzimləmə opendkim.conf-də hər hansı bir yuvası dəyərini ləğv edəcək
# Defolt:
# Port 54321-də bütün interfeysləri dinləyin:
# Socket = Inet: 54321
# Port 12345-də loopback-də qulaq asın:
# Socket = Inet: 12345 @ localhost
# 12345 portunda 192.0.2.1-də qulaq asın:
# Socket = Inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Bu xətləri əlavə edin:

# Defolt_process_limit = 100
# default_client_limit = 1000
# VSZ (virtual yaddaş ölçüsü) Xidmət prosesləri üçün limiti. Bu əsasən
# Yeməyin yedikdən əvvəl sızan prosesləri tutmaq və öldürmək üçün nəzərdə tutulmuşdur
# hər şey.
# Defolt_vsz_limit = 256m
# Giriş istifadəçisi giriş prosesləri tərəfindən daxili olaraq istifadə olunur. Bu ən dözülməzdir
# Dovecot sistemində istifadəçi. Heç bir şeyə giriş imkanı olmamalıdır.
# default_login_user = dovdull
# Daxili istifadəçi, elan edilməmiş proseslər tərəfindən istifadə olunur. Ayrı olmalıdır
# Giriş istifadəçisi, buna görə giriş prosesləri digər prosesləri narahat edə bilməz.
# Defolt_internal_user = Dovecot
    # port = 143
    # port = 993
    # ssl = bəli
  # Yeni bir prosesə başlamazdan əvvəl idarə etmək üçün əlaqələrin sayı. Adətən
  # Yeganə faydalı dəyərlər 0 (sınırsız) və ya 1-dir. 1 daha etibarlıdır, amma 0
  # daha sürətli. <Doc / Wiki / Loginprocess.txt>
  # service_count = 1
  # Həmişə daha çox əlaqəni gözləməkdə davam edən proseslərin sayı.
  # proses_min_avail = 0
  # Service_count = 0 təyin etsəniz, ehtimal ki, bunu böyütməlisiniz.
  # vsz_limit = $ default_vsz_limit
    # port = 110
    # port = 995
    # ssl = bəli
    # port = 587
  # Yuxarıdakı Unix yuvasından istifadə edə bilmirsinizsə, inet dinləyicisi yaradın
  # inet_listener lmtp {
    # Bütün internet üçün LMTP görünən etməkdən çəkinin
    # Ünvan =
    # port =
  # }
  # Yaddaşın əksəriyyəti MMAP () Ing Fayllarına gedir. Bunu artırmaq lazım ola bilər
  # Böyük poçt qutularınız varsa məhdudiyyət.
  # vsz_limit = $ default_vsz_limit
  # Maks. IMAP proseslərinin sayı (əlaqələr)
  # proses_limit = 1024
  # Maks. POP3 proseslərinin sayı (əlaqələr)
  # proses_limit = 1024
  # Maks. SMTP təqdimetmə proseslərinin sayı (əlaqələr)
  # proses_limit = 1024
  # Auth_Socket_Path bu userdb soketinə default olaraq işarə edir. Adətəndir
  # Dovecot-LDA, Doveadm, bəlkə də imap prosesi və s. İstifadəçilər tərəfindən istifadə olunur
  # Bu soket üçün tam icazələr bütün istifadəçi adlarının siyahısını əldə edə bilir və
  # Hər kəsin userdb axtarışlarının nəticələrini əldə edin.
  # 
  # Defolt 0666 rejimi hər kəsə yuvaya qoşulmağa imkan verir, ancaq
  # USERDB axtarışları yalnız UserDB-nin "UID" yatağını qaytarsa, müvəffəq olacaqdır
  # Zəng edən prosesin UID-ə uyğun gəlir. Zəng edənin UID və ya GID uyğun gəlsə də
  # rozetkanın UID və ya GƏLƏCƏK GƏLƏCƏK. Başqa bir şey bir uğursuzluğa səbəb olur.
  # 
  # Bütün istifadəçiləri axtarmaq üçün zəng edənə tam icazələr vermək üçün rejimi təyin edin
  # 0666 və Dovecot-dan başqa bir şey, kernelin tətbiq olunmasına imkan verir
  # İcazələr (məsələn, 0777 hər kəsə tam icazə verilir).
  # Auth fəhlə prosesi, o, əldə edə bilməsi üçün standart olaraq kök kimi idarə olunur
  # / s. / Kölgə. Bu lazım deyilsə, istifadəçi dəyişdirilməlidir
  # $ standart_internal_user.
  # İstifadəçi = kök
  # Dict Proxy istifadə olunarsa, poçt prosesləri onun yuvasına giriş imkanı olmalıdır.
  # Məsələn: MODE = 0660, qrup = vmail və qlobal mail_access_groups = vmail
    # MODE = 0600
    # İstifadəçi =
    # Qrup =

Bir daha, seçdiyiniz domenlə, bu faylların hamısında domeni dəyişdirdiyinizə əmin olun. Növbəti faylı düzəldin, Dovecot-un konfiqurasiya,

nano config/etc_dovecot_dovecot

Və bu xətləri əlavə edin

## DoveCot konfiqurasiya faylı
# Tələsinsə, http://wiki2.dovecot.org/quickconfiguration baxın
# "Doveconf -n" əmri dəyişdirilmiş parametrlərin təmiz bir çıxışı verir. İstifadə etmək
# Dovecot poçt siyahısına göndərərkən faylları kopyalamaq və yapışdırmaq əvəzinə.
# '# 'Xarakter və hər şey şərh olaraq müalicə olunur. Əlavə boşluqlar
# və nişanlar nəzərə alınmır. Əgər bunların hər ikisini açıq şəkildə istifadə etmək istəyirsinizsə, qoyun
# value inside quotes, eg.: key = "# Xəmir və arxadan Whitspace "
# Ən çox (lakin hamısı deyil) parametrləri fərqli protokollar və / və ya / və ya tərəfindən ləğv edilə bilər
# Mənbə / təyinat IPS Parametrləri bölmələrdə yerləşdirərək, məsələn:
# Protokol IMAP {}, yerli 127.0.0.1 {}, uzaq 10.0.0.0/8 {}
# Defolt dəyərlər hər bir parametr üçün göstərilir, bu da kəsilməsi tələb olunmur
# bunlar. Bunlar buna baxmayaraq istisnalardır: heç bir hissə yoxdur (e.g. adları} {})
# Və ya plugin parametrləri standart olaraq əlavə olunur, onlar yalnız nümunə kimi sadalanmışdır.
# Yollar da yalnız konfiqurasiyaya əsaslanan həqiqi defoltlar olan nümunələrdir
# Seçimlər. Burada sadalanan yollar konfiqurasiya üçün --PRefix = / usr
# --Sysconfdir = / s. - / Var
# Quraşdırılmış protokolları aktivləşdirin
# Bağlantılar üçün harada dinləmək istədiyiniz IPS və ya ev sahiblərinin vergüllə ayrılmış siyahısı.
# "*" bütün IPv4 interfeyslərində, "::" bütün IPv6 interfeyslərində dinləyir.
# Defolt olmayan limanları və ya daha mürəkkəb bir şey təyin etmək istəyirsinizsə,
# Conf.d / master.conf redaktə edin.
# Dinlə = *, ::
# İcra məlumatlarını saxladığı baza qovluğu.
# Base_Dir = / VAR / RUN / DOVECOT /
# Bu instansiyanın adı. Çox instansiya quruluşunda Doveadm və digər əmrlərdə
# Hansı nümunənin istifadə olunduğunu (alternativ) seçmək üçün -i <instansion_name> istifadə edə bilərsiniz
# -c <config_path>). Nümunə adı Dovecot proseslərinə də əlavə olunur
# PS çıxışında.
# Instanse_name = Dovecot
# Müştərilər üçün təbrik mesajı.
# Giriş_greeting = Dovecot hazırdır.
# Etibarlı şəbəkə aralığının kosmik ayrılmış siyahısı. Bunlardan bağlantılar
# IP-lərin IP ünvanlarını və limanlarını ləğv etməyə icazə verilir (giriş üçün) və
# identifikasiya yoxlamaları üçün). deaktiv_praintext_auth da nəzərə alınmır
# Bu şəbəkələr. Adətən IMAP proxy serverlərinizi burada göstərərdiniz.
# LOGIN_TRUSTDED_NETWORKS =
# Giriş Giriş Yoxlama Soketlərinin Kosmik ayrılmış siyahısı (məsələn, TCPWRAP)
# login_access_socketet =
# Proxy_maybe = bəli ilə proxy təyinatı bu IP-lərdən hər hansı birinə uyğun gəlmirsə, etməyin
# ProXing. Bu normal olaraq lazım deyil, ancaq təyinat varsa, faydalı ola bilər
# İp e.g. bir yük balansının IP.
# auth_proxy_elf =
# Daha çox Verbose Proses Başlığı (PS-də) göstərin. Hal-hazırda istifadəçi adını göstərir və
# IP ünvanı. IMAP proseslərindən istifadə etdiyini görmək üçün faydalıdır
# (məsələn. Paylaşılan poçt qutuları və ya eyni UID çox hesab üçün istifadə olunursa).
# verbose_proctitle = yox
# Dovecot Master prosesinin sönəndə bütün proseslər öldürülməlidir.
# Bunu "Xeyr" üçün təyin etmək, Dovecotun olmadan yüksəldilməməsi deməkdir
# mövcud müştəri əlaqələrini bağlamaq üçün məcbur etmək (baxmayaraq da ola bilər)
# Yeniləmə e.g. bir təhlükəsizlik düzəltdiyinə görə).
# bağlama_clowients = bəli
# Sıfır deyilsə, Doveadm serverinə bu bir çox əlaqə vasitəsilə poçt əmrlərini işə salın,
# Onları birbaşa eyni müddətdə işlətmək əvəzinə.
# doveadm_worker_count = 0
# Unix Socket və ya Host: Doveadm serverinə qoşulmaq üçün istifadə olunan liman
# Doveadm_socket_path = Doveadm-Server
# Dovecotda qorunan ətraf mühit dəyişiklərinin kosmik ayrılmış siyahısı
# başlanğıc və bütün uşaq proseslərinə keçdi. Ayrıca verə bilərsiniz
# Açar = hər zaman müəyyən parametrləri təyin etmək üçün dəyər cütləri.
# İdxal_environment = tz
## 
## Lüğət server parametrləri
## 
# Lüğət düyməsini = dəyər siyahılarını saxlamaq üçün istifadə edilə bilər. Bu bir neçə tərəfindən istifadə olunur
# plaginlər. Lüğəti ya birbaşa, ya da a baxmayaraq əldə etmək olar
# Lüğət serveri. Aşağıdakı Dict Block Xəritələr URIS-ə olan adlar
# server istifadə edildikdə. Bunlar daha sonra URIS formatında istifadə edilə bilər
# "Proxy :: <ad>".
  # kvota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Həqiqi konfiqurasiyanın əksəriyyəti aşağıda daxil olur. Fayl adları var
# əvvəlcə ASCII dəyəri ilə sıralanır və bu qaydada təhlil olunur. 00 prefikslər
# Fayl adlarında sifarişin əmrini başa düşməyi asanlaşdırmaq üçün nəzərdə tutulmuşdur.
# Konfiqurasiya faylı da səhv etmədən daxil olmağa çalışıla bilər
# Tapılmadı:
# Dovecotun bütün giriş əlaqələrini dinləməsinə imkan verir (IPv4 / IPv6)

Dovecot istifadəçisi üçün bir parol əlavə edin:

nano config/etc_dovecot_passwd

Faylın ilk hissəsi, kolondan əvvəl, istifadəçi adıdır. Son hissə, "YourPassword", poçt serverinizə vermək istədiyiniz şifrəni bildirir.

team:{plain}yourpassword

Sonrakı, Opendkim Konfiqurasiya

nano config/etc_opendkim.conf

Və bu xətləri əlavə edin:

# Bu imzalamaq və yoxlamaq üçün əsas bir konfiqurasiya. Asanlıqla ola bilər
# əsas bir quruluşa uyğun uyğunlaşdırılmışdır. Opendkim.conf (5) və
# /usr/share/doc/opendkim/examplces/opendkim.conf.sifle üçün nümunə
# Mövcud konfiqurasiya parametrlərinin sənədləşdirilməsi.
# Giriş yox
# Ümumi imza və yoxlama parametrləri. Debianda, "dən" başlıqdır
# həddindən artıq çox, çünki bu, tez-tez nüfuz sistemləri tərəfindən istifadə olunan şəxsiyyət açarıdır
# və beləliklə bir qədər təhlükəsizlik həssasdır.
# Domain, selektor və açar imzalamaq (tələb olunur). Məsələn, imza atın
# Selector "2020" (2020._domainkey.example.com) olan domen "nümunə.com" üçün
# /etc/dkimkeys/eXample-də saxlanılan xüsusi açardan istifadə etmək. Daha dənəvər
# Quraşdırma seçimləri /usr/share/doc/opendkim/readme.opendkim-də tapa bilərsiniz.
# Domain nümunəsi
# Selector 2020
# Keyfile /etc/dkimkeys/Example.Private
# Debianda Opendkim istifadəçi "opendkim" kimi çalışır. Nə vaxt 007 007-nin bir 007
# Soketə imtiyazlı olaraq rozetka daxil olan mtas olan yerli bir yuvadan istifadə etmək
# istifadəçi (məsələn, postfix). Qrupa istifadəçi "postfix" əlavə etmək lazım ola bilər
# "Opendkim" bu vəziyyətdə.
# MTA bağlantısı üçün yuva (tələb olunur). MTA bir chroot həbsxanasındadırsa,
# Soketin əlçatan olması təmin edilməlidir. Debianda, postfix içəri girir
# Bir chroot / Var / makaron / postfix, buna görə bir Unix yuvası olmalı idi
# Aşağıdakı son sətirdə göstərildiyi kimi konfiqurasiya edilmişdir.
# Soket Yerli: /run/opendkim/opendkim.Sock
# Socket Inet: 8891 @ localhost
# Soket inet: 8891
# Doğrulamaqdan daha çox imza atacaq, standart 127.0.0.1-dir. Görmək
# Daha çox məlumat üçün Opendkim-in əməliyyat bölməsi (8).
# DaxiliHostlar 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Etibar lövbər DNSSEC imkan verir. Debianda, güvən lövbər faylı təmin edilir
# Paket DNS-kök-məlumatlar tərəfindən.
# Adververs 127.0.0.1
# Mesajları imzalamaq üçün istifadə olunan düymələrə ünvanlardan xəritədaxili domenlər
# Məktubu imzalanmalı olan daxili hostlar dəsti
nano config/etc_default_opendkim

Və bu xətləri əlavə edin

# Qeyd: Bu bir miras konfiqurasiya faylıdır. Opendkim tərəfindən istifadə edilmir
# Sistemd xidməti. Zəhmət olmasa, müvafiq konfiqurasiya parametrlərindən istifadə edin
# /etc/opendkim.conf əvəzinə.
# 
# Əvvəllər, burada standart parametrləri redaktə etmək və sonra icra etmək olar
# / klib/opendkim/opendkim.service.generate Sistemd-də faylları ləğv etmək üçün
# /etc/systemd/system/opendkim.service.d/override.conf və
# /etc/tmpfiles.d/opendkim.conf. Bu hələ mümkündürsə, indi budur
# Parametrləri birbaşa /etc/opendkim.conf-də tənzimləmək tövsiyə olunur.
# 
# Daemon_opts = ""
# Bir Unix Soket istifadə etmək üçün / Var / Spool / PostFix / Run / Opendkim
# Bir Chroot-da postfix:
# Rundir = / Var / Spool / Postfix / Run / Opendkim
# 
# Alternativ bir yuvanı təyin etmək üçün kasx
# Qeyd edək ki, bu tənzimləmə opendkim.conf-də hər hansı bir yuvası dəyərini ləğv edəcək
# Defolt:
# Port 54321-də bütün interfeysləri dinləyin:
# Socket = Inet: 54321
# Port 12345-də loopback-də qulaq asın:
# Socket = Inet: 12345 @ localhost
# 12345 portunda 192.0.2.1-də qulaq asın:
# Socket = Inet: 12345@192.0.2.1

Postfix serverimizi qurmağa hazır olduğumuzda, aşağıdakı kodu, müvafiq domen adı quraşdırılmışdır. Bir skript yaratmaqdan başlayın

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

İndi Nano-da, mətn redaktoru, bu faylı redaktə edin ki, femmebabe.com əvəzinə domen adınızı ehtiva edir.

# ! / bin / bash
# Setup Postfix

İndi postfix, Opendkim və Dovecot'u konfiqurasiya etmək üçün tamamlanmış skript işləyin.

./scripts/postfixsetup

Bu skript qaçdıqdan sonra, son sətri nüsxəsini yazın və DNS konfiqurasiyasına göndərin. Bu etibarlı poçt göndərərkən domeninizi müəyyən etmək üçün istifadə olunan OpendKim düyməsini istifadə edir.

Doesome! Bir neçə gün ərzində hər şeyin düzgün qurulduğu təqdirdə serverdən poçt göndərə bilməlisiniz.

Yalnız poçt serveriniz üçün DNS-ni konfiqurasiya etmisinizsə, qeydlərin yeniləməsi üçün 72 saatdan az vaxt lazımdır. Adətən daha sürətli. Serverinizin bu əmri istifadə edərək işlədiyini yoxlaya bilərsiniz, e-poçtunuzu təqdim etdi:

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

Hər şey düzgün işləsə, serverinizlə e-poçt göndərə bilməlisiniz. İşləmirsə, səhvin nə ola biləcəyini görmək üçün qeydlərə baxmağa çalışın.

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

Bu, server tərəfindən göndərilən və düzgün işləməsi ilə göndərilən poçt haqqında məlumat verəcəkdir. E-poçtunuzu da qutusunuzda görə bilməlisiniz, əgər orada deyilsə, spam qovluğunuzu yoxlayın.

Parametrlərinizin parametrlərinizdəki parametrlərinizi konfiqurasiya etməlisiniz. Parametrlərinizdə bu xətləri əlavə edin və ya dəyişdirin

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

Şifrəni əldə etmək üçün bir konfiqurasiya faylından istifadə etdiyimizə diqqət yetirin. Bu faylı faylın başlanğıcında bu kimi parametrlərdə yükləyək.:

# Açıq və yükləmə konfiqurasiya

Gəlin bu faylı yaradaq və ona gizli bir açar əlavə edək, eləcə də poçt parolunu əlavə edək. Gizli bir açar yaratmaq üçün, bu əmrdən istifadə edin, sonunda istədiyiniz uzunluğu ilə istifadə edin:

openssl rand -base64 64

İndi açılan mətni nəsil və /etc/config.json

sudo nano /etc/config.json

Gizli açar olaraq yaradılan açarı olan açarı olan faylınıza aşağıdakı sətirləri əlavə edin.

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

JSON Format sadə və istifadəsi asandır, bu şəkildə layihəmizdə də istifadə etmək istədiyimiz digər düymələri elan edə bilər və layihələr kataloqumuzdan ayrı saxlaya bilər və buna görə də digər istifadəçilərimizi yalnız layihə qovluğumuzdan oxuya bilmirlər. Bu, burada bir neçədən çox istifadə edəcəyimiz API düymələri üçün tövsiyə olunur.

Hər şeyin xilas olduğundan əmin olmaq üçün layihənizi də yedekləmək istəyəcəksiniz və artıq bir server icarəyə götürmək istəməsəniz, işinizi bərpa edə biləcəksiniz.

sudo backup

İndi bir əmr satırından birini göndərməklə bir html e-poçt göndərməyə çalışın, əmr satırından birini göndərir. İstifadəçi nümunənizi qabıqda soruşun və Django vasitəsilə istifadəçiyə HTML e-poçtunu göndərin. Adımı CHARLOTTE, istifadəçi adınıza dəyişdirin.

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

Birinci əmr işləmirsə, istifadə etməyinizə əmin olun

source venv/bin/activate

Hər şeyin düzgün qurulduğu, indi veb tətbiqiniz tərəfindən göndərilən poçt qutusundakı xoş bir e-poçt alacaqsınız. ! Uzun bir yolla gəldin.

Əlavə etmək istədim, əgər bu kimi bir layihə üzərində işləyərkən heç bir səhvlə mübarizə aparırsan, cavab axtarmaqdan və kömək istəməkdən çəkinməyin. Google, digər axtarış motorları arasında, proqramlaşdırma yardımını axtarmaq üçün əla mənbələrdir. Sadəcə əldə etdiyiniz səhvi axtarın və digər insanların problemi necə həll etdiyini görə biləcəksiniz. Ayrıca, mənimlə əlaqə qurmağı, müəllimləriniz (müəllimlər, professorlar, müəllimlər), proqramlaşdırma yardımı üçün mövcud olan hər hansı bir həmyaşıd, bu kitabı və ya digər mənbələrlə qarşılaşdığınız məsələlərin həllini tapmaq üçün müraciət edə bilərsiniz. Mən bu asan deyil, amma bu günlərdə oxusan və heç bir kod yazmamısınızsa da, sıfırdan bir veb tətbiqetməsini qurmaq haqqında çox şey öyrənirsiniz. Özünüzü arxa tərəfdən vurun, əla bir iş görürsən.

Bu üçüncü nəşr veb inkişafı təlimatını oxumağa vaxt ayırdığınız üçün təşəkkür edirəm. Gələcək nəşrlərdə mən sənədin əvvəlində müzakirə olunan vacib nümunələrin daha çoxunu əhatə edəcəyik və proqram və aparat inkişafı dünyasına daha dərin dalış edəcəyik. Nə gələcəyinə görə durun və inanılmaz bir proqram qurmağı öyrətməyi səbirsizliklə gözləyirəm. Növbəti nəşrdə görüşək!






Yaxın
Səhifə 1
Tullanmaq
Tam məqaləyə baxın
Oxumağa davam edin

Almaq | Kripto ilə satın alın



https://glamgirlx.com/az/practical-web-based-deep-learning-and -


Peşəkar əyləncə, fotoşəkillər, videolar, audio, canlılar və təsadüfi oyun, eləcə də şəxsiyyət skaner, veb inkişafı və surroqasiya xidmətləri.

Bu ünvandan istifadə edərək məni bitcoin-də bir ipucu buraxın: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Xidmət şərtləri