Praktika ret -bazita profunda lernado kaj sekureco per ekzemplo

DaisyProfila foto

De 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 ...
Praktika ret -bazita profunda lernado kaj sekureco per ekzemplo

Praktika ret -bazita profunda lernado kaj sekureco per ekzemplo Tria Eldono Charlotte Harper 3 julio 2024 Ĝisdatigita/konvertita la 3an de junio 2025

Antaŭparolo:

Sekurecaj konsideroj en konstrua programaro por la retejo estas grava parto de la plano kaj ekzekuto de iu ajn programisto, dum inĝenierado de prototipo dependas, stabila kaj utila por praktikaj celoj. 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 Serĉante mortigi tempon aŭ fari ion faritan en la interreto, kutime sur tuŝekrana inteligenta aparato. Plej multaj homoj eĉ ne scius, kie komenci, kiam ili volas konstrui retejon de nulo, ili inklinus komenci en la retejo de alia homo kaj konstrui ion limigitan en funkcieco, dependeco, facileco de uzo kaj precipe kreemo, kiam ili povus havi ĉiujn plej novajn potencajn ilojn je sia dispono por konstrui ion ajn utilan por malpliigi ĝin, por ke ili devas fari nur por ke ili faru, ke ili devas fari nur por ke ili faru, ke ili devas nur pri tio, ke ili devas havi la plej novajn potencajn ilojn. Se vi havas kelkajn minutojn por legi viajn celojn kaj akiri iom da gvidado en la ĝusta direkto, kaj estas motivita lerni kodi kaj verki vian propran programon, preni ĉi tiun libron hejme kaj flankenmeti iom

Pri Mi: Mi estas programisto kun vasta sperto en C/C ++, Java, Python, HTML, CSS kaj JavaScript. Mi konstruas retejojn, kiujn homoj volas uzi, volas viziti, kaj eĉ toksomaniuloj por uzi nur por lerni, rekrei kaj mortigi tempon, kaj plej grave, mi vendas programojn. Se vi havus ideon pri ekzakte kiel vi volis, ke retejo aspektu kaj funkciu, vi pretis subteni min, por ke mi povu plenumi miajn proprajn bezonojn dum mi renkontos viajn, kaj vi pretas kovri la kostojn de funkciado de retejo mem, mi konstruus al vi la sekvan YouTube, Tiktok, Twitter, Google aŭ eĉ altteknikan sekurecan programon, nur vi povas aliri. Anstataŭ provi vendi al vi mian tempon, mi provas aĉeti vian: mi volas paroli vin pri konstruado de app (retejo) mem kun la informoj, kiuj jam ekzistas, kaj instrui al vi, kion vi bezonas por esti sendependa programisto, entreprenisto, gvidante sukcesan karieron en kia ajn kampo vi deziros. Kaj lasu min esti klara, la edukado, kiun mi donas al vi, estos neformala. Vi povus iri al lernejo kaj lerni ĉion ĉi per formala edukado, aŭ eĉ legi ĉi tiun libron en la lernejo, plenumi viajn taskojn kaj forpreni multon de via edukado, sed mi ne formale metos vin en la varman sidlokon kaj petos vin plenumi taskojn. Mi ne estas via profesoro, vi povas pensi pri mi kiel amiko, kiu volas gvidi vin al kariero antaŭenpuŝita de via propra persona sukceso. Kaj mi ankaŭ ne vendas al vi sukceson, vi bezonos aĉeti ĝin kun via tempo. Lerni kodi havas abruptan lernan kurbon kaj neniam estis facila, aŭ eĉ supozeble. Vi devas labori tiel forte, kiel vi eble povas kaj daŭre provu malsukcesi kaj provi denove eĉ kiam vi frustras vin por lerni kaj konstrui programojn mem. Tio estas en la naturo de kodo mem. Kodo estas administrita de kompililo, kiu estas desegnita por doni al la programistoj erarajn mesaĝojn, kaj ĉi tiuj instruos vin kiel kodi, eĉ se vi simple kopias la eraron en vian serĉilon kaj legas la ekzemplojn de aliaj homoj. Kaj mi devas diri, ke vi ne bezonas esti ege riĉa, inteligenta, sukcesa aŭ eĉ detala orientita aŭ organizita por konstrui aplikon. La komputilo prizorgas tiun organizon por vi. Vi nur bezonas persisti per la provo kaj eraro, konservi fokuson kaj labori forte pri tio, kion vi faras, kaj vi havos tre sukcesan karieron en la tuto de tio, kion vi faras.

Kiu mi estas: Mi konscias, ke la lasta sekcio temis pli pri lernado kaj vi prenas vojojn de ĉi tiu libro. Kiu mi estas ĝuste? Tio estas komplika demando. Mi mem ne klaras pri tio, ĉar mi suferas kuracajn kondiĉojn, kiuj povas malfaciligi min eĉ kodi aŭ verki ĉi tiun libron kelkfoje, dum mi prezentas defiojn kun sociaj kaj identecaj problemoj, kiuj malfaciligas mian vivon kiam temas pri enkonduki min. Mallonge, se vi legas ĉi tiun libron, vi alportis ĝin hejmen ĉar vi trarigardis ĝin kaj pensis, ke ĝi estas utila, aŭ eĉ se vi nur legas ĉi tion, al vi mi estas simila al individuo, kiu volas vidi vin sukcesi en ĉio, kion vi faras. Mi mem estas inĝeniero, programisto, kaj studento, kaj mi verkas ĉi tiun libron por aliaj studentoj, kiuj volas faciligi sian vivon per manlibro pri la programaro, kiun ili bezonas faciligi sian vivon donante ekzemplojn por kopii, kiuj kongruas kiel granda enigmo en funkcia, utila, granda, funkcia, kohera kaj engaĝanta app, kiu povas kaŭzi sukceson, utilan, grandan, funkcian, koheran kaj kunigi app, kiu povas kaŭzi sukceson, utilan, grandan, funkcian, koheran kaj kunigi app, kiu povas kaŭzi sukceson, ne gravas la linio de komerco. Plejparte, jen kion mi faras: mi konstruas programojn por helpi min kaj aliajn homojn sukcesi. Mi ankaŭ estas aŭtoro, kvankam ĉi tiu estas mia unua publikigo, kiun mi intencas plenumi por kunmeti mian biletujon en utilan dokumenton, kaj mi ankaŭ estas artisto. Mi agnoskos ĉi tion al vi, mi estas ia stranga homo. Mi ne estas perfekta, mi kuris kun la leĝo eĉ kondukante min forlasi altlernejojn kaj universitatojn kaj forlasi ŝtatojn por provi fari nomon por mi mem kun pli da sukceso. Mi estas virino naskiĝinta, mi surhavas ŝminkon, prenas fotojn de mi mem, portas vestojn kaj aliajn virinajn vestojn, kaj mi restas konscia pri mi kiel ino laŭ naturo. Mi havis problemojn kun aliaj homoj en la pasinteco, kiuj kondukas al luktoj pri verkado kaj konstruado de Webapps, kaj mi pardonpetas, ke mi ne sukcesis akiri ĉi tiun libron en viaj manoj pli frue: vi bezonis ĉi tion. Vi volos legi kaj skribi kodon, kiu aspektas kiel la mia kaj funkcias kiel la mia kaj faras la samon sed eĉ pli bone, ĉar se vi povas permesi aĉeti ĉi tiun libron anstataŭ mari vian klavaron kiel mi faras nur por krei libron mem petante monon por ĝi, vi havas la rimedojn, kiujn vi bezonas por sukcesi en via vivo. Mi havis ĉiajn problemojn kun familio kreskantaj, sanaj kondiĉoj, kuracistoj, amaskomunikiloj kaj la leĝo, kaj mia kodo profunde reflektas la lukton, kiu estas feminismo kaj virina naturo en dividita kaj frustrita mondo. Tamen ĉi tiu libro estas io, pri kio mi profunde zorgas, mia bebo, mia biletujo kaj mia vivtenado, do mi dankas vian konsideron kiam vi prenas la tekston hejmen kaj zorge forprenas ĝin por lerni de mi. Bonvolu memori, ke mi ne estas perfekta, ĉi tiu libro havos erarojn, reviziojn kaj novajn eldonojn, kaj vi bezonos pensi kun via logika cerbo kiel eble plej bone por havi sukcesan sperton kun mia verkado. Ankaŭ komprenu, ke mi celas bone por vi eĉ kiam vi alfrontas defiojn kiam vi verkas. Pripensu ĝin tiel: Kiam vi povas simple lui komputilan sistemon por fari ion ajn, kion vi eventuale povas imagi en la cifereca spaco, stoku ĉiujn informojn, kiujn vi renkontas, analizas kaj organizas ĝin kaj komprenos ĝin, vi neeviteble renkontos malfacilaĵojn kun la informoj, kiujn vi ingestas kaj eĉ publikigas. Mi diras tion al vi, ĉar mi renkontas la samajn malfacilaĵojn. Uzu ĉi tiun libron je via propra risko, kunlaboru kun viaj komunumo kaj komunumoj disponeblaj por vi por konstrui programojn en sekura aranĝo, kaj ne prenu aferojn persone, kiam vi malsukcesas aŭ eĉ sukcesos malĝuste: tiel mi atingis ĝis nun, kaj kial mi povas alporti al vi ĉi tiun tekston kaj helpi vin sukcesi sen ke mi plenumos la vojon de la vojo, kiu ne plu havas la verŝajnon, ke la de la ordo, kiu estas de la ordo, ke ni faros, ke ni faros la monton, ke ni plu faros la verŝajnon, ke ni plu povas. Interreto. Vi eble ne tre konas, kiu mi estas kun nur kelkaj vortoj, sed mi kuraĝigas vin legi, vi ekkonos min dum vi daŭre legos kaj komprenos min dum konstruado de viaj propraj projektoj por plenumi vian laboron. Ne estos hejmtasko kun ĉi tiu libro, kondiĉe ke viaj profesoroj aŭ instruistoj ne asignu vin, sed mi tre kuraĝigas vin konstrui biletujon de projektoj mem dum vi legas kune, kaj ankaŭ kaptonan projekton montrantan kiel vi povas apliki tion, kion vi lernis. Mia Capstone -projekto estas la bazo por plej multaj el tio, kion vi legos en ĉi tiu libro, ĉar ĝi korpigas kodon el miaj antaŭaj projektoj, kodo, kiun mi kreis kaj lernis skribi metodike mane, kaj ampleksan gamon da ideoj kaj konsiloj, kiuj helpis min sukcesi ĝis la punkto, kie mi povas ŝpini simplan programon, kiu estas plene prezentita, kiel vi povas fari, ke vi povas vidi vin, kiu povas fari vin, kiu povas fari vin, kiu estas tre nova, kiu povas vidi vin, kiu povas vidi vian amikon, kiu povas esti populara aŭ aperinta,

Kio estas ĉi tiu libro: Ĉi tiu libro estas lernilo per ekzemplo. Vi povas trovi kodon ĉi tie, instrukciojn pri kiel lerni kodi, informojn pri elpurigado de kodo kaj ripari erarojn, solvi problemojn, instrukciojn pri kiel rezervi kaj konservi vian kodon, re-deploji se iu rompas vian kodon, sekurigi vian kodon, deploji vian kodon, konstrui, ke vi amuzas vin, kaj vi havas, ke vi amuzas vin, kaj vi povas fari, kaj kiel vi povas fari, kaj kiel vi havas, ke vi amuzas vin, kaj estas por vi, kaj vi volas, ke vi amuzas vin, kaj estas por vi, kaj vi volas, ke vi amuzas vin, La absoluta plej bona lumo por esti la plej alloga kiel eble por viaj finaj uzantoj, la vizitantoj de via retejo. En ĉi tiu libro, mi montros kelkajn ekzemplojn de programaro kun fokuso en la retejo kiel platformo same kiel sekureco. Ni iniciatos la lernan sperton konstruante bazan projekton per la UNIX -ŝelo, kun rezervaj kaj skriptaj funkcioj. Poste, ni ekzamenos bazan blogan retejon, ĝisdatigos nian blogon per foto kaj filmetoj kaj ankaŭ uzos ĉi tiujn funkciojn por uzi sekurecajn solvojn per senpaga programaro kaj sekurigi nian servilon per Pluggable Authentication Module (PAM). Ni tiam revizios dosieron kaj prilaboradon, esplorante videoredaktadon, voĉan donacon, barkodan skanadon kaj optikan karakteron -agnoskon, inter aliaj konceptoj. Laŭ la vojo ni ekzamenos APIojn, kiuj helpos nin fari nian programon pli utila kaj sekura, kun senpagaj kaj pagitaj opcioj. Laŭ la vojo, ni esploros fizikan sekurecon kaj militantajn ilojn kiel pafiloj kaj municioj -projektado kaj fabrikado inkluzive de barelo kaj ripeta dezajno, turreto kaj drona dezajno, kaj aliajn rektorojn ni integriĝos kun nia programaro en la ekzistanta reto por protekti nian programon kaj pruvi memdefendon kaj reloĝigon. Ni faros paŭzojn laŭ la vojo por konstrui ludojn, 2D kaj 3D bildigajn motorojn, kaj laboros kun enigita aparataro en kazo de studaj ekzemploj de bazaj dimensiaj bildigaj programoj kaj elektronika vibranta masaĝisto en silikona kaŭĉuko respektive. Laŭ la vojo, ni ankaŭ uzos maŝinajn lernadajn solvojn jam haveblajn por pli bone sekurigi nian programon. Ni ankaŭ dungos akciajn ilojn disponeblajn por la retejo por simpligi kaj sekurigi la procezon. Ĉi tiu libro estas gvidilo por via sukceso en konstruado de ret -aplikaĵo kaj integri ĝin kun profesia reto de komputilaj kaj enigitaj mekanikaj sistemoj, kaj entute gvidilo por konstruado de programaro kaj enigita aparataro kun neniu fona scio aŭ antaŭa sperto.

Kio ne estas ĉi tiu libro: Se vi vere volas havi retejon, vi simple povus starigi simplan butikon kaj vendi tion, kion vi bezonas, afiŝi blogon, afiŝi fotojn aŭ filmetojn, aŭ alie sen iam verki ununuran linion de kodo. Ĉi tiu libro ne estas tiel. Ĉi tiu libro instruos vin kiel konstrui programojn pli utilajn, plene prezentitajn, funkciajn kaj sekurajn ol iu ajn programaro, kiun vi jam povas trovi, ĉar ĝi disfaldas la plej novan programon, kiu ankoraŭ estas prototipoj, eble multekostas por funkcii ĉe skalo pli maljunaj kompanioj, kaj ne plaĉas al malantaŭen, konvolutaj kompanioj starigitaj por gajni monon por homoj, kiuj vere ne faras ion ajn. Se vi sekvas ĉi tiun libron proksime, vi volos skribi kodon, esploran kodon, konstrui viajn proprajn programojn kaj vi gajnos monon per tio, kion vi faras. Mi gajnos monon el ĉi tiu libro, eĉ en fruaj stadioj, ĉar ĝi enhavas informojn, kiujn homoj bezonas kaj volas legi, kaj jam aĉetas kiam ili aĉetas aŭ uzas miajn programojn. Ĉi tiu libro ne konstruos aplikon por vi, sed ĝi atentigos vin en la ĝusta direkto kaj armos vin per la iloj, kiujn vi bezonas kaj la kapablojn kaj konsiletojn, kiuj faciligos vian propran sukceson en konstruado de programoj por la retejo, kun ĉiu linio de kodo, kiun vi bezonos skribi kiel ekzemplon, preta por esti kunmetitaj en la programojn, kaj al la interreto, amikoj, familio, vizitantoj, partoprenantoj, kunlaborantoj, kunlaborantoj, kunlaborantoj, kunlaborantoj, kunlaborantoj, kunlaborantoj, kunlaborantoj.

Kion vi lernos: Ĉi tiu libro instruos vin kiel konstrui kaj vendi programaron, vere funkcian, utilan programon, registradon de amaskomunikiloj, sekurecajn funkciojn kiel vizaĝan rekonon, maŝinan legeblan zonan barkodan skanadon, retejajn APIojn por aŭtentigi, registri kaj redoni filmetojn kaj fotojn, kaj interŝanĝi mesaĝojn kiel Bluetooth kaj Proksima Kampo (NFC) komunikado. Ĉi tiu libro instruos vin kiel uzi interkonektan komputilon, fokusante pri Debian Linukso, kiel konstrui bash -kodon por fari instali kaj subteni vian programon kudritan, aŭtomatan venteton, kiel konstrui python -kodon kiel backend por servi al uzantoj, por ke ili havu al vi aŭ aliaj celoj, ID -skanado, bildo kaj video -modereco, datumaj mikrotransakcioj por konservi vian programon sekura, paga prilaborado, cryptocurrency -komerco, asinkronaj taskoj kaj pli. Vi lernos kiel konstrui viajn proprajn Bluetooth -aparatojn, kun kuirilaroj, ŝargiloj, mikrokontroliloj, cirkvitoj, motoroj kaj sensiloj, uzante soldaton, draton kaj 3D presitajn same kiel rolantajn materialojn. Mi montros 3D -projektajn ĉefojn aplikitajn al aldona fabrikado kaj ilo kaj mortado, do vi kapablas fabriki viajn proprajn enigitajn aparatajn aparatojn kun integritaj baterioj, ŝargiloj, elektronikaj cirkvitoj kaj funkciaj eliroj. kaj interkonsentu ilin per Bluetooth kaj la retejo. Specife, ni ekzamenos du kazajn studojn, vibrantan masaĝiston kaj hejman pafilon, ambaŭ programitajn en OpenSCAD, kiu estas havebla kiel grafika interfaco aŭ komandlinia utileco kaj povas esti integrita en retejo por pli rapidaj rezultoj. Vi lernos kiel konstrui kaj disfaldi retejon de la tero sen antaŭa sperto, fari ĝin funkcia, sekura, bela, utila kaj plej grave praktika. Vi lernos kiel uzi maŝinan lernadon kaj komputilan vizion por fari retejon sekura kaj pli praktika, registri filmetojn kaj sonojn de via retejo, donaci vian voĉon, fari muzikon kaj moduli sonon por krei utilajn specimenojn, kaj kiel rompi la bruon utiligante aliajn retejojn por konstrui la plej bonan reton de retejoj, kiujn vi povas ligi rekte al viaj por dividi ĉiujn utilajn informojn, kiujn vi devas oferti, kaj eĉ pli grave alporti homojn, kaj eĉ pli grave alporti homojn. Ĉi tiu libro estos fokusita plej peze sur amaskomunikiloj, sekureco kaj maŝina lernado, kiuj estas la ĉefaj tri komponentoj, kiuj helpos vin konstrui utilajn programojn por la retejo per engaĝado de la ĝustaj uzantoj kaj malinstigi la malĝustajn homojn en maniero realisma, praktika, mano kaj engaĝiĝi dum ankaŭ aŭtomata kaj fortika. Ĉi tiu libro instruas UNIKSO, specife Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript, kaj kelkajn utilajn programajn pakaĵojn por Python kiel petoj, same kiel utilaj bazaj programoj kiel Git kaj FFMPEG. Mi ankaŭ instruos vin kiel komerci cryptocurrency aŭtomate, kaj prenos pagojn en cryptocurrency aŭ de regulaj debetaj kartoj dum eĉ pagas viajn vizitantojn parton de via enspezo se vi elektas fari tion. Mi instruos vin kiel gajni monon per via retejo per reklamado ankaŭ, kiel pretigi vian programon por serĉiloj kaj fari ĝin rapide, rangigita en la unua ranking por tio, kion serĉos viaj klientoj por trovi vin, kaj rangigante kiel eble plej multajn komunajn serĉojn. Mi instruos vin kiel vendi vian programon, reklami ĝin, apelacii al klientoj serĉantaj viajn servojn kaj fari nomon por vi mem en la interreto per avenuoj, kiuj jam ekzistas, estas malmultekostaj kaj bone funkcias. Mi instruos al vi kiel konservi viajn datumojn en nubaj komputiloj, kiuj funkcias por vi kaj ŝparos viajn datumojn malmultekoste, kiel plani kaj konstrui retejon, kiu faras tion, kion viaj uzantoj volas kaj kion vi volas, kaj kiel teni viajn uzantojn engaĝitaj metante vian retejon frapeto ĉe siaj telefonoj kun via retejo, retpoŝto, telefonaj telefonoj, kaj pli da avenuoj por alporti al vi nur viajn retejojn. Ĉi tiu libro temigos la praktikecon de eldono kaj distribuado de amaskomunikiloj en grandaj sumoj, de teksto ĝis fotoj ĝis filmetoj ĝis audio, farante bonan impreson pri finaj uzantoj (via kliento), kaj vendante vin iel ajn por krei retejon, app, kiu estas reprezentanto de vi kaj vi nur, kaj faras vin, via programaro kaj via kompanio aspektas bone en la plej bona maniero ebla. Vi ankaŭ lernos kelkajn konsiletojn kaj lertaĵojn de mi, de kodaj konsiletoj, praktika vaneco kiel ŝminko kaj fotado, modelado kaj agado, kaj pli, kio estos grava por portretado de vi mem kaj via kompanio en la plej bona ebla lumo uzante ĉiujn ilojn disponeblajn al vi dum distribuado de tiom da enhavo kiom vi bezonas tra sana ekvilibro de platformoj por alporti vian programon por fruktiĝi kun neniu pli da penado, laboro, labori, labori, aŭ pli da mono, por alporti vian programon por ne pli da penado, labori, aŭ pli da laboro, aŭ pli da laboro, aŭ pli da laboro, aŭ necesas por alporti vian programon por ne pli da enhavo, aŭ pli da laboro, aŭ pli da laboro, aŭ necesas por alporti vian programon por ne pli da enhavo. Ĉi tiu libro nomiĝas "PraktikaRet -bazita profunda lernado kaj sekureco per ekzemplo "pro kialo: ĝi traktas lernadon kodi, specife por la retejo, specife kun fokuso pri sekureco, de praktika vidpunkto, kun ekzemploj de labora kodo, kiu servas la praktikajn celojn skizitajn en la teksto. Taskoj kiel prognozaj metrikoj devenantaj de bildoj, kiel la naturo de la bildo kiel aŭtentika, komputila transprenita bildo aŭ optika kopio (foto de bildo, aŭ presita foto). Sekura, komputilo, kiu kutime petus al vi uzantnomon kaj pasvorton kaj ensalutas vin, eble kun konfirma tokeno por ĉiu nova ensaluto aŭ nova IP -adreso, sed se vi konstruas grandskale, facile uzeblan, fundamente sekuran, kaj potencan programon, ĉi tio povas sufiĉi. Ĉiu, kiu konstruas programaron, kiu estas senmanke sekura, havas iom da senco pri tio, kion tio implicas. Programaro estas enerale nesekura ĉar la aparatoj kaj kontoj, kiujn ni uzas por aliri ĝin, ne ĉiam estas je nia dispono, ili povus esti en la manoj de iu ajn kun malsana intenco por la programaro kaj tial povas riski la programon mem. Jen io de la fokuso de ĉi tiu libro. Interreta komputilo estas defaŭlte sekurigita per longa ŝlosila tokeno, nomata kaj SSH aŭ Sekura Ŝelo -Ŝlosilo, kaj estas alie plej bone sekurigita per retservilo, ĉar la retservilo provizas la malferman aliron same kiel plej modernajn artajn sekurecajn ilojn funkciantajn en la servilo mem. La retservilo havas aliron al la retumilo de la uzanto, kiu estas verŝajne la plej potenca parto de la aparato de la uzanto, ĉar ĝi estas la loko, kie la uzanto povas aliri retan programon. Ĉi tiu ilaro povas redoni tekston, la retpaĝojn, kiujn vi vidas, kaj ankaŭ povas registri bildojn, aŭdilojn kaj filmetojn (kiel foto de vizaĝo aŭ ŝtata identigilo), povas legi kaj skribi al Bluetooth -radio -aparatoj, kaj povas legi kaj skribi al preskaŭ kampo -transpondaj etikedoj, malmultekostaj ŝlosilaj kartoj, glumarkoj, kiuj estas enmiksiĝintaj kaj skribaj kaj skribaj kun la retpaĝoj kun la retpaĝoj, por ke ili estu legataj kaj skribaj kun la retpaĝoj, ne povas esti realitaj kaj skribaj, kiuj povas esti realitaj kaj skribaj, kun kiuj estas retaj kaj skribaj, kun kiuj estas retaj kaj skribaj, kiuj estas retaj kaj regas, ke vi estas retaj kaj regas, ke vi estas retaj kaj regas, ke vi povas realiĝi, ke vi povas realiĝi kun la retaj tekstoj, por ke ili realiĝu, ke vi estas retaj kaj regas. Uzante ĉiujn ilojn je via dispono, kun ĉi tiu libro vi ekipos vin per la scio por konstrui sekuran retejon, kaj entute sekura reta komputila sistemo, kiu funkcias por vi, faras vian oferton, kaj aspektas kaj sentas

Kie komenci: Vi bonvenas preterpasi la sekcion, kun kiu mi komencas ĉi tiun libron, aŭ iun ajn sekcion, al la ĝusta kodo, kiun vi bezonas, precipe se vi havas sperton pri kodado antaŭe aŭ iu ajn el la menciitaj iloj, kiujn mi priskribos detale en ĉi tiu libro, kaj dokumentos uzokazojn kaj praktikajn ekzemplojn. Se vi ne havas sperton pri verkado de kodo, mi tre rekomendas vin legi ĉi tiun tutan libron, kaj precipe rekomendas vin legi la antaŭajn sekciojn, por certigi, ke ĉi tiu libro taŭgas por vi. Se ĉi tiu libro ne taŭgas por vi, pripensu doni ĝin al amiko aŭ parenco, kiu eble interesos lerni pri retejo -disvolviĝo mem, kaj eĉ pripensu prunti ĝin kaj lerni de ili por plenigi la mankojn, kie mi malsukcesis vin kiel instruisto, aŭ aliaj instruistoj faris antaŭ mi. Komencu, kie vi volas, ĉiu parto de ĉi tiu libro estos utila se vi intencas konstrui utilan aplikon, kaj konsideru, ke la plej bonaj programoj estas konstruitaj kun la fina uzanto en menso: sciu vian klienton. Nun vi konas min, vi konas ĉi tiun libron, kaj vi pretas komenci. Por komenci, ekprenu komputilon (eĉ la plej malmultekosta tekkomputilo de skatoleto, Amazon aŭ malnova labortablo funkcias, kaj agordu ĝin en maniero, kiu funkcias por vi.

Kiel legi ĉi tiun libron: Teksto reliefigita, indikas, ke la teksto apartenas al komanda prompto, kie vi skribos la kodon, kiun vi aranĝas. La komanda prompto estas tre klavara fokuso kaj postulas malmulte aŭ nenian klakadon, rapidigante vian laborfluon kaj faciligante vin.

Komencante: Ni plonĝu. Ni komencos konstrui kodon sur loka maŝino kaj komenci sen konstrui retejon konektitan al la interreto. Ĉi tio estas pli sekura por komenci, kostas nenion, kaj estas facila por vi. Depende de via operaciumo, eniri bash -ŝelon estos iomete malsama. Por Mac OS, mi rekomendas instali virtualan maŝinon ĉi -momente, ĉar vi ricevos la plej kongruon per virtuala maŝino. Diversaj provizantoj kiel VirtualBox kaj Paralells povas funkcii virtualan maŝinon por vi, kvankam eblas ankaŭ instali Ubuntu rekte sur la maŝino, se vi preferas uzi denaskan medion, kiu rekomendas por krei rapidan, simpligitan sperton. Se vi uzas Linukson aŭ Vindozon, kiun mi rekomendas, devus esti sufiĉe facile krei projekton. Malfermu vian terminalon, ĝustigu la grandecon, kiel vi taŭgas, kaj komencu sekvi la paŝon 2. Se vi uzas Vindozon, bonvolu sekvi la paŝon 1.

Paŝo 1: - Vindozaj uzantoj nur En Vindozo, malfermu komandan promeson kiel administranto kaj tajpu WSL –Install

Paŝo 2: - Daŭrigu ĉi tie, aŭ saltu Paŝon 1 al ĉi tie se vi ne uzas Vindozon En malferma fina stacio, (depende de via VIN, nomata Ubuntu en Vindozo, fina stacio en Mac aŭ Linukso, aŭ simila nomo), komencu kreante projekton. Ni faras ĉi tion per la komando MKDIR, kiu kreas dosierujon. Se vi bezonas krei dosierujon por stoki vian projekton, kiu estas rekomendinda, uzu la komandon KD por ŝanĝi al la dosierujo kaj kaj

KD/PATH/TO/DIRECTORY - La vojo estas la dosierujoj (dosieroj) kiuj antaŭas vian cellokan dosierujon, via defaŭlta vojo estas ~ aŭ/hejmo/uzantnomo (kie uzantnomo estas via uzantnomo). Por ŝanĝi al la defaŭlta dosierujo, tajpu KD aŭ KD ~ Ekzemplo de MKDIR - anstataŭigu "ekzemplon" per la nomo de la dosierujo

Nun vi havas laborantan dosierujon por via projekto. Estante tiel grave konservi ĉi tiun dosierujon, se vi devas ŝanĝi al malsama maŝino aŭ disfaldi la kodon, kiun vi skribas, por ke ĝi estu preta por la retejo, ni konstruos skripton por rezervi vian dosierujon en la sekvaj paŝoj. Sed konstrui skripton prenas iom da kodo, kaj kodo devas esti aŭtomatigita por esti kiel eble plej utila. Do ni konstruu skripton por konstrui skriptojn unue. Ni komencu kreante la skripton kaj igante ĝin plenumebla. Ni uzos sudo, chmod kaj tuŝos por ĉi tio, kaj nomos la skripton "ascript".

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

Nun ni kreis la skripton, faris ĝin plenumebla, kaj pretas redakti ĝin. Nano estas teksta redaktilo, kiu lasos vin redakti tekston sen alklaki, kio estas multe pli facila ol uzi grafikan uzantinterfacon. Por redakti dosieron kun Nano, uzu Nano kaj poste la vojon al la dosiero. Por fari skripton, kiu faras skripton, ĝi estas sufiĉe simila al fari nian skripton unue. Ni uzos la saman kodon kiel supre, anstataŭigante la nomon de la skripto, "ascript" per argumenta parametro, $ 1. Ĉi tio permesas al ni nomi la skripton tajpante Simply Sudo Ascript Newscript, en kiu punkto ni povas krei ajnan novan skripton anstataŭigante "novaĵelsendon" per la nomo de via skripto. La kodo en nano devas aspekti:

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

Kaj por fermi Nano, ni povas teni la kontrolan klavon kaj premi X, tiam Y por indiki, ke ni konservas la dosieron kaj trafas revenon. Nun anstataŭ tajpi ĉi tiujn tri komandojn por redakti skripton, ni povos tajpi Sudo Ascript Ascript por redakti la skripton denove. Ĉi tio funkcias! Kaj iu nova skripto povas funkcii facile nomante ĝin en la ŝelo. Ni konservu nian verkon nun: Ni skribu rezervan skripton por konservi nian novan skripton kaj poste redoni ĝin en nia projekt -dosierujo, samtempe ankaŭ rezervante la rezervan skripton.

sudo ascript backup

Nun, en Nano:

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

Kie/vojo/al/dosierujo estas la vojo al la projekto, kiun vi kreis kun Mkdir. Pli poste ni lernos kiel kopii ripetajn vojojn kiel ĉi tion kun buklo kaj listo, kiu estas malpli kodo, sed por nun ni konservu ĝin simpla kaj havu kelkajn liniojn. Por funkciigi ĉi tiun skripton kaj rezervi vian kodon, konservu la dosieron en nano kun kontrolo+x, y kaj redonu, kaj tajpu la sube en vian ŝelon

backup

Se vi tute petas pasvorton dum legado de ĉi tiu libro kaj sekvas en la ŝelo, bonvolu enigi vian uzantan pasvorton ĝuste, vi havos tri provojn antaŭ ol vi bezonos re-funkciigi la komandon. Vi povas uzi la supren kaj malsupren sagojn por reordigi komandojn kaj redakti ilin, se vi bezonas kuri ion ajn dufoje. Simpla premu supren kaj malsupren intermite por elekti komandon, antaŭ ol redakti la komandon per la dekstra, maldekstra sagoj kaj forigi klavon same kiel klavaron, kaj funkciigi ĝin per reveno.

Gratulon! Vi sukcesis krei mirindan rezervan skripton, kiu subtenas du gravajn ŝelajn skriptojn en via laboranta dosierujo. Ni eble movos aferojn ĉirkaŭe poste, kiam la projekto pligrandiĝas, sed ĉi tio funkcias por nun. Ni pluiru al sekurkopio en la nubo, ni uzos GitHub por ĉi tio (kvankam estas multaj aliaj GIT -solvoj por sekurkopio, ili ĉiuj samas.) Git estas Verision Control -programaro, kiu ebligas al vi rezervi redaktojn al via programaro dum vi faras ilin al servilo, dum vi ankaŭ ebligas al vi elŝuti tutajn kopiojn de via programaro malantaŭ pasvorto aŭ ŝlosilo. Ĝi estas instrumenta por konservi vian programon, precipe dum ni migras al sekuraj Linuksaj kazoj, kiuj foje rompiĝas, kiam ununura linio de kodo malsukcesas, lasante vin ŝlosita dum via kodo eble ne estos rezervita se vi ne havas ŝancon redoni ĝin aŭtomate, kion ni kovros.

Se vi ne jam uzas Ubuntu -virtualan maŝinon tiutempe, mi rekomendas uzi Ubuntu -virtualan maŝinon tiutempe ĉar ĝi faciligos vian vivon dum instalado de ĉiuj pakaĵoj necesaj por konstrui funkciantan retejon kaj antaŭformi profundajn lernadajn operaciojn en via komputilo. Ni translokigos la kodon al retservilo baldaŭ, sed ni volas certigi, ke estas almenaŭ kelkaj tavoloj de sekureco malantaŭ nia retservilo, kiuj estas imunaj kontraŭ phishing, kaj uzas kelkajn Linuksajn pakaĵojn por fari ĉi tion. Se vi ankoraŭ volas uzi Mac OS, vi bonvenas serĉi kaj instali la necesajn pakaĵojn interrete, sed eble ne ekzistas alternativoj por ĉiu pakaĵo, kiun ĉi tiu libro aŭ serio kovros.

Ni aldonu kelkajn komandojn por fari nian laboron per la rezerva skripto per la kurado de la komando sudo ascript.

# ...

Denove, kontrolu X por ŝpari.

Nun ni bezonas fari unu fojon agordon por ĉi tiu projekto. Ĉar ĝi baldaŭ estos GIT -projekto, ni ne bezonas tajpi ĉiun komandon ĉiufoje kiam ni deplojas de Git -deponejo, sed ni ricevos la pendon de ĉi tio kiam ni skribos niajn deplojajn skriptojn. Por komenci, ni certigu, ke ni estas en la ĝusta dosierujo kaj inicialigu la Git -deponejon kaj generu SSH -klavojn.

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

Post kiam ni tajpas SSH-Keygen, la nova ŝlosilo devas esti konservita en la hejma dosierujo sub dosierujo nomata .ssh. Ĝi nomiĝas id_rsa.pub. Ni trovu ĉi tiun ŝlosilon kaj kopiu ĝin. Vidi ĝin,

cd ~
cat .ssh/id_rsa.pub

Kopiu la tekston, kiu estas redonita de la lasta komando, kaj kreu konton kun via GIT -provizanto (ideale GitHub), antaŭ ol aldoni la SSH -ŝlosilon al via konto. Post kiam vi havas konton, alklaku la supran dekstran menuon kaj enigu agordojn, antaŭ ol aldoni vian SSH -klavon en SSH kaj GPG -klavoj sub aliro en la menuo. Elektu Aldonu SSH -ŝlosilon kaj aldonu vian algluante ĝin kaj donante al ĝi titolon, antaŭ ol ŝpari kaj reveni al GitHub por krei novan deponejon. Ĉi tio similas al aliaj GIT -provizantoj, vi devos legi ilian dokumentadon. En la nova deponeja agordo, donu al via deponejo priskriban nomon kaj decidu ĉu vi volas eldoni ĝin, kaj certigu agordi ankoraŭ neniujn dosierojn por inkludo. Post kiam la deponejo estas kreita, kopiu la klonon kun SSH URL, kaj algluu ĝin en la sekvan komandon.

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

Nun vi povas reiri al via deponejo kun KD, vi konos ĉi tion. Provu vian rezervan skripton nun per sekurkopio

Bonege! Nun ni vere povas kodi. Ni instalu Django nun, ke ni havas bonan komprenon pri Bash kaj Git. Django lasos nin aŭtomate subteni nian programon, Bash ankaŭ povas fari tion, sed Django devus havi pli simplan pli sekuran efektivigon (ĝi povas esti malebligita kaj agordita pli facile).

Por instali programojn en Ubuntu, ni uzos la komandon Sudo APT-GET. Unue, ni ĝisdatigu kaj ĝisdatigu la programon, kiun ni jam havis. Ĉi tio eblas per Sudo-APT-Get-ĝisdatigo kaj Sudo Apt-Get-ĝisdatigo -y. Tuj poste, ni instalu Python kaj nian virtualan medion, la hejmon de nia kodo, kun la sekva komando: Sudo Apt-Get Instalu Python-IS-Python3 Python3-Venv

Ĉi tio estas ĉio, kion vi bezonas por akompani Django rilate al programaj instalaĵoj en la Ubuntu -petskribo. Por Vindozo kaj Linukso tio devas esti sufiĉe simpla, sed por Mac vi eble volas instali virtualan maŝinon kaj Linukson sur ĝi uzante senpagan aŭ pagitan virtualan medion kiel VirtualBox aŭ Paralells -labortablo kaj rekrei la paŝojn supre por agordi Ubuntu -medion. Ubuntu estas kritika en ĉi tiu kazo, ĉar ĝi estas la programaro, kiun la retejoj funkcias kaj ebligas al ili gastigi retejojn kun ĉiuj menciitaj programoj.

Ni fosu en la Django.

En nia dosierujo denove, kun KD:

python -m venv venv # Kreas la virtualan medion, kie estas konservita kodo
source venv/bin/activate # Aktivigas la virtualan medion
django-admin startproject mysite . # Kie mysite estas la projekto, kiun mi komencas en mia nuna dosierujo.

Django nur komencas nin, ĉar Django gastigas la retservilon kaj faras ĉion, kion ni bezonas por akiri bazan lokan retejon. Nun, ke ni havas Django instalitan, ni redaktu la agordojn iom por fari ĝin funkcii kiel ni bezonas. Unue, ni kreu novan programon

python manage.py startapp feed

Vi rimarkos, ke la unua app nomiĝas Feed. La app estu nomata kiel ajn vi ŝatas, kaj ni kreos novajn programojn, sed la nomo de ĉiu app devas esti konsekvenca ĉiufoje kiam la app estas referencita en la kodo. Por aldoni novan aplikon, ni ĉiam redaktos la agordojn.py en la alia dosierujo, kiun la app kreita, nomata en StartProject, poste app. Uzante nano,

nano app/settings.py

En la agordoj, trovu instalitajn_apps kaj apartigu la [] en 3 liniojn. Uzante kvar spacojn sur la malplena centra linio, aldonu 'Feed', aŭ la nomon de via app. Ĉi tiu sekcio de la agordoj.py devas aspekti kiel:

INSTALLED_APPS = [
    'feed',
]

Antaŭ ol ni forgesu, ni testu, ke Django funkcias. Uzante la komandon Python Manage.py Runerver 0.0.0.0:8000, ni povas ruli la servilon kaj poste navigi en retumilo en la komputilo funkcianta la kodon al http: // localhost: 8000 kaj vidi ekzemplan retpaĝon (ĝi funkcias!) Ekstari la servilon kun kontrolo C, la sama kiel iu ajn alia komando.

Nun ni fosu skribi iom da Python -kodo. Django havas tri ĉefajn komponentojn, ĉiuj el ili administras kodon tute. La komponentoj estas nomataj modelo, vido kaj ŝablono, kaj ĉiu estas je pli alta kaj pli malalta nivelo respektive antaŭ ol la retpaĝo estas liverita al la uzanto.

La modelo estas la kodo, kiu stokas informojn en la datumbazo por retrovo, ordigo kaj bildigo.

La vido decidas kiel la modelo estas bildigita, manipulita kaj modifita, preskaŭ ĉiu vido uzos modelon rekte.

La ŝablono estas la HTML -kodo kun iuj kromaj sonoriloj kaj fajfiloj nomataj ŝablona lingvo. La ŝablono estas bildigita per la vido, kie ĝi estas plenigita per python -kodo kaj kunteksto kiel modeloj kaj informoj (usuall kordoj kaj entjeroj) el la vido.

Django ankaŭ havas aliajn komponentojn, inkluzive sed ne limigite al:

Agordoj, kiu agordas la aplikon kiel ni diskutis.

URLoj, kiuj estas ŝablonoj, kiujn la uzanto sekvas por akiri aliron al specifaj partoj de la ret -aplikaĵo.

Formoj, kiuj difinas kiel informoj senditaj al la servilo estas pritraktitaj kaj redonitaj al la datumbazo same kiel al la uzanto. Ĉi tiuj estas la fundamento de prilaborado de informoj sur la servila flanko, kaj povas akcepti ajnan specon de informoj, kiujn la komputilo stokas, plej precipe tekstringoj, nombroj kaj veraj/falsaj buleanoj (kutime markobutonoj).

Ŝablonoj, kiuj estas HTML -kodo kaj ŝablona lingvo kaj pontas la interspacon inter Python kaj HTML, signifante ke Python -informoj povas esti servataj kiel HTML -kodo, kiun iu ajn povas aliri kaj povas sekurigi retejon per restriktita aliro, dum ĝi faras Python -kodon alirebla por la retejo kaj utila por diversaj celoj sur fora aparato, kiu ne bezonas esti proksima al la servilo.

Statikaj dosieroj, kiuj kutime estas JavaScript kaj ĝi estas bibliotekoj, kiujn la servilo servas kaj estas ligitaj kun la ŝablono.

Amaskomunikilaj dosieroj, kiujn la servilo servas aŭ estas ekstere gastigitaj, aŭ simple skribitaj al la servilo antaŭ esti prilaboritaj kaj afiŝitaj al alia servilo (sitelo) por gastigado.

Middleware, kiu estas pecoj de kodo, kiuj estas funkciantaj samtempe kun ĉiu vido kaj estas konsiderataj "inkluzivitaj" en la vido.

Kuntekstaj procesoroj, kiuj prilaboras la kuntekston de ĉiu vido kaj estas uzataj por aldoni kroman kuntekston.

Testoj, kiuj validigas, ke la uzanto aŭ peto pasigas certajn postulojn antaŭ ol la vido estas donita.

Konsumantoj, kiuj diktas kiel WebSockets manipulas kaj respondas al komunikado.

Admin, kiu estas uzata por registri modelojn, por ke ili manipulu detale en la paĝo de Admin Django, kie la datumbazo povas esti administrita per grafika interfaco.

Celery, kiu difinas asinkronajn taskojn, partoj de la Django -kodo povas komenciĝi antaŭ ol tuj daŭrigi la sekvan taskon aŭ linion de kodo.

Django povas havi multajn aliajn komponentojn, pri kiuj ni diskutos detale ĉi tie. Estas multaj manieroj fari Django pli funkcia, aldonante WebSockets, kiuj estas rapidaj, simpligitaj komunikaj kanaloj, celerio, kiu plenumas asinkronajn taskojn kaj amason da aliaj pecoj por etendi Django, precipe en la vidaj funkcioj, kie plejparto de la kodo estas ekzekutita. Vidaj funkcioj estas ŝlosilaj ĉar ili kutime deklaras ĉiun pecon de kodo specifa por specifa URL -ŝablono, aŭ sekcio de la servilo.

Unue, ni esploru vidajn funkciojn. Vidaj funkcioj komenciĝas per importoj nomantaj kodon, kiuj estos uzataj en la vido, kaj estas difinitaj per regulaj funkciaj difinoj aŭ klasoj. La plej simplaj vidpunktoj estas difinitaj per la funkcia difino DEF, kaj redonas HTTPResponse kun baza ŝablono. Ni komencu difinante bazan vidon por redoni la tekston "Saluton Mondo". Memoru, ke ĉiufoje vi aldonas kodon post deklaro kiel DEF, se, dum, por, ktp, vi devos aldoni 4 spacojn por ĉiu el la antaŭaj difinoj, kiujn vi ŝatus apliki al via funkcio. Ni baldaŭ eniros tion, kion ĉiu el ĉi tiuj signifas.

El la dosierujo de nia retejo, redaktu la dosieron Feed/Views.py per Nano kaj aldonu la jenajn liniojn al la fino de la dosiero.

from django.http import HttpResponse

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

La HTTPResponse de Django respondas per teksta ĉeno, nomata per la malfermo kaj fermo '. Ĉiufoje kiam vi transdonas informojn al funkcio aŭ klaso, kiel peto aŭ ĉeno, vi bezonos uzi krampojn (malferman kaj fermante).

Ĉi tio ankoraŭ ne estas ĉio, kion ni bezonas por vidi nian vidon. Kompreneble, ni ne diris al la servilo, kie estas ĝuste la vido, ni ankoraŭ bezonas difini vojon, per kiu la vido devas bildigi. Ni komencu per difino de baza vojo en app/urls.py, kaj ni eniros en vojgrupojn poste.

En app/urls.py, aldonu linion post la importaj deklaroj post la komenco importado de la vido, kiun ni ĵus kreis.

from feed import views as feed_views

Nun ni difinu la vidan ŝablonon. Vidaj ŝablonoj havas tri komponentojn, la vojan komponenton, kiu diras al la servilo, kie la vido ekzistas en la servilo (la URL -vojo, kiun la uzanto tajpas en la navigan stangon por eniri la retpaĝon), la vido -komponento, kie la vido estas specifita, kaj amika nomo por la vido, do ĝi estas facile reakiri, se ĝi bezonas pli kaj pli ol vi povas fari, ke ĝi estas pli alta kaj pli alta kaj plia por fari ĝin. Ne havas sencon fari aferojn tiel kaj esti fleksebla, ĉar via kodbazo estos ĉiam ŝanĝiĝanta medio, kiu bezonas flekseblecon kaj improvizon por esti valora kaj facila por labori. Jen kiel aspektos via vido, vi povas aldoni ĉi tion al la urlpatterns = [sekcio de app/urls.py. La vido -ŝablono estas difinita kun la tri komponentoj priskribitaj supre, kaj funkcio nomata vojo. Viaj URL -ŝablonoj estas listo, do certigu ĉiam fini ĉiun eron en ili per komo, ĉar ĉi tio disigas ĉiun. Ĉiu ero ankaŭ devas iri sur novan linion, denove kun kvar spacoj antaŭ ĝi, same kiel la app en Settings.py. Ni difinos la unuan komponenton de la vido kun malplena ĉena funkcio, por krei vidon, kiu funkcias en la radika dosierujo de la retservilo. Via URLS.py nun devas aspekti tiel:

from feed import views as feed_views

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

Jen la bazo por krei retejon kun Django tute statika. Por fari pli dinamikan retejon, kie ni povas komenci kaŝajn informojn, kiel bildoj, filmetoj, audio kaj pli, ni devos uzi modelojn, kiujn ni esploros poste. Nuntempe ni kontrolu nian kodon kaj kuru la servilon. Por kontroli la kodon por eraroj, kuru:

python manage.py check

Se estas iuj eraraj mesaĝoj, vi devas zorge revizii la ŝanĝojn, kiujn vi faris al via app, kaj vidi, ĉu estas io, kio devas esti riparita, kiel ekstera aŭ manka spaco, kroma karaktero, nefermita ĉeno, ia tajperaro, ia hazarde forigita karaktero, aŭ io alia. Legante per la erara mesaĝo (se vi havas unu), vi devus povi vidi la vojon al dosiero, kiun vi kreis aŭ redaktis kune kun linia numero, do rigardu tiun dosieron kaj linion kaj vidu, ĉu vi povas ripari ion ajn. Se vi solvis la problemon, kuru la supran komandon denove. Kiam via programaro pretas funkcii kaj funkcias, vi vidos la eliron "Sistemo -Kontrolo identigis neniujn problemojn." Nun vi pretas iri. Kuru la servilon kun:

python manage.py runserver 0.0.0.0:8000

Nun malfermu retumilon kaj navigu al http: // localhost: 8000. Vi devus vidi la tekston resenditan inter la krampoj kaj citaĵoj de la httpResponse -funkcio laŭ via opinio. Ĉi tio estas nur baza ekzemplo, sed se vi faris ĝin ĝis nun, vi komprenas la bazojn pri kiel Linukso, Bash, Python kaj Django funkcias. Ni fosu pli profunde en iun datumbazan modeladon, kaj esploru la potencon de Python -klaso en stokado de informoj. Poste, ni komencos ekkapti HTML kaj CSS antaŭ ol ni faros nian retejon plene prezentita, fleksebla kaj sekura uzante JavaScript kaj Maŝinlernadon.

Klasoj estas konservitaj en la modeloj.py de via app. Uzante nano, redakti app/modelojn.py kaj aldoni novan klason. Klaso estas difinita kun la klasa difino kaj estas pasita superklaso, kiun ĝi heredas, ĉi -kaze modelojn. La nomo de la klaso venas post la difino de la klaso, kaj post la klasa difino A: (dupunkto) estas uzata, antaŭ ol la atributoj kaj funkciaj difinoj ligitaj al la klaso estas nomataj sube. Nia klaso bezonas identigilon, kiun ni povas uzi por rekuperi ĝin kaj konservi ĝin unika, kaj ĝi ankaŭ bezonas tekstokampon por stoki iujn informojn. Pli poste ni povas aldoni horloĝon, dosierojn, buleanojn (verajn aŭ falsajn difinojn, kiuj povas helpi nian kodon fari decidojn pri tio, kion fari kun la modelo, kaj povas esti uzata por ordigi ĝin), petskribo por ligi la modelon al uzanto ensalutinta en la servilon, kaj pli. Ni elpaku la suban kodon:

from django.db import models # La importado uzata por difini nian klason kaj ĝi estas atributoj
class Post(models.Model): # La difino de nia klaso mem
    id = models.AutoField(primary_key=True) # La ID de nia modelo, aŭtomate generita ŝlosilo, kiu lasos nin pridemandi la modelon, konservi ĝin unika, kaj estas utila kiam ni bezonas interagi kun la modelo post kiam ĝi kreiĝis.
    text = models.TextField(default='') # La atributo de niaj klasaj butikoj, ĉi -kaze, iom da teksto, defaŭlta al malplena ĉeno.

Fermu kaj konservu la dosieron kiel ni antaŭe por fini.

Estas multaj aliaj kampoj kaj ebloj, kiujn ni esploros, kiam ni ĝisdatigos ĉi tiun klason dum nia app evoluos, sed ĉi tio estas la bazaj necesaĵoj krei aplikon por afiŝi iun tekston. Tamen ĉi tiu modelo ne funkcios sola. Kiel priskribite antaŭe, ni bezonos kutiman vidon kaj kutiman URL -ŝablonon por igi ĉi tiun modelon funkcii, kaj ni ankaŭ bezonos formon kune kun ŝablono. Ni esploru la formon unue.

Por difini formularon, redaktu app/forms.py kun nano kaj aldonu la jenajn liniojn. Ni bezonos du importojn, nian forman klason, same kiel la modelon, kiun ni kreis (Feed.models.Post), klasa difino simila al la modelo, kaj kampo kune kun subklaso nomata Meta, kiu difinos la modelon kun kiu la formo interagas. La formo ankaŭ povas havi komencan funkcion, kiu agordas ĝin surbaze de informoj en la peto, modelo aŭ alie, ni esploros ĉi tion poste.

Modelaj formoj estas tiel utilaj, ĉar ili povas krei modelon aŭ ankaŭ redakti modelon, do ni uzos ilin por ambaŭ. Ni difinu unu en formoj.py sube.

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

Jen la bazoj de kiel aspektas formo kaj modelo. Ĉi tiu modelformularo povas esti uzata por instigi aŭ redakti afiŝon, ŝanĝante la tekston, kiun ĝi enhavas. Ni rigardos integri ĉi tiun formularon en vidon poste. Unue, ni faru la migradojn kaj migri la datumbazon por ke nia kodo povu interagi kun la modelo kiam ĝi funkcias. Por fari tion, kuru la jenajn komandojn:

python manage.py makemigrations
python manage.py migrate

Ĉi tio daŭros minuton por ekzekuti, sed unufoje ĝi faros, ĝi permesos al vi aliri la modelon en la vidpunktoj, mezaj programoj aŭ aliloke en la programaro. Ni daŭrigu per vido, kie ni povas vidi nian modelon. Redaktu Feed/Views.py kaj aldonu la sekvan kodon, kiel notite. Vi ne bezonos aldoni ion post la # signo, tiu kodo estas komentoj uzataj por indiki informojn pri la kodo. Ni komencos importi nian modelon en la vidpunktoj, kaj aldonante ĝin al kunteksto, kie ni povas redoni ĝin en ŝablono kiel listo por ekrano. Tuj poste, ni aldonos ŝablonon, kie ni povas redoni la formon kaj la modelon per butono por krei novan objekton bazitan sur la modelo kaj afiŝi ĝin al la servilo. Ĉi tio sonas komplika, do ni nur faru ĝin paŝon post paŝo. Antaŭ ol ni finos la vidon, ni kreu ŝablonon, kiu nur redonas la modelon kaj certigu, ke ni povas vidi ĝin kreante novan afiŝon en la ŝelo. Jen kiel tiu vido devas aspekti:

    posts = Post.objects.all() # Demandu ĉiujn afiŝojn en la datumbazo ĝis nun

Ĉi tio aspektas sufiĉe simpla ĝis ni alvenos al la fundo. Redonu, la valoro redonita de la funkcio anstataŭ en HTTP -respondo kiel la antaŭa ekzemplo, ĉiam prenas peton kiel ĝia unua enigo, akceptas kuntekston (ĉi -kaze la afiŝoj en la datumbazo), kiu nun povas esti prezentita en la ŝablono kaj redonas la ŝablonon difinitan en la funkcio. La ŝablono estos HTML -dokumento kun iom da lingvo nomata Jinja2, kiu transdonas informojn pri Python en la HTML.

Por komenci krei ŝablonojn, faru du dosierujojn en nutrado.

mkdir feed/templates
mkdir feed/templates/feed

Tuj poste, redakti ŝablonon en la dosierujo supre, nutrado/ŝablonoj/nutrado, kaj aldonu la kodon por ĉi tiu ekzemplo. Ni rigardu la ŝablonon por ĉi tiu ekzemplo.

Ĉi tio estas tre simpla ŝablono. Ĝi difinas malfermon kaj fermadon de HTML -etikedoj, dokumenta tipo -etikedo, korpa etikedo kun legenda titolo, paŭza etikedo, kiu aldonas malgrandan linion tra la ekrano, kaj por buklo, kiu faras ĉiun afiŝon en la listo de afiŝoj kiel alineo en la ŝablono. Ĉi tio estas ĉio necesa por bildigi afiŝojn, sed ankoraŭ ne ekzistas en la datumbazo. Ni kreu iujn per la ŝelo. Ni povas funkciigi la ŝelon per administranto.py

python manage.py shell

Nun ni importu nian afiŝan modelon

from feed.models import Post

Tuj poste, ni kreos simplan afiŝon kun ĉeno kaj eliros el la ŝelo. La ĉeno povas esti io ajn, tiel longe ĝi validas tekston.

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

Laste ni devos aldoni URL -ŝablonon al nia nutrado. Ĉar nia nutra app uzos multoblajn URLojn kaj ni volas konservi malgrandajn dosierojn, ni kreu lokan URLS.py en nia nutra app, kiu aspektas tiel:

from django.urls import path
from . import views

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

Ni ankaŭ bezonos redakti la URLS.py en la baza app, kiel ajn ni decidis nomi ĝin, ĉi tiu estis la unua dosierujo, kiun ni kreis. Redaktu app/app.py kaj aldonu la jenon al la URL -ŝablonoj

from django.urls import include # ĉe la supro
    # ... Antaŭa kodo ĉi tie

Nun, kiam ni administras la servilon kun Python Manage.py Runerver, ni vidos la paĝon, kiun ni kreis, ĉar ni havas la modelon, vidon kaj ŝablonon same kiel URL -ŝablonon, kune kun eroj en la datumbazo. Tuj poste, ni efektivigu la formon, kiun ni kreis kaj komencu krei niajn proprajn afiŝojn. Sed antaŭ ol ni skribas tro multe da kodo, ni faru sekurkopion per la skripto, kiun ni skribis pli frue, sekurkopio. Kuru ĉi tiun skripton en la ŝelo, atendu kelkajn momentojn, kaj la tuta kodo estos rezervita al nia Git -deponejo.

backup

Efektivigi la formon estas relative simpla. Ni importos nian formularon, aldonos afiŝan peton pri la vido kaj konservos la afiŝon en la datumbazo antaŭ ol redirekti al la sama vido. Ni povas uzi la redirektan funkcion, kiun ni jam importis, kaj alian funkcion nomatan Reverse por akiri la URL por la vido -ŝablono. Ni pridemandos ĉi tion per la ĉeno 'Feed: Feed' ĉar la nomspaco de la inkluziva ŝablono estas nutrado, kaj la vido ankaŭ nomiĝas Feed.

    posts = Post.objects.all() # Demandu ĉiujn afiŝojn en la datumbazo ĝis nun
    if request.method == 'POST': # Pritrakti la afiŝan peton
        form = PostForm(request.POST) # Krei petskribon de la formo kaj konservi la datumojn al ĝi
        if form.is_valid(): # Validigi la formularon
            form.save() # Konservu la novan objekton
        return redirect(reverse('feed:feed')) # Redirekti al la sama URL kun GET -peto
        'form': PostForm(), # Certigu, ke vi pasigu la formon en la kuntekston, por ke ni povu redoni ĝin.

Nun ni devos ĝisdatigi la ŝablonon por kalkuli la novan formon. Ni povas fari ĉi tion per la uzo de la

Etikedu en HTML kaj redonas la formon en la HTML -ŝablono per submetita butono. Ni ankaŭ bezonos CSRF -tokenon, tokenon, kiu malhelpas eksterajn retejojn afiŝi al la formularo sen unue ŝarĝi paĝon.

Ni detruu ĉi tion. Estas nova formo -klaso, tokeno, la formularo mem, kaj senda butono. Sufiĉe simpla, sed kiam ni rigardas ĝin, ni eble volas fari ĝin pli bona. Ĝi funkcias, ni povas afiŝi novajn afiŝojn kun la formo kaj ili nun estas konservitaj en la datumbazo. Estas kelkaj aferoj ĉi tie. Ni uzas HTML -etikedojn por deklari, ke la dokumento estas HTML -dokumento, ni uzas ŝablonan etikedon ({ % ... %}) por redoni la tokenon por la formo, kaj alia, {{...}} por redoni la formon. Ni ankaŭ havas buklon por redoni la tekston per blokaj etikedoj kaj ŝablona etikedo. Blokaj etikedoj vere gravas, ĉar ni povas difini kiel sekcioj de la ŝablono estas prezentitaj kun ili, kaj ŝablonaj etikedoj estas la bazo de kiel ni enmetas variablojn en nian kodon.

Nun ni devas plibonigi nian programon, ĉar nun ĝi aspektas vere baza. Ni povas fari tion per CSS, ĉu inline, aŭ en klasoj ligitaj al ĉiu objekto en la dokumento. CSS estas vere bela ĉar ĝi diras ĉion sur la paĝo kiel ĝi devas aspekti, kaj povas aspekti vere bone. Estas kelkaj bibliotekoj, kiuj povas fari ĉi tion, sed mia persona IS -bootstrap.

Bootstrap elŝuteblas el ilia retejo,getBootstrap.com/. Unufoje tie, premu la butonon por legi la instaladajn dokumentojn, kaj kopiu la kodon el la Inkluzivi per CDN -sekcio. Vi bezonos ĉi tiun kodon ĉe la supro de via HTML -dokumento, en etikedo nomata kapo. Ankaŭ ni antaŭeniru kaj kreu bazan ŝablonon, por ke ni ne bezonas rekrei ĉi tiujn ligojn en ĉiu ŝablono.

Faru novan dosierujon nomatan Ŝablonoj kun Mkdir -Ŝablonoj, kaj tiam Redaktu Ŝablonojn/Base.html.

Ĝi devas aspekti tiel:

Certigu, ke vi kopiu la CSS kaj JavaScript, la dosierojn .css kaj .js, ĉar ni bezonos la JavaScript por fari nian retejon pli funkcia en la estonteco.

Nun ni revenu al la bash -ŝelo kaj kuru rapidan komandon. Memoru, se vi iam bezonas aliri la virtualan medion, tajpu fonton venv/bin/aktivigi. Ĉi tio lasos vin instali Python -pakaĵojn surloke en maniero, kiu lasas Django aliri ilin. Por doni niajn formojn generitajn de Django Bootstrap -klasoj, ni uzos Python -pakaĵon nomatan Crispy Forms. Ni povas elŝuti ĉi tion per la sekva komando

pip install django-crispy-forms

Post kiam ĉi tio estas instalita, aldonu ĝin al la agordoj.py

    # ... Antaŭa kodo ĉi tie

Nun, reen en nia nutra ŝablono, ni povas forigi iujn aferojn. Ni forigu la komencon kaj finon de la dokumento kaj anstataŭigu ĝin per heredo de nia baza ŝablono, uzante etendojn kaj la blokan difinon. Ankaŭ ni aldonos ŝablonan filtrilon kun ŝarĝo kaj ŝablona filtrilo al la formularo. Laste, ni aldonu bootstrap -klason al la butono sur la formo por aspekti pli kiel butono. Tio devas aspekti tiel:

Bela! Tio estas sufiĉe da kodo jam. Tuj poste, ni devas testi ĝin kaj certigi, ke ni povas vidi, ke ĉio aspektas bela, kaj ankaŭ estu certa, ke ĉio funkcias ĝuste. Kuru la servilon laŭ antaŭaj instrukcioj kaj certigu, ke la retejo aspektas kaj funkcias bone. Bonega laboro! Vi pretas pasi al la sekva paŝo, en kiu ni aldonos funkciojn de uzanto -ensaluto per similaj URLoj, formoj, vidoj kaj ŝablonoj. La baza ŝablono estas grava, kaj ni daŭre modifos ĝin kaj faros ŝanĝojn laŭ bezono, sed nun ni koncentriĝu pri tio, ke nia retejo pli sekuris, ebligante uzantojn ensaluti per uzantnomo kaj paskodo, kaj eventuale eĉ pli gravajn informojn, kiuj helpos teni vian aplikon sekura kaj via propra konto alirebla nur de vi.

Por fari tion, ni devos uzi la uzantan modelon enkonstruitan en Django. La uzantmodelo estas datumbazmodelo, kiel nia afiŝo, kiu povas esti prezentita por ensaluti uzanton en la retejon. En la estonteco, antaŭ ol ni disfaldos la retejon al la interreto, ni etendos ĉi tiun modelon kun aliaj modeloj atribuitaj al ĝi, kaj konstruos aldonajn sekurecajn mezurojn por la ensaluto, kiuj estas imunaj al phishing. Ni komencos per iuj enkonstruitaj ensalutaj formoj, kiujn Django provizas. Unue, ni kreu novan programon, kiun ni uzos por redoni la ŝablonojn kaj vidojn por la baza ensaluta paĝo. Ni ankaŭ kreos aliajn programojn por reprezenti la daŭrajn ensalutajn defiojn por sekurigi la aplikon, inkluzive de pincode, vizaĝa rekono, proksima kampo -komunikado, eksteraj aparatoj, plurfakta aŭtentikigo kaj fingrospura rekono.

Ni jam parolis pri komenci programon. El nia dosierujo, en la virtuala medio, pasas administri ĉi tiujn argumentojn

python manage.py startapp users

Nun, ni devus havi dosierujon por la nova app. Ni komencu kreante vidon en tiu dosierujo, kiu respondas al la ensaluto de la uzanto. Django enkonstruis vidojn por uzantaj ensalutoj, sed ĉi tiuj ne taŭgos por ni ĉar ni bezonas kutiman vidon, kiu estas prefere farita kun difino.

Laŭ ĉi tiu vido, ni komencos per kontrolado de POST -peto, pasi peton. Poŝte al ensaluta formo importita de Django, aŭtentikigu la uzantan konton kaj ensalutu la uzanton antaŭ ol redirekti ilin al nia nutra app.

En uzantoj/views.py, aldonu la jenan kodon

        username = request.POST['username'] # Akiru la uzantnomon kaj pasvorton de la POST -peto
        password = request.POST['password'] # Aŭtentikigu la uzanton

Jen ĉio, kion vi bezonas por baza ensaluta vido. Nun ni kreu formon por la vido etendante la bazan ŝablonon. Ni komencos kreante novan dosierujon por ŝablonoj en la dosierujo de uzantoj.

mkdir users/templates
mkdir users/templates/users

Nun ni devus povi redakti uzantojn/ŝablonojn/uzantojn/login.html. Dum ni ĉeestas, ni kreos ŝablonon por permesi ankaŭ al la uzanto registriĝi.

nano users/templates/users/login.html

Nun, en la ŝablono,

Jen la bazoj de ensaluta ŝablono. Ĝi vere similas al la alia ŝablono en strukturo, sed ĝi aspektas iomete malsama kiam ĝi estas bildigita. Ni povas kopii ĉi tiun kodon por konstrui alian tre similan ŝablonon nomatan Register.html, kie ni ŝanĝos la vortumadon kaj uzos novan formon, kiun ni konstruas. Ni faru la ŝablonon unue. Redakti Uzantojn/Ŝablonoj/Uzantoj/Registri.html kaj aldonu la jenan kodon:

Nun, ni konstruu formularon por nia uzanto -registrado kaj rondiru al la vidpunktoj antaŭ ol ni ĝisdatigos niajn uzantajn ensalutojn kun modelo. Ni faros ĉi tiun formon baza por komenci, sed korpigos pli da detaloj kaj sekurecaj funkcioj kiel interkonsentoj kaj CAPTCHA en la estonteco. Redaktu la formularojn kun Nano -uzantoj/formuls.py, kaj aldonu la jenan kodon.

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

Do ni havas alian formon ĉi tie, kiu funkcias sufiĉe simple. Ĝi estas formularo de uzanto -registro kun uzantnomo, retpoŝto kaj pasvorto, kaj ankaŭ konfirmi pasvortan kampon. Notu, ke ĉi tiu formo ne etendas la regulajn formojn. Unu kampo estas difinita ĝuste la sama, kaj la klaso meta difinas la modelon, kiun la formo respondas al la resto de la informoj, kiuj estos skribitaj al la formo. Plejparte ĉi tio jam ekzistas en la enkonstruita Uzanto -Kresko de Django, do ni uzos tion kiel bazon por la klaso (pasita inter la krampoj).

Tuj poste, ni ekzamenos la vidon registri uzanton, nun kiam ni havas formon kaj ŝablonon. Ĉi tio estas ModelForm, same kiel tiu en la nova Afiŝa Vido. Redaktu uzantojn/views.py kaj aldonu la jenan kodon:

# ... Importoj

Ĉi tio estas ĉio, kion ni bezonas por registri uzanton, sed ni devus havi pli da informoj. Ni volas scii la tempon, kiam la uzanto registris, kioma horo ili estis lastaj sur la retejo, iuj informoj pri ili, kiel biografio, horzono, ktp. Ankaŭ ni devos ĝisdatigi nian manĝan modelon, afiŝi, por kalkuli la uzantan modelon kaj atribui afiŝojn al ĉiu uzanto. Por fari tion, ni ĝisdatigos la modelojn.py en ambaŭ programoj. Ni komencu redaktante la manĝmodelon. Ĝi devas aspekti tiel nun:

from django.db import models # ... Importoj
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Aldonu en ĉi tiu linio

Atentu la duan linion, kiu estis aldonita al la dosiero. Ĉi tio estas fremda ŝlosilo, kiu atribuos ĉiun afiŝon al unu sola uzanto per afiŝo, do ni povas certigi, ke ni konservas la afiŝojn sur uzanto-uzanto kaj neniu afiŝo povas esti farita sen atribui ĝin al uzanto. Ni difinas ĉi tiun fremdan ŝlosilon kun la klaso, kiun ĝi reprezentas, forigi argumenton por certigi, ke afiŝoj estas forigitaj per uzantoj, nulaj kaj malplenaj argumentoj por certigi, ke ni povas forigi la uzanton se necese, kaj akomodi por la manko de uzanto sur afiŝoj, kiujn ni jam kreis, kaj rilatan nomon, kiun ni povas uzi por raporti al la afiŝo, kiujn la uzanto kreas. Ĉi tiu rilata nomo, male al Post.Author, la aŭtoro de la afiŝo, donas al ni uzanton, kiu afiŝis la afiŝon mem. Ni nun povas akiri la afiŝojn, kiujn uzanto faris per uzanto.posts.all (), aŭ author.posts.all ().

Nun, ni faru niajn ensalutojn pli rezistemaj. Ni jam povas fari nian retejon multe malpli vundebla al phishing per simple takso limigante la nombron da fojoj, kiam ni permesos ensaluton al la retejo, ĉi tio estas sufiĉe facila. Ni ankaŭ komencu stoki iujn informojn pri ĉiu uzanto antaŭ ol ni daŭre disvolvas nian aplikon. Redaktado de uzantoj/modeloj.py, aldonu la jenan kodon.

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

Notu, ke ĉi tiu modelo estas sufiĉe simila al la POST -modelo. Ni havas aldonan importadon, horzonon, kiu permesos al ni agordi defaŭltojn sur la DateTime -kampoj, kaj ni ankaŭ havas karakteron kaj tekstokampon kiel la afiŝo. Uzi ĉiujn ĉi TimeStamps helpas nin sekurigi la retejon kaj kompreni ĝian uzon, kaj la tekstaj kampoj lasas nin doni informojn pri ĉiu uzanto, aŭ aŭtoro, en la retejo. La OneTooneField devas esti la sola negrava konsidero, ĝi kondutas ekzakte same kiel foreginkey sed kun nur unu por posta modelo. Tiel la uzanto havas nur unu profilon, dum ili eble havas multajn afiŝojn.

Nun, ni plibonigu nian ensaluton kaj registru vidojn por kalkuli la profilon. Unue, redakti uzantojn/views.py kaj koncentriĝi pri la registra vido:

# ... Importoj
            Profile.objects.create(user=user) # Certigu aldoni ĉi tiun linion, por krei profilon por la uzanto

Ĉi tio simple kreas profilon por la uzanto, sen plenigi iun ajn el la informoj. Nun ni volas certigi, ke la uzantokonto ne povas esti ensalutinta tro ofte, aŭ almenaŭ pasvortoj ne povas esti provitaj tro ofte, do ni ĝisdatigu la ensalutan vidon.

# ... Importoj
        if user and user.profile.can_login < timezone.now(): # Notu, ke ni nun kontrolas ĉu la uzanto povas ensaluti
        else: # Se la ensaluto ne sukcesis,
            user = User.objects.filter(username=username).first() # Jen la parto, kie ni ĝisdatigas la profilon de la uzantoj
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Do ili ne povas ensaluti denove dum kelkaj sekundoj

Jen la baza fundamenta sekureco. Certigu, ke la retejo ne estas vundebla al iu, kiu simple provas ĉiun eblan pasvortan kombinaĵon, aŭ eĉ kelkajn el ili samtempe. Ĉi tio ne frustros la ordinaran uzanton, kiu konas sian pasvorton kaj nur ensalutas kelkajn aparatojn, sed ĝi konservos multajn robotojn de Phishing. Notu, ke ni aldonis IF -aserton kun variablo, Can_Login, tio devus esti tempo en la pasinteco, kaj ĝisdatigi ĝin kun ĉiu malsukcesa ensaluto per la sama uzantnomo. Tiamaniere malica uzanto ne povos diveni pasvorton ie ajn tiel rapide. La nombro da sekundoj en la dateTime.TiMeDeLta () ankaŭ povas esti ĝisdatigita, kaj la retejo estos pli rezistema sed iomete malpli uzebla kun pli da sekundoj. Mi rekomendas 15 por komenci.

Memoru, ni konstruis rezervan skripton por savi nian verkon, do ni iru antaŭen kaj subtenu tion, kion ni havas ĝis nun por certigi, ke ni havas ĉion ŝparitan. Kuru la komandon:

sudo backup

Denove, ĉi tio ŝparos vian laboron ĝis nun. Mi rekomendas funkcii oftajn sekurkopiojn por konservi vian laboron, kaj vi eble eĉ volas funkciigi rezervan laboron aŭtomate. Vi povas fari ĉi tion per UNIX -utileco nomata Cron. Por aktivigi ĉi tiun utilecon, kuru la jenan komandon kaj enigu vian pasvorton:

sudo crontab -e

Se vi ne jam elektis Opcion 1 por Nano, la tekstredaktilon, kiun vi jam devas koni, kaj rulumu al la fundo de la dosiero per la sago -klavoj. Aldonu la jenan linion:

0 * * * * sudo backup

Cron uzas la formaton minuto, horo, tago de monato, monato, tago de semajno, kie * aŭ nombro reprezentas kiam por funkciigi la komandon. Uzante 0 por la minuto kaj * por la resto de la opcioj, ni povas aranĝi komandon en la unua minuto de ĉiu horo en la komenco de la minuto. Ĉi tio permesas al ni redoni la kodon aŭtomate. Ĉiuj laboroj de Cron kiam ekzekutitaj kun Sudo funkcias kiel radiko, do ni ne bezonos tajpi pasvorton ĉiun horon.

Por plifaciligi nian kodon sen uzi pasvorton, ni malebligu la pasvorton por nia rezerva komando. Ni faros ĉi tion per ekzekuto de la sekva komando kaj enigante pasvorton:

sudo visudo

Nun, ni rulumu al la fundo de la dosiero kaj aldonu alian linion:

ALL ALL=NOPASSWD: /bin/backup

Ĉi tio permesas al ni funkciigi la komandon "sekurkopio" kiel iu ajn uzanto, sen pasvorto. La formato por ĉi tio estas facila, nur prefiksu la linion kun "ĉiuj = nopasswd:/bin/" kaj finu per la komando, ekzemple/bin/sekurkopio, kiu ekzistas en/usr/bin/.

Nun ni komencu labori per retpoŝto. Retpoŝto estas vere grava por retejoj, ĉar ĝi estas maniero teni retejon pli sekura, kontroli uzantojn estas realaj homoj, kaj eĉ merkataj produktoj aŭ servoj al klientoj. Multaj homoj, kiuj ofte vizitadas la interreton, kontrolas sian retpoŝton ĉiutage kaj ricevas ĉiajn merkatajn retpoŝtojn pri produktoj kaj servoj, kiujn ili interesas. Estas kelkaj ebloj kiam temas pri ebligi retpoŝton en retejo de Django, kaj vi bonvenas elekti, kiu funkcias plej bone por vi.

Unue, vi povas pagi por retpoŝta servo, kiu ebligos al vi sendi retpoŝton de via domajno kaj postulas minimuman kodon. Estas multaj servoj, kiuj ofertas ĉi tion, kiel Google Workspace, SendinBlue, Mailgun, kaj pli.

Alie, vi bone konstruas vian propran retpoŝtan servon ene de via servilo de nulo. Mi rekomendas ĉi tiun opcion, kvankam ĝi estas pli da kodo kaj eble postulas specialan gastigadon. Vi ne povos komenci poŝtan servilon de via hejma komputilo plej verŝajne, do ni antaŭeniru kaj ekzamenu la agordon kaj kodon por sendi retpoŝton antaŭ ol ni komencos servilon en la nubo kaj kreu nian propran poŝtan servilon ene.

Unue, redakti agordojn kun la sekva komando:

nano app/settings.py

Kie app estas la nomo de la app, kiun vi kreis per startApp.

Aldonu la jenajn liniojn:

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)

Certigu, ke vi ŝanĝos ĉi tiujn, kiam vi pretas disfaldi vian aplikon, ni revizios ĉi tion poste. La agordo retpoŝte_address estu la retpoŝto, kiun vi ŝatus sendi, kaj la pasvorto (retpoŝto_host_password) devas agordi al la pasvorto, kiun vi generas por la servilo. Mi ŝarĝas la pasvorton en agordodosiero por konservi ĝin ekster la kodo per la sekva logiko, super ĉi tiuj linioj en agordoj.py:

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

Poste, mi starigis JSON -dosieron kun la agordo en /etc/config.json uzante Nano kiel sekvas.

Por redakti la dosieron:

sudo nano /etc/config.json

Aldonu la jenajn liniojn:

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

Ni daŭre redaktos la agordan dosieron kaj aldonos ĉiujn pasvortojn kaj ŝlosilojn, kiujn ni uzos en la app. Nuntempe ni rapide ekzamenu kiel sendi retpoŝton per Python. Unue, ni kreu ŝablonon por konfirma retpoŝto, kiun ni povas sendi al niaj uzantoj, kaj enmeti ĝin en la dosierujon de uzantoj. Ĉi tiu ŝablono estos skribita en HTML.

nano users/templates/users/verification_email.html

Ĉi tiu retpoŝto estas sufiĉe simpla. Ĝi prenas kuntekston de uzanto, la baza URL por la retejo, kaj uzanto -identigilo kaj tokeno, kiuj estas uzataj por kontroli la retpoŝton de la uzanto. Certigu difini la bazan URL en Settings.py antaŭ ol ni skribas iun Python -kodon por redoni la ŝablonon. Antaŭen kaj aldonu la jenajn liniojn al app/Settings.py, proksime al la komenco.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Eventuale, kiam via retejo estos preta por la interreto kaj vi disfaldas ĝin, vi volos difini vian domajnon kiel la domajnan nomon, kiun vi aĉetas por reprezenti la retejon. Jen la nomo, kiun vi tajpos en la navbar por aliri vian retejon. Nuntempe vi povas lasi la domajnon malplena aŭ uzi anstataŭilon. Vi ankaŭ volos ŝanĝi la retejon_nomo al nomo, kiun vi volas doni al via retejo, laŭ via elekto.

Antaŭ ol ni sendos retpoŝton, ni kreu token -generatoron por ke ni povu havi tokenon de konto, kiu neniam eksvalidiĝas. Ni povas fari tion konstruante kaj importante tokenon de konto -aktivigo, kiu aspektas kiel la sekva. Redakti la dosieron:

nano users/tokens.py

Aldonu la jenan kodon:

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

Ĉi tiu baza token -generatoro generas tokenon, kiun ni povas sendi al la uzanto en URL kaj la uzanto povas uzi por kontroli sian retpoŝton kaj aktivigi sian konton.

Tuj poste, ni vidu kiel sendi retpoŝton. Uzante nano, redakti uzantojn/retpoŝton.py.

nano users/email.py

Sendi la kontrolan HTML -retpoŝton aspektos jene:

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)

Ĉi tio estas sufiĉe simpla. Ni importas la funkciojn, kiujn ni bezonas por sendi la retpoŝton, redoni la retpoŝton per ŝablonoj kaj niajn agordojn, kaj tiam ni difinas la retpoŝton per la ŝablona nomo kaj sendas ĝin al la uzanto per funkcio. Vi rimarkos, ke ni ankoraŭ ne difinis la funkcion por sendi la poŝton, send_html_email tamen, do ni skribu ĉi tion sub la kodo, kiun ni jam aldonis al uzantoj/retpoŝto.py

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

Ĉi tio estas iom pli kompleksa, kaj ni ankoraŭ ne pretas funkciigi ĉi tiun tutan kodon. Rimarku, ke ni difinas UNSAB_LINK, la ligon, kiun la uzanto povas uzi por malaboni el niaj retpoŝtoj. Ĉi tio gravas, ĉar uzantoj devos povi elekti el niaj retpoŝtoj krom se ili volas vidi ilin en ajna momento. Ni ankaŭ aldonas tekstan alternativon al nia mesaĝo, kiu estas la HTML -mesaĝo senvestigita de HTML -etikedoj. Laste, ni kontrolas ĉu la retpoŝto sendita, kaj se ĝi ne faris, ni markas en la profilo de la uzanto, ke ilia retpoŝto ne validas.

Ni reiru al la uzantmodeloj por ke ni povu fari ĉi tion. Ni devas difini funkcion por generi ligon por malaboni, kaj difini bulean kampon por marki, ke la retpoŝto de la uzanto ne validas.

Unue, aldonu la jenajn importojn al la supro de uzantoj/modeloj.py

nano users/models.py
# ...

Tuj poste, ni aldonu funkciojn al la uzantmodelo por fari la tokenon kaj kontroli la tokenon uzatan por aktivigi la retpoŝton, same kiel la kampon por konservi, ĉu la uzanto sukcese ricevas sian poŝton. En uzantoj/modeloj.py denove, aldonu la sekvan kodon al la fino de la modelo (indenta kodo)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Valida dum 30 tagoj

Ĉi tio estas sufiĉe simpla, ni uzas TimestampSigner, kiu estas baza kriptografia ilo, por krei tokenon, kiu eksvalidiĝos post certa tempo, kaj ni ankaŭ uzas alian funkcion por kontroli ĉu ĝi validas. Ni uzas ĉi tiujn tokensojn dufoje, unufoje por kontroli la retpoŝton, kaj unufoje por malaboni ligon.

Nun, ke ni havas ĉi tiujn, la lasta el la laboro, kiun ni devos fari, estas laŭ la vidpunktoj. Ene de uzantoj/views.py, ni aldonu vidojn por kontroli la retpoŝtadreson kaj por malaboni.

nano users/views.py

Unue, aldonu la jenajn importojn. Mi ĵetis kelkajn kromajn, do ni ne devos importi pli da eroj poste.

from .email import send_verification_email # Certigu, ke vi importas la sendantan retpoŝtan funkcion

Vi eble jam havas iujn ĉi tiujn importojn, sed ne doloras ripeti ilin. Vi bezonos importi la sendantan retpoŝtan funkcion, same kiel account_activation_token de uzantoj.toks, inter aliaj importoj.

Nun, ĉe la fundo de la dosiero, aldonu la jenan kodon:

        # Malabonigu ilin
    # Alie redirekti al ensaluti paĝon
# SendWelcomeEmail (peto, uzanto)

Jen multe da kodo. Ni detruu ĝin. La unua funkcio, pura kaj simpla, malaboni la uzanton de la dissendolisto. La dua funkcio aktivigas ilian retpoŝton, kaj vi rimarkos, ke mi aldonis komentitan funkcion, sendWelcomeEmail. Vi bonvenas uzi retpoŝtan ŝablonon kaj funkcian difinon por sendi bonvenan retpoŝton, mi simple ankoraŭ ne. La lasta funkcio, kiun mi ĵetis, estas grava, ĉar retpoŝtoj de aktivigo eksvalidiĝas. Tial ni devos resendi la aktivigan retpoŝton iom da tempo. Ni povas uzi bazan formon por ĉi tio, kaj telefoni al la funkcio por sendi la konfirman retpoŝton. Antaŭ ol ni faru ĉi tion, ni certigu, ke ĝi estas sendita unue, aldonante funkcian vokon al la registra vido. Aldonu ĉi tiun linion ĝuste antaŭ la redirekto en la registra vido, DEF -registro, en uzantoj/views.py.

nano users/views.py
# ... (Post) DEF Registro (peto):
# ... (antaŭe) redirekti (

Vi ne bezonas aldoni la unuajn kaj lastajn liniojn en tiu koda fragmento, nur certigu, ke la registra vido sendas la konfirman retpoŝton al la uzanto. Ĝi devas aspekti tiel:

# ... Importoj
            send_verification_email(user) # Certigu, ke vi aldonu ĉi tiun linion!

Nun ni devos aldoni formularon por resendi la aktivigan retpoŝton. En uzantoj/formuls.py, aldonu la jenan formularon:

# ... (Importoj)

Ni ankaŭ bezonos ŝablonon respondan al ĉi tiu resenda retpoŝta aktiviga formo. Ni aldonu ĉi tiun ŝablonon. Redaktu la dosieron:

nano users/templates/users/resend_activation.html

Tuj poste, aldonu la sekvan kodon al la dosiero.

Whew, tio estas multe! Nun, kiam ni disfaldas la kodon al nia servilo, ni povos sendi HTML -retpoŝton kaj aktivigi uzantajn kontojn per klako en la retpoŝto. Ni ankaŭ eble volas sendi simplan bonvenan retpoŝton, do ni vidu kiel fari tion. Reen en uzantoj/retpoŝto.py, aldonu la jenan kodon:

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)

Ankaŭ ni bezonos ŝablonon por redoni ĉiujn ĉi tiujn informojn. En mia retejo, la ŝablono aspektas kiel la sube, sed vi bonvenas formati ĝin kiel ajn vi ŝatas.

Notu, ke ni ne havas ferman korpon aŭ HTML -etikedojn, ĉar ni aldonas ĉi tiujn en kiam ni aldonas la ligon HTML Unsubscribe. Ĉi tiuj gravas, sed ni ne volas difini ilin dufoje.

Do kio sekvas? Ni multe venis. Vere, ni devus esti pretaj deploji la retejon al servilo. Ni povas aldoni la @Login_Required -ornamiston kaj certigi niajn vidpunktojn, preni uzantajn subskribojn, sendi konformajn retpoŝtojn kaj kaŝmemorajn informojn, kio estas la bazo de tio, kion retejo bezonas fari por resti grava. Ni aldonos kelkajn pli utilajn funkciojn, kaj tiam konstruos bazon por disfaldi nian kodon al fora servilo, starigante poŝtan servilon, domajnan agordon kaj filtrilojn por igi nian retejon sekura kaj taŭga.

Ni ankaŭ bezonos pasvortan restarigan vidon, do ni aldonu tion vere rapide. La enkonstruita vido de Password Reset de Django estas rompita en iuj funkcioj, sed ni rigardos kiel skribi nian propran vidon, retpoŝtan ŝablonon, formojn kaj URL -ŝablonojn. Jen kiel aspektas la vido, ĉe uzantoj/views.py

# ... Importoj

Ĉi tiu formularo estas enkonstruita al Django, sed ni bezonos ŝablonon por konfirmi la pasvortan restarigon, uzantoj/ŝablonoj/uzantoj/pasvorto_reset_confirm.html

Ni ankaŭ havas ŝablonon por sendi retpoŝtan retpoŝton, kun simpla formo, en uzantoj/ŝablonoj/uzantoj/pasvorto_reset.html

La ŝablono por la retpoŝto mem estas simpla, ĝi estas baza HTML -dosiero, kiu donas ligon por restarigi la pasvorton, en uzantoj/ŝablonoj/uzantoj/pasvorto_reset_email.html. Django aŭtomate interpretos ĉi tiun dosieron.

Ni ankaŭ bezonos du pliajn ŝablonojn. La unua estas konfirmi, ke la retpoŝto estis sendita. Vidoj por ĉi tiuj jam estas en Django, do ni nur bezonas trakti ilin en la URLS.py. Ĉi tiu ŝablono troviĝas ĉe uzantoj/ŝablonoj/uzantoj/pasvorto_reset_done.html

Kaj laste, por konfirmi, ke la pasvorta restarigo estas kompleta, uzantoj/ŝablonoj/uzantoj/pasvorto_reset_complete.html

Nun ni bezonas URL -ŝablonojn por ĉi tiuj vidpunktoj. En uzantoj/urls.py, aldonu la jenajn URL -ŝablonojn:

    # ... Antaŭaj URLoj ĉi tie

Kvar ŝablonoj, tio estas multe! Sed nun ni povas esti certaj povi restarigi la pasvorton de la uzanto kiam ajn ni bezonas, ĉio el la retumilo.

Mi komprenas, ke ĉi tio estas multe da kodo. Se ĝi ŝajnas iomete super via kapo, tio estas en ordo. Vi plibonigos, via kompreno pliboniĝos, kaj vi fariĝos multe pli kompetenta kun kodo tre baldaŭ. Se vi tute perdiĝas, mi rekomendas reveni al ĉi tiu programaro poste post laborado pri mem-ritma lernado de kodo interrete. Ĉi tiuj kutime estas senpagaj por komenci, kaj gvidos vin tra ĉio, kion vi bezonas por sukcesi, kiam vi revenos al ĉi tiu projekto. Se vi sentas, ke vi pretas daŭrigi, legu plu, poste, ni kovros disfaldi vian kodon al fora servilo kaj starigos poŝtan servilon, kaj ankaŭ aŭtomatigos vian disfaldiĝon per BASH, por ke vi povu ĉiam agordi novan projekton kun kelkaj simplaj komandoj.

La lasta afero, kiun ni devas fari antaŭ ol disfaldi al fora servilo, estas igi nian retejon iom pli sekura. Vi rimarkos, ke la ensaluta vido nur prenas uzantnomon kaj pasvorton, kaj ne ekzistas plur -faktoro -aŭtentikigo aŭ unufoja kodo. Ĉi tio estas facila solvo, kaj kun la sama kodo, ni povas igi nian retejon sendi mesaĝojn de teksto kaj eĉ respondi al tekstaj mesaĝoj senditaj al la servilo. Por komenci, ni reiros en la uzantajn modelojn kaj aldonos Timestamp -subskribinton, kiu reprezentos ĉiun ensaluton. Ni ankaŭ aldonos unikan, rotacian identigilon al la uzantmodelo, kiu estos uzata por aldoni ekstran sekurecon al nia ensaluto. Redaktado de la uzantaj modeloj, uzantoj/modeloj.py, aldonu la jenan kodon:

# Certigu importi la UUID, Timestamp -subskribinton kaj URL -generatoron (inverse)
    # Aldonu ĉi tiun kodon ĉi tie
    # Kaj aldonu ĉi tiun funkcion
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Valida por 3 minutoj

Certigu, ke viaj uzantoj/modeloj.py aspektas tiel, krom la komentoj (kodo sur la linioj kun #). Rompante ĉi tion, ĝi estas simpla. Ni havas kelkajn importojn, TimestampSigner, kiu estas kriptografia utileco, kiu povas generi sekuran kodon kaj kontroli ĝin por certigi, ke ĝi validas, nur unufoje uzata kaj ne pli malnova ol certa nombro da sekundoj. Ni ankaŭ uzas UUID, kiu estas unika identigilo, kiu identigas nian uzanton en la subskribo de la tokeno, kaj en la URL, kie la tokeno estas sendita al la uzanto. Ni uzos ĉi tiun bazan kriptografion por konstrui du -faktoran aŭtentikan vidon. Antaŭ ol ni faru ion alian, ni kuru la migradojn por ke niaj uzantaj modeloj estu ĝisdatigitaj. En la dosierujo kun administranto.py, kuru la jenajn komandojn por fari kaj kompletigi la migradojn.

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

Ĉi tio gravas, ĉar ĉiufoje kiam ni faras ŝanĝojn al la modeloj, ni devos krei la tabelojn kaj ĝisdatigi la datumbazon kun defaŭltoj antaŭ ol ni efektive povas uzi la modelojn.

Tuj poste, ni improvizu nian ensalutan vidon por redirekti al malĉefa aŭtentiga vido. En uzantoj/views.py, forigu la ensalutan funkcion kaj redirektu al la URL, kiun ni ĵus generis en la uzantaj modeloj.

# ... Importoj
        if user and user.profile.can_login < timezone.now(): # Notu, ke ni nun kontrolas ĉu la uzanto povas ensaluti
            # Forigu la funkcion AUTH_LOGIN, kiu estis ĉi tie
                return redirect(user.profile.create_auth_url()) # Notu, ke ni redirektas al nova URL ĉi tie
            else: # Se la uzanto ne uzas plur-faktan aŭtentikigon, nur ensalutu ilin.
        else: # Se la ensaluto ne sukcesis,
            user = User.objects.filter(username=username).first() # Jen la parto, kie ni ĝisdatigas la profilon de la uzantoj
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Do ili ne povas ensaluti denove dum kelkaj sekundoj

Do ĉi tio estas sufiĉe simpla, ni nun havas manieron redirekti al la du faktoro -aŭtentiga vido kiam ni kreas ĝin. Ni ankaŭ havas falon en la okazo ke la uzanto ne aldonis telefonnumeron. Ni aldonos bazan vidon por aldoni telefonnumeron baldaŭ kaj ensaluti per tekstmesaĝo baldaŭ.

Unue ni bezonas facilan manieron sendi tekstmesaĝon de nia kodo. Por fari tion, ni povas elekti el kelkaj APIoj, sed la plej facila laŭ mi estas Twilio. Ili ankaŭ ofertas bonajn prezojn por pli malgrandaj projektoj, same kiel pograndajn rabatojn. Kreu konton ĉe Twilio.com, plenigu iujn detalojn pri via projekto, aĉetu telefonnumeron kaj kopiu viajn API -klavojn al viaj agordoj.py. Poste, aldonu ĉi tiun kodon sub nova dosiero, uzantoj/sms.py.

nano users/sms.py
# Importu ĉiujn necesajn pakaĵojn
# Ĉi tiu kodo sendas la tekston per Twilio
# Helpa funkcio por akiri numeron kun tiom da ciferoj
# Sendu la tekston por kontroli la uzanton
# Sendu al uzanto ajnan tekston kun ĉi tiu funkcio
# Validigu la kodon kun ĉi tiu funkcio
# Validigi la tempon

Nepre ŝanĝu viajn agordojn taŭge, aldonante ĉi tiujn liniojn per viaj ŝlosiloj:

# Certigu, ke vi kopiu ĉi tiujn de via Twilio -panelo
AUTH_VALID_MINUTES = 3 # La nombro de minutoj la TFA -paĝo estas aktiva unufoje instantigita

Unue, ni bezonos formojn por niaj du faktoraj aŭtentikaj vidpunktoj. Redaktado de Uzantoj/Formoj.py, aldonu la jenan kodon.

# ... Importoj
# Formularo por enigi nian telefonnumeron
# Formo por aŭtentikigi

Tuj poste, ni kreu la vidojn en uzantoj/views.py

# ... Importoj

Ni ankaŭ bezonos ŝablonojn por ambaŭ ĉi tiuj vidpunktoj. Ni aldonu unue la MFA -ŝablonon.

nano users/templates/users/mfa.html

Aldonu ĉi tiun HTML -kodon al la ŝablono

Ĉi tio estas sufiĉe mem klariga. La formularo sendas aŭ kodon aŭ malplenan kodon, kaj vi rimarkos en la vido, ke ni sendas la kodon se ni ricevas malplenan kodon. Tiam ni nur havas du sendi butonojn, kaj tiamaniere ni povas sendi la kodon per ambaŭ butonoj. Tuj poste, ni aldonos simplan formon por aldoni telefonnumeron.

nano users/templates/users/mfa_onboarding.html

Aldonu la jenan html:

Ĉi tiu formularo estas multe pli simpla, ĝi nur igas la telefonan numeron, kiun ni kreis kaj lasas la uzanton aldoni telefonnumeron.

Ĉi tio aspektas vere bone! Tiel longe kiel ĉio estas ĝuste agordita, ni devus povi sendi mesaĝojn kaj ensaluti la uzanton per sia telefonnumero tuj kiam ni aldonos la URL -ŝablonojn. La lasta afero, kiun ni devas agordi, estas profilo -vido, por ke ni povu certigi, ke la uzanto povas ŝanĝi sian telefonnumeron sen esti ensalutinta. Ankaŭ ni volos aldoni opcion "Ĉesi por ĉesi", por ke la uzanto povu teksti "ĉesi" por elekti estontajn tekstajn mesaĝojn.

Ni aldonu profilan vidon al la uzantoj/views.py. Ĉi tiu vido ĝisdatigos la bio, retpoŝto, uzantnomo kaj telefonnumero de la uzanto, kaj ankaŭ permesos al ni ebligi aŭtentikigon de multi -faktoro. Unue, ni bezonos du pliajn formojn en uzantoj/formoj.py

# ... Importoj

Tuj poste, ni povas krei vidon uzi ambaŭ ĉi tiujn formojn. Redaktu uzantojn/views.py kaj aldonu la vidon.

# Aldonu ĉi tiujn importojn

Ni ankaŭ bezonos ŝablonon por ĉi tiu vido.

nano users/templates/users/profile.html

Vi rimarkos, ke ĉi tio estas sufiĉe simpla formo, sed havas iom da JavaScript en ĝi, kiu aŭtomate afiŝas la enhavon de la formo, kiel ili estas ĝisdatigitaj. Ĉi tio utilas, do vi kapablas fari redaktojn sen devi premi submeti ĉiun fojon.

Tuj poste, ni bezonas URLojn reprezentantajn ĉiujn ĉi tiujn vidpunktojn en la uzantoj URL -patteroj. Redaktu uzantojn/urls.py kaj aldonu ĉi tiun kodon:

# ... Antaŭa kodo, importado
# ... URL -ŝablonoj, kiujn ni antaŭe eniris, aldonu la sekvajn tri liniojn

Nun estas bona tempo por testi nian projekton. Sed unue ni kuru alian sekurkopion.

backup

Kaj kuru la servilon. Antaŭ ol ni disfaldiĝas al Linuksa servilo, estas bona ideo ebligi du faktoran aŭtentikigon en la konto. Ni faros ĉi tion irante al nia profilo URL,/Uzantoj/Profilo/, kaj kontrolante la skatolon por ebligi aŭtentikigon post enmetado de nia telefona numero, kaj poste sendado de la formularo.

python manage.py runserver localhost:8000

Vizitu la retpaĝon irante al via retumilo, mi uzas Google Chrome en ĉi tiu ekzemplo, kaj enirante la URL https: // localhost: 8000/Accounts/Profile/

Vi povos ensaluti se necese kaj ebligi du faktorajn aŭtentikojn.

Ĉi tiu projekto bezonas servilon por funkcii, por ke ĝi vere povu sendi poŝton. Sed unue ni bezonas manieron vidi erarojn. Vi rimarkos, ke se vi funkciigas la servilon en elpuriga reĝimo, kun agordoj.Debug egala al vera, la servilo montras erarojn aŭtomate. Por montri erarojn sen uzi elpurigan reĝimon, kiu estas nesekura sur produktada servilo, ni devas aldoni vidon por ĝi. La plej gravaj eraroj, kiujn ni bezonas por povi trakti, estas:

Eraro 500 - Problemo kun nia kodo Eraro 404 - Paĝo ne trovita (rompita URL) Eraro 403 - Permeso rifuzita eraro

Ni aldonu novan programon por trakti ĉi tiujn erarojn, nomataj eraroj.

python manage.py startapp errors

Aldonu ĉi tion al la agordoj.

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

Ĉi tio estas ĉio, kion ni bezonas krom eraraj vidpunktoj, ŝablonoj kaj iom da mezaro. Ni difinu tiujn tiel:

# Kreu viajn vidpunktojn ĉi tie.

Tuj poste, ni difinu la meznivelon por trakti ĉi tiujn erarojn. Ni faros ĉi tion unue aldonante al Middleware_Classes en Settings.py, kun la nomo de nia meza programaro.

    # ... Antaŭa Middleware

Tuj poste, ni aldonu la mezan programon.

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

Ni aldonas funkcion por akiri la nunan escepton per uzado de fadeno, kiu helpas nin spuri iujn ajn erarojn en nia kodo. Koncerne ŝablonojn, ni nur bezonas unu, ĉar ni dinamike difinas la titolon en la vido. La ŝablono nur bezonas redoni la titolon kaj "spuri", nia erara spuro de la kunteksto.

nano errors/templates/errors/error.html

Ĉi tio estas nia plej simpla ŝablono, sed tiel facile estas vidi la erarojn en nia projekto. Tuj poste, ni malebligu elpurigon en agordoj.

nano app/settings.py

Trovu ĉi tiun linion, kie ĝi estas agordita al vera, kaj ŝanĝu ĝin al falsa

DEBUG = False

Antaŭen kaj rezervu la programon nun. Ni pretas disfaldi al fora Linuksa servilo kaj daŭre aldoni funkciojn de tie.

sudo backup

Antaŭ ol ni afiŝu ĉi tiun kodon al servilo, ni konsideru, ke eble ekzistas iuj problemoj kun la kodo. Depende de la kazo, retejoj, kiuj akceptas informojn afiŝitajn al ili, havos problemojn pri afiŝado de spamo kaj malfacileco de forigo de la spamo. Ĉi tio ne devas okazi tuj, sed se ĝi okazas, ni poste ekzamenos kiel aŭtomate moderigi spamadon sur la retejo kaj pli malfacilas robotoj aliri la retejon, kune kun kiel malaktivigi uzantajn kontojn kaj kontroli la identecon de uzanto per skanado de ilia ID aŭ biometria skanado, kiel fingrospuro aŭ vizaĝa rekono.

Rigardante la ekzemplon de aŭtentiga plur -faktoro, kiun ni ekzamenis, en produktado, aferoj povas esti malsamaj. Rimarku kiel ni estas taksaj limigaj ensalutoj kaj eksvalidiĝantaj tokens. Se robotoj aliras retejon, du faktoraj aŭtentikoj povas esti pli malfacilaj, ĉar ili povas eniri kodojn samtempe, kiam la uzanto estas. Por kontraŭbatali tion, ni uzu modelon en la uzantaj modeloj, deklarante kiel ni interagas kun la retejo kiam ni aŭtentikigas uzante plurfaktan aŭtentikigon kun telefonnumero. Ni ankaŭ aldonos eblon por aŭtentigi per retpoŝto. Komencu redaktante la uzantajn modelojn kun Nano.

nano users/models.py

Jen kiel la modelo, kiun ni aldonas, devas aspekti. Ni ne bezonas iujn ajn metodojn, nur variablojn por stoki identigilon, la uzanton, la horloĝon, finiĝon, longecon kaj provojn kontraŭ iu ajn faktoro -aŭtentikigo (kodo kiel 123456 sendita al telefono aŭ retpoŝto).

# Baza tokeno uzata por ensaluti en la retejo

Ni aldonu ankaŭ privilegion al nia uzanto, kaj ni agordos ĝin permane por nun, antaŭ ol mi migri al aliĝado de privilegiitaj uzantoj aŭtomate. En la uzantaj modeloj, aldonu ĉi tiun linion en la profilo:

    vendor = models.BooleanField(default=False)

Kiel ĉe iuj ajn ŝanĝoj al la datumbazo, ni devas fari migradojn kaj migri la datumbazon kiam ajn ni redaktas modelon.py -dosiero en Django. Memoru, por fari tion ni uzas fonton unue (se ĝi ne estis uzata jam de kiam la fina stacio estis malfermita) kaj tiam Python Manage.py por fari la migradojn kaj migri.

cd project-directory-you-named # (se necesas)

Nuntempe vi povas aliĝi al iuj kontoj, kiujn vi kreis kiel vendistoj per la ŝelo.

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

Nun ni evoluu nian multfaktan aŭtentikan vidon por uzi ĉi tiun tokenon. Unue, ni bezonas modifi niajn MFA -helpajn utilecojn. Uzante nano,

nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken

account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER

def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text + ' Text STOP to cancel.')
    except:
        messages.warning(get_current_request(), 'There was an error sending the message.')
        print(traceback.format_exc())

def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

def send_verification_text(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))

def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# Aŭtentigas la uzanton per sia retpoŝto aŭ telefonnumero
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtri la tokenon per la valoro pasita en la URL (UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Se ĉi tiu kunsido ne kreiĝis, kreu ĝin
    user = User.objects.filter(id=token.user.id).first() # Akiru la uzanton de la tokeno
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Se ili jam estas aŭtentikigitaj, ensalutu ilin
    if not user: raise PermissionDenied() # Nei se neniu uzanto estis trovita
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Kontrolu la Aŭtovojon
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ensalutu la uzanton se ili ne estas jam ensalutitaj
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Starigu eksvalidiĝon pri ilia plurfakta aŭtentikigo
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Redirektu la uzanton al la sekva paĝo
    if not user.profile.mfa_enabled: # Kontrolu ĉu MFA estas enŝaltita
        if not check_verification_time(user, token): # Kontrolu la tempon
            user.profile.mfa_enabled = False # Malplenigu la telefonnumeron
            user.profile.enable_two_factor_authentication = True # Ebligu MFA
            user.profile.phone_number = '+1' # Malebligu la telefonnumeron
            user.profile.save() # Konservu la profilon
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ensalutu la uzanton se ilia MFA ne estas enŝaltita
    if request.method == 'POST' and not fraud_detect(request, True): # Se la peto estas poŝta peto
        form = TfaForm(request.POST) # Instanigu la formon
        code = str(form.data.get('code', None)) # Akiru la kodon
        if code and code != '' and code != None: # Certigu, ke ĝi ne estas malplena
            token_validated = user.profile.check_auth_token(usertoken) # Kontrolu la Aŭtovojon
            is_verified = check_verification_code(user, token, code) # Kontrolu la kodon
            if token_validated: # Se ĉio
                if is_verified: # Estas en ordo
                    user.profile.mfa_enabled = True # Ebligu MFA (se ne jam ebligita)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ensalutu la uzanton
                    for key, value in request.GET.items(): # Konstruu QueryString por la sekva parametro (se ekzistas)
                        return HttpResponseRedirect(next) # Redirekti
            elif not token_validated: # Se la tokeno ne validas
            if p.mfa_attempts > 3: # Se estus tro multaj provoj
            if form.data.get('send_email', False): # Sendu la retpoŝton (aŭ tekston)
    # Redonu la formularon (por akiri petojn)

Kiam ni aldonas ĉi tiun kodon, certigu importi la funkcion por sendi retpoŝton. Sur la supro de la dosiero, la uzanto vidas (kun aliaj importadoj), aldonu

from .mfa import send_verification_email as send_mfa_verification_email

Nun ni devas skribi tiun funkcion antaŭ ol io ajn funkcios. Ĝi devas etendi nian sendi retpoŝtan funkcion, kaj simple sendi retpoŝton al la uzanto kun la kontrolkodo.

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

Do ĉio funkcias bonege, nun ni havas multfaktan aŭtentikan sistemon, kiu dependas de telefona numero aŭ retpoŝto por ensaluti. Sed ni ankaŭ bezonas manieron forigi, aŭ almenaŭ kaŝi uzantojn, kiuj ne kunlaboras kun niaj terminoj. Ĉi tiuj povus esti spammers, robotoj aŭ iu ajn, kiu ne signifas bone por nia laboro. Rigardu vidon, kiun mi havas por monitori uzantojn en mia retejo:

# Importoj
from .tests import is_superuser_or_vendor # Ni bezonos krei ĉi tiun teston
    # Akiru liston de uzantoj
    return render(request, 'users/users.html', { # Redonu uzantojn en ŝablono

Notu, ke ĉi tiu kodo uzas teston, ni devos deklari ĉi tiun teston en dosiero tests.py kaj importi ĝin. Redaktado de Uzantoj/Tests.py, ni kreu la teston.

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

Ĉi tio estas ligita kun la uzantoj/uzantoj.html -ŝablono, kiu aspektas tiel:

Notu, ke la ŝablono inkluzivas alian ŝablonon, uzantoj/uzanto.html. Kiam vi uzas ŝablonon, kiu havas subtemplon kaj ne uzante etendojn, ĝi estas bona ideo aldoni substrekadon () antaŭ la nomo de la dosiero por etendi, por distingi ŝablonojn.

Notu, ke ĉi tio estas multe da jinja, vi eble ne havas ĉiujn ĉi tiujn variablojn difinitajn. Sed jen kiel aspektas mia kodo.

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

Ni ankaŭ bezonas alian subtempan, toggle_active.html. Ĉi tiu ŝablono devas esti formo, kiu permesas al ni ŝanĝi, ĉu uzanto estas aktiva.

Ni ankaŭ bezonos aldoni vidon por ŝanĝi uzantan agadon kaj taŭgajn URL -ŝablonojn. Dum ni estas ĉe ĝi, ni aldonu vidon por forigi uzanton se ni bezonas tion.

# Importoj
    success_url = '/' # La redirekto pri sukcesa URL
    def test_func(self): # Testu ĉu uzanto estas superusa kaj havas permeson forigi

Kvankam ĉi tio estas praktika kiam necese, forigi uzanton ne devas esti necesa plejofte, ni povas simple ŝanĝi la videblecon de uzantoj, kiuj vizitas la retejon, se ni bezonas eksigi ilin.

La URL -ŝablonoj, kiujn ni aldonis, aspektas tiel. Kun nano, redaktu uzantojn/urls.py kaj aldonu ĉi tiujn liniojn:

nano users/urls.py

La linioj devas iri en la listo de vojoj en la uzantaj vidpunktoj, antaŭ la fino "]" sed post la komenco "[".

# ...
# ...

Nun, certigu rezervi la retejon por ke vi povu elŝuti ĝin en la retservilo, pri kiu ni daŭre laboros. De la komandlinio,

sudo backup

Nun nia retejo estas rezervita.

Do nun ni havas kelkajn pli utilajn funkciojn. Sed kio pri la granda bildo ĉi tie? Ĉi tiu kodo ankoraŭ ne estas alirebla de la interreto, ni ankoraŭ ne havas poŝtan servilon, kaj ni devas pligrandigi nian aplikon por inkluzivi ampleksan kontrolan procezon kaj ankaŭ glatajn aranĝojn por helpi nin esplori la retejon, kune kun sekuraj protokoloj por aŭtentikigi privilegiitajn uzantojn.

Ni atingos ĉion ĉi. La plej grava afero por nun estos nur ricevi ĉi tiun kodon interrete, kion ni povas fari per nur kelkaj linioj de bash sur Ubuntu -servilo. Vi tamen bezonos lui servilon por ĉi tio, krom se vi havas servilon hejme kaj komercan interretan abonon, kiu ebligas al vi malfermi havenojn. Mi persone administras mian retejon en HP Z440, kiu estas instalita en mia apartamento, sed kutime estas multe pli malmultekoste por bazaj bezonoj lui virtualan privatan servilon (VPS).

Memoru, ke la kodo, kiun ni nun funkcias, estas relative maldika, ĝi devos esti konservita kaj plibonigita antaŭ ol ni pretas uzi tion, kion ni devas konstrui produkton. Certigu, ke vi zorgu pri tio, kion vi faras per interreto, certigu, ĉu vi disfaldas ĉi tiun retejon publike al la retejo en Linuksa servilo, vi havas planon bloki nedeziratajn interagojn kun via retejo. Ĉi tio probable ne estos problemo komence, sed ni esploros diversajn solvojn por kontraŭbatali ĉi tion, inkluzive de maŝina lernado, artefarita inteligenteco kaj komputila vidado. Kiam ĝi fariĝas problemo, rigardu plu en ĉi tiu teksto por solvo.

Koncerne lui VPS, estas multaj lokoj, kiujn vi povas iri. Google Cloud havas VPS -servilojn, Ionos, Kamatera, Amazon AWS, kaj pli da provizantoj ofertas nubajn servilajn solvojn, kiuj konvenos al niaj bezonoj.

Vi devos klaki tra iliaj formoj kaj elekti planon por komenci. Vi povas iri kun baza plano kun iu ajn provizanto, sed certigu, ke la provizanto permesas malfermi havenajn poŝtajn servilajn havenojn por sendi retpoŝton (ĉi tio devas esti haveno 587 kaj haveno 25), iuj provizantoj blokas ĉi tiujn havenojn. Ĝis nun mi spertis la plej bonan sperton kun Ionos kaj Kamatera, ambaŭ permesos al mi sendi senliman retpoŝton kaj ilia prezo estas sufiĉe malmultekosta.

Vi konektos al via nova servilo per protokolo nomata SSH aŭ Secure Shell, kiu ebligas al vi remotamente kun la servilo ekzakte kiel via persona komputilo, de via persona komputilo. Kiam vi agordas la servilon, la gastiganta provizanto verŝajne petos vin aldoni SSH -ŝlosilon, aŭ ili donos al vi uzantnomon kaj pasvorton. La SSH -ŝlosilo estas kiel vi ensalutos en la servilo de la komandlinio por redakti la kodon. Uzu la subajn SSH-Keygen-opciojn por generi SSH-ŝlosilon.

ssh-keygen

Konservu la dosieron kaj anstataŭigu ĝin, se vi bezonas, estas bone rotacii viajn SSH -klavojn se vi ne jam faris. Nun vi povas uzi la jenan komandon por vidi vian SSH -ŝlosilon. Vi volos kopii ĝin al via fora servilo, por ke vi povu uzi ĝin por aŭtentigi.

cat ~/.ssh/id_rsa.pub

Se vi ne povis vidi SSH-ŝlosilon dum tajpado de tiu komando (longa ĉeno de ciferoj kaj literoj komenciĝantaj per "SSH-RSA AAA"), provu generi RSA-ŝlosilon (ili estas pli sekuraj, do mi konsilas uzi ilin.) La sekva kodo generos 4096-bitan RSA SSH-ŝlosilon.

ssh-keygen -t rsa -b 4096

Kreu VPS funkciantan Ubuntu, tamen vi planas fari ĉi tion. Post kiam vi kreis VPS alklakante la formojn en la retejo de la provizantoj (Kamatera.com, Ionos.com aŭ similaj), vi volas ensaluti. Por fari tion, uzu la komandon SSH kun via IP -adreso (la adreso, kiu aspektas kiel xx.xx.xx.xx). Vi ankaŭ bezonos esti sentema al la defaŭlta uzantnomo en la servilo, kiun ni kreis, ekzemple Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Vi eble petos pasvorton, se oni petas pasvorton, enigu ĝin. Ni ne uzos la defaŭltan uzantnomon, do ni komencu kreante novan uzanton kaj aldonante SSH -ŝlosilon al ilia konto.

Ni komencu aldonante novan SSHD_CONFIG -dosieron, kiu diras al la servilo kiel uzi SSH.

nano sshd_config
# Jen la SSHD-Servila Sistemo-Agordo-dosiero.  Vidu
# sshd_config (5) por pliaj informoj.
# Ĉi tiu sshd estis kompilita kun pado =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/ludoj
# La strategio uzata por opcioj en la defaŭlta SSHD_CONFIG sendita kun
# OpenSSH estas precizigi opciojn kun ilia defaŭlta valoro kie
# ebla, sed lasu ilin komentitaj.  Nekomprenitaj opcioj superregas la
# defaŭlta valoro.
# Haveno 22
# Adresfamil
# Aŭskulti 0.0.0.0
# Aŭskulti ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Ciferoj kaj ŝlosado
# RekeyLimit Defaŭlta Neniu
# Registrado
# Syslogfacility auth
# Loglevel -informoj
# Aŭtentigo:
# Loginracetime 2m
# Permitrootlogin malpermesas-pasvorton
# Strictmodoj Jes
# Maxauthtres 6
# MaxSessions 10
# Atendu .ssh/rajtigite_keys2 esti malatentata defaŭlte estonte.
# Rajtigita PrincipalsFile Neniu
# RajtigitaKeysCommand neniu
# RajtigitaKeysCommanduser neniu
# Por ke ĉi tio funkciu vi ankaŭ bezonos gastigajn ŝlosilojn en/etc/ssh/ssh_konataj_hosts
# Hostbasedauthentication Ne
# Ŝanĝu al Jes, se vi ne fidas ~/.ssh/konataj_hosts por
# Hostbasedauthentication
# Ignori nekonatahosts ne
# Ne legu la dosierojn ~/.rhosts kaj ~/.shosts
# IgnoreRhosts Jes
# Por malebligi tunelitajn klarajn tekstajn pasvortojn, ŝanĝu al neniu ĉi tie!
# PermetmptyPasswords Ne
# Ŝanĝi al jes por ebligi defiajn respondajn pasvortojn (gardu problemojn kun
# iuj PAM -moduloj kaj fadenoj)
# Kerberos -opcioj
# Kerberosauthentication ne
# Kerberosorlocalpasswd jes
# KerberosticketCleanup Jes
# Kerberosgetafstoken ne
# GSSAPI -Elektoj
# Gssapiauthentication ne
# Gssapicleanupcredentials jes
# Gssapistrictacceptorcheck jes
# GSSAPIKEYEXCHANGE NE
# Agordu ĉi tion al 'Jes' por ebligi PAM -aŭtentikigon, konton -pretigon,
# kaj sesia prilaborado. Se ĉi tio estas enŝaltita, Pam -aŭtentikigo faros
# estu permesita tra la kbdinteractiveAuthentication kaj
# PasvortoAutentikigo.  Depende de via PAM -agordo,
# Pam -aŭtentikigo per kbdinteractiveAuthentication May Bypass
# la agordo de "PermitrootLogin sen-pasvorto".
# Se vi nur volas, ke la PAM -konto kaj sesiaj ĉekoj funkciu sen
# PAM -aŭtentikigo, tiam ebligu ĉi tion, sed agordu pasvorton
# kaj kbdinteractiveAuthentication al 'ne'.
# PermesuAgentforwarding Jes
# Permesitcpforwarding jes
# Gatewayports Ne
# X11displayoffset 10
# X11uzocalhost jes
# Permesita Jes
# Printlastlog jes
# Tcpkeepalive jes
# Permesiĝado ne
# Kunpremo prokrastita
# Klientaliveinterval 0
# Klientalivecountmax 3
# Uzitaj ne
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Permesita ne
# ChrootDirectory neniu
# Versionaddendum Neniu
# Neniu defaŭlta rubanda vojo
# Permesu al kliento pasigi lokajn mediajn variablojn
# Nuligi defaŭlton de neniuj subsistemoj
# Ekzemplo de superregaj agordoj laŭ-uzanto
# Kongrui kun uzanto
# X11forwarding ne
# Permesitcpforward ne
# Permesi ne
# ForceCommand CVS -Servilo

Memoru, Ctrl+X kaj Y por konservi la dosieron. Tuj poste, ni skribu bazan skripton nomatan Initialize (ĉio en la defaŭlta hejma dosierujo de nia uzanto).

nano initialize

Aldonu ĉi tiujn liniojn al la dosiero, anstataŭiganteKun via SSH -ŝlosilo vi trovis per kato. (.ssh/id_rsa.pub)

# !/bin/bash

Por promeni vin tra ĉi tiu dosiero, ni komencu linion post linio. La unua linio diras al la kompililo, ke ĉi tio estas bash -skripto. Poste ni instalas dependojn, kopiante SSHD_CONFIG al la ĝusta dosierujo, rekomencante SSH, generante SSH -klavojn por radiko, aldonante la "teamon de la uzanto" (vi povas elekti nomon, kiun vi ŝatas por ĉi tio, uzu la komandon AddUser kun ilia nomo kaj malebligis pasvorton por nun). Ni ankaŭ aldonas teamon al la grupo Sudo, generas ilian SSH -ŝlosilon, aldonas nian ŝlosilon al rajtigitaj ŝlosiloj kaj ilia ankaŭ, kaj presas ilian ŝlosilon. Ĉi tiu nova uzanto estos kiel ni ensalutas la retejon.

En nova fina stacio, antaŭeniru kaj malfermu la servilon denove.

ssh team@XX.XX.XX.XX

Ĉi -foje vi ne bezonas pasvorton, estante kiel vi havas SSH -ŝlosilon. Ni ankaŭ malebligis ensaluti per pasvorto por konservi la retejon pli sekura.

Nun ĉi tiu servilo ekas tute malplena sen informoj pri ĝi. Ni komencu per klonado de nia projekto de Git por ke ni povu elŝuti kaj funkciigi ĝin sur la fora maŝino. Sur la fora servilo konektita per SSH, unue presu vian SSH -klavon:

cat ~/.ssh/id_rsa.pub

Tuj poste, almetu ĉi tiun ŝlosilon en la agordojn de Git, kiel ni antaŭe por agordi nian Git -deponejon. Ni nun povas kloni nian projekton rekte al la servilo. Certigu, ke vi subtenis la projekton surloke unue, do ĝi estas sur la Git -servilo por elŝuti.

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

Perfekta. Nun ĉiuj dosieroj estas ĉi tie. Ni povas vidi ilin per LS

ls

Nun ni komencu starigi la servilon. Unue, kopiu vian projektan dosierujon en simplan, memorindan nomon, kiun ni uzos por la projekto.

cp -r yourproject whatyoucalledit

Kie "Whatyoucalledit" estas la nova nomo de via projekto. Tuj poste, ni bezonos konstrui bazan utilecon por agordi la servilon. Ni konservos ĉi tiun utilecon kaj uzos ĝin estonte. Por konstrui ĉi tiun utilecon, ni kreu binaran uzanton por difini kiel ni redaktas skripton. Uzante bash, redakti/usr/bin/ascript

sudo nano /usr/bin/ascript

Certigu, ke vi uzu Sudo tie, por ke vi havu permesojn por redakti la dosieron. En la dosiero, aldonu ĉi tiujn liniojn:

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

Memoru, ke ĉi tiu skripto prenas argumenton, la skripto -nomo, kiel $ 1. Unue ĝi kontrolas ĉu la dosiero ekzistas, aŭ alie kreas ĝin, aldonas la unuan linion por deklari la skripton estas bash, ŝanĝas siajn permesojn, redaktas ĝin kaj aldonas sian nomon al /etc /ascripts, kiu permesas al ni stoki la nomojn de la skriptoj, kiujn ni kreas. Se la dosiero jam ekzistas, simple ŝanĝu permesojn kaj redaktu ĝin. Konservu la dosieron, kaj poste ni ŝanĝos ĝiajn permesojn. Tiel longe kiel ni uzas ĉi tiun skripton, ni ne devos fari tion denove.

sudo chmod a+x /usr/bin/ascript

Perfekta. Nun ni kreu skripton nomatan agordo. Unue, ne superforti vin, sed rigardu kiel aspektas mia agorda skripto. Ni trairos, kiel aspektas ĉi tiu skripto en via projekto, vi ne bezonos ĉion en mia skripto por komenci.

# !/bin/bash
# Sudo Chmod A+X -Skriptoj/UzantoSetup
# ./scripts/usersetup
# ssh-keygen
# Projekta Gvidlibro
# Registraj Komandoj
# Nano -agordo
# Git -agordo
# Ĝisdatigu kaj instalu
# Ebligu Clamav Antivirus
# Agordu Hostname
# Agordu Postgres
# Agordo de datumbazo
# Malŝalti Iptables
# Instalu Bitdefender
# Agordo Postfikso
# Kreu Dirs
# Agordo Virtualenv
# Akiru kaj konstruu dependecojn
# Agordu Firewall -regulojn
# Instalu Pypi -Dependecojn
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Instalu OpenCV-Python == 4.5.5.64
# PIP Instalu OpenCV-Kontrib-Python == 4.5.5.64
# Instalu Certbot
# Kuru certbot
# Reŝargi poŝtan servilon
# Kopiu certojn
# sudo cp /etc/letsencrypt/live/femembabe.com/privkey.pem PrivKey.pem
# sudo cp /etc/letsencrypt/live/femembabe.com/cert.pem cert.pem
# Patch Venv
# Agordu Uzantajn Agordojn
# Agordi Permesojn
# Sudo Chown -r Teamo: Uzantoj/Var/Run/
# sudo chown radiko: radiko/run/sudo/ts -r
# Sudo Chmod 664 DB.SQLITE3
# Sudo Chown www-Data: Uzantoj db.sqlite3
# Kopiu agordi kaj agordi permesojn
# Agorda datumbazo
# Injekti PAM -agordon kaj forigi misfunkcian SSH -agordon
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profilo
# Kopiu bin -skriptojn kaj starigis permesojn
# Reŝargi kaj ebligi servojn
# Ebligu Apache -Modulojn
# sudo a2dismod mpm_event
# Sudo A2Dismod MPM_WORKER
# sudo a2enmod mpm_prefork
# Malŝalti Defaŭltan Retejon
# Ebligu nian retejon
# Reŝargi Daemon kaj rekomenci Apache, Postfikson kaj OpenDkim
# Agordi Permesojn
# Interŝanĝa agordo
# INIT -apudskriba motoro
# Agordo git
# Montru IPv6 kaj OpenDkim por domajna agordo
# Agordo Kompletigita

Tio estas multe da aranĝo! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs certificates and sets up La servilo, instalas agordon, komencas kaj ebligas la severon, asignas interŝanĝon, fiksas permesojn kaj presas la IP, IPv6 -adreson kaj OpenDKIM -ŝlosilon. Sufiĉe simpla, sed ĝi aspektas kiel multe da kodo. Ni ne bezonos multon pri tio, ĉar ni ne havas la dependecojn, ni ne uzas celerion, celeriobaron aŭ Daphne, sed ni instalos iujn el ili ĉiuokaze por komenci. Rimarku, ke ĉi tiu kodo havas domajnon deklaritan plurfoje.

Ni ankaŭ bezonos aĉeti domajnan nomon (kiu estas malgranda jara kotizo). Mi rekomendas Squarespace por aĉeti domajnon, ilia aranĝo estas intuicia kaj facile uzebla. Vi povas aĉeti ajnan domajnon laŭ via elekto, sed mi uzas la domajnan femmebabe.com en ĉi tiu ekzemplo. Post kiam vi aĉetis domajnon, direktu vin al la agordo -panelo de Squarespace DNS kaj aldonu rekordon montrantan vian domajnon al la servilo per IP -adreso. Ĝi devas aspekti tiel:

@ A xx.xx.xx.xx

Kun la telefonisto @ kiel la gastiganto, signifante ĉiujn subdomajnojn sub ĉi tiu domajno kaj la radika domajno ĉiuj redirektas al la servilo. Estas pli da registroj por deklari, sed ni povas pluiri al ĉi tiuj, kiam ni pretas sendi poŝton. Memoru, eble daŭros plurajn tagojn antaŭ ol vi sukcesos sendi poŝton de la servilo. La DNS -registroj, kiujn ni starigas, bezonos tempon por disvastigi.

Ĉiuokaze, la sola rekordo, kiun ni devas komenci, estas rekordo. Do nun ni povas plenigi la suban skripton laŭ nia projekto kaj funkciigi ĝin.

Ni komencu per pli malgranda aranĝa skripto por simple instali tion, kion ni bezonas por baza progreso. Ni ankoraŭ ne uzos tiom da dependecoj aŭ PostgreSQL, ni simple funkciigos bazan HTTP -servilon kaj zorgos pri atestado de ĝi kiam tio finiĝos. Memoru, por akiri HTTPS -atestilon kaj funkciigi la servilon sekure, ni bezonos aĉeti domajnon kune kun Rent A -servilo. Por nun, anstataŭigu "teamon" en ĉi tiu dosiero kun la nomo de via uzanto, "Dir" kun la dosierujo de via projekto, kaj provizu vian retpoŝton kaj domajnon en la etikedoj <>.

Aldone, antaŭ ol ni aranĝos ĉi tiun kodon, ni devas ŝanĝi la agordojn al la fajrobrigadilo, kiun la gastiganta provizanto subtenas, se ekzistas. Kutime ĉi tio estas en la langeto 'Retoj' de via gastiga provizanto, aŭ se vi mem gastigas, ĝi estas en la sekcio 'havena plusendado' de via enkursigilo. Vi ankaŭ volos starigi statikan IP per via enkursigilo kun la adreso de via servila maŝino, se vi uzas mem -gastigadon. Vi bezonos malfermi la jenajn havenojn por legi/skribi aliron.

22 (SSH) 25 (poŝto) 587 (poŝto) 110 (Poŝta Kliento) 80 (http) 443 (https)

# !/bin/bash
# Registraj Komandoj
# Nano -agordo
# Git -agordo
# Ĝisdatigu kaj instalu
# Ebligu Clamav Antivirus
# Agordu Hostname
# Agordo de datumbazo
# Malŝalti Iptables
# Agordo Virtualenv
# Instalu Certbot
# Kuru certbot
# Agordu Uzantajn Agordojn
# Agordi Permesojn
# Sudo Chown -r Teamo: Uzantoj/Var/Run/
# sudo chown radiko: radiko/run/sudo/ts -r
# Reŝargi kaj ebligi servojn
# Ebligu Apache -Modulojn
# Reŝargi Daemon kaj rekomenci Apache, Postfikson kaj OpenDkim
# Montru IPv6 kaj OpenDkim por domajna agordo

Antaŭ ol funkcii ĉi tiun kodon, certigu, ke la domajno, kiun vi aĉetis, estas konektita al la servilo. Por fari tion, malfermu terminalon sur via loka maŝino, kaj ruli ĉi tiun komandon per via domajno:

ping femmebabe.com # Enmetu vian domajnon ĉi tie, post ping

Se ĉio aspektas bone kaj la servilo sendas respondojn, ni pretas ruli la skripton kaj instali pakaĵojn kaj komenci, ebligi kaj atesti nian Apache -servilon.

Ĉi tio ne estas la tuta aranĝo necesa por agordi postfikson, ni rigardos tiun agordon pli poste. Por nun, kuru ĉi tiun agordan kodon kaj ĝi devas daŭri kelkajn minutojn por instali kaj atesti vian servilon. Denove, certigu anstataŭigi nomon, retpoŝton kaj domajnan nomon en la skripto laŭ la nomo, kiun vi aĉetis.

Nun, ke la servilo estas provizita, vi povas iri al la URL en iu ajn retumilo kaj kontroli por certigi, ke la servilo funkcias HTTPS. Se ne, provu atendi iom da tempo por ke la DNS -registroj kaptu kaj tiam kuru la jenan komandon por reprovi Certbot -Atestilon:

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

Tiel longe kiel vi agordis ĉion ĝuste, vi devus povi aliri la defaŭltan paĝon de Apache nur por scii, ke via kodo funkcias kaj montras vivan retpaĝon. Tuj poste, ni redaktu la agordojn.py por ŝanĝi nian defaŭltan elpurigan reĝimon al produktado. Ni ankaŭ agordos la domajnon en la agordoj, same kiel internajn IP -ojn.

nano yourproject/settings.py

En la agordoj, ŝanĝu/aldonu ĉi tiujn liniojn.

# Reteja agordo

Nun ni bezonos agordi Apache2. Ni redaktu la agordan dosieron, kiun ni disfaldos per ĉi tiu linio:

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

Ĉi tiu agorddosiero devas havi nian domajnan nomon en ĝi, kaj la nomon de la uzanto kaj projekto. Mi uzas la domajnan nomon femmebabe.com, la uzantnomon, kaj la projektan nomon femmebabe.

ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80> 
	Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Alias /static /home/team/femmebabe/static
	<Directory /home/team/femmebabe/static>
		Require all granted
	</Directory>

Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>

	<Directory /home/team/femmebabe/femmebabe>
		<Files wsgi.py>
			Require all granted
		</Files>
	</Directory>

	WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
	WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
	WSGIProcessGroup femmebabe
	WSGIApplicationGroup %{GLOBAL}
	
	<Directory /home/team/femmebabe/static>
                Options Indexes FollowSymLinks
                AllowOverride All
	</Directory>

	<IfModule mod_rewrite.c>
		RewriteEngine on
		RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
		RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
		RewriteRule ^(.+?)/$ /media/$1 [F,L]
	</IfModule>

	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem

	Header set X-Frame-Options: "SAMEORIGIN"
	Header set Access-Control-Allow-Origin "https://femmebabe.com"

	TimeOut 60000
	LimitRequestBody 0

	<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
		Header set Cache-Control "max-age=30, public"
	</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	RewriteEngine on
	RewriteCond %{SERVER_NAME} =femmebabe.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>

Certigu anstataŭigi la nomon de la projekto, dosierujoj kaj domajno en ĉi tiu ekzempla kodo kiam vi agordas vian servilon. Nun ni devos malebligi la defaŭltan retejon. Ĉi tio eblas per Bash.

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

Tuj poste, ni povas ebligi la defaŭltan retejon kaj reŝargi Apache2, ankaŭ uzante Bash. Memoru anstataŭigi femmebabe kun la nomo de la dosiero, kiun vi deklaris kiam redaktis en/etc/apache2/retejoj-disponeblaj/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Reiru al via domajno en la navbar. Vi devus vidi la retejon, kiun vi agordis en via retumilo. Gratulon! Se vi ne vidas ĝin, vi eble bezonos fari iujn ŝanĝojn. Zorge reviziu la agordojn en via projekto, Apache -agordo kaj certigu, ke vi ne havas erarojn, kaj aranĝu la jenajn komandojn por kontroli la projekton por eraroj.

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

Se vi havas erarojn en via projekto Python, traku ilin al kie ili estas kaj riparu ilin. Vi eble ne povos vidi ĉiujn viajn erarojn depende de kie ili estas, do se vi havas eraron, kiu simple diras, ke "popolado ne estas reentranta", redakti la sekvan dosieron en la virtuala medio, Registro.py, por elmontri la eraron.

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

Rulumu al linio 83, kie ĉi tiu rultempa eraro estas levita (levu runtimeerror ("popole () ne estas reentranta")), kaj aldonu komenton antaŭ ĉi tiu linio, poste aldonante, kun la sama indentado, mem.app_configs = {}. Ĉi tio aspektas tiel:

                # Malhelpi Reentrajn Alvokojn Por Eviti Kuri AppConfig.ready ()
                # metodoj dufoje.
# Levu RuntimeError ("Popule () ne estas reentranta")

Vi tiam povas kontroli la projekton kaj elmontri la eraron.

python manage.py check

Tiam vi povas vidi la eraron kaj ripari ĝin. Kiam vi havas ĝin riparita kaj la kodo kompilas sen eraroj, certigu ŝanĝi la dosieron, do ĝi aspektas jene:

                # Malhelpi Reentrajn Alvokojn Por Eviti Kuri AppConfig.ready ()
                # metodoj dufoje.
# mem.app_configs = {}

Se la servilo estas interrete, kiam ni faras pluajn ŝanĝojn al ĝi, ni devas uzi la jenan komandon por reŝargi la servilon:

sudo systemctl reload apache2

Timinda! Sed kio pri sendado de poŝto? Por komenci sendi retpoŝton, ni unue bezonos ĝisdatigi la domajnan agordon. Ĉi tio devas esti en via DNS -panelo en Squarespace, aŭ kion ajn vi elektis. Ni ankaŭ bezonos instali kaj aldoni agordon, kaj kuri kelkajn komandojn.

Unue, ni ricevu la IPv6 -adreson de la servilo. Ni tiam malfermos viajn DNS kaj aldonos la diskojn.

Por akiri la IPv6 -adreson de la servilo, uzu ĉi tiun komandon:

ip -6 addr

Nun ni povas aldoni la jenajn rekordojn al la DNS -agordoj. Miaj diskoj aspektas tiel. Tamen, por viaj registroj, vi devas anstataŭigi la IP -adreson per via IP (ne 75.147.182.214, tio estas mia). Aldonu ankaŭ vian domajnon anstataŭ femmebabe.com, same kiel vian IPv6 -adreson trovitan kun la antaŭa komando (vi ne povas uzi mian, Fe80 :: 725A: FFF: Fe49: 3E02). Ne zorgu pri la domainkey por nun, ĉi tio estas kreita kiam ni starigas Postfix, la poŝta servilo, kun OpenDkim, kaj presas la ŝlosilon. Ni agordos ĉi tiun lastan.

@ A N/A 75.147.182.214

@ MX 10 femmebabe.com

@ PTR N/A femmebabe.com

@ Txt N/A Txt @ v = SPF1 MX IP75.147.182.214IP6: Fe80 :: 725A: FFF: Fe49: 3e02 ~ Ĉiuj

Defaŭlta._bimi Txt N/A v = bimi1; l = https: //femembabe.com/media/static/femembabe.svg

_DMarc Txt N/A v = dMarc1; p = neniu

Sendonly._Domainkey Txt N/A

Nun ni devos aldoni iom da persista agordo por Postfikso. Ni nur bezonas certigi, ke ni anstataŭigas la domajnan nomon, femmebabe.com, kun la domajna nomo, kiun vi uzas. Ni rigardu ĉiujn agordajn dosierojn unu post la alia, kaj instalu ilin en dosierujo nomata agordo en nia projekto, por instali al la VIN.

nano config/etc_postfix_main.cf

Aldonu ĉi tiun tekston al la dosiero

# Vidu /usr/share/postfix/main.cf.dist por komentita, pli kompleta versio
# Debian specifa: Specifi dosiernomon kaŭzos la unuan
# linio de tiu dosiero por esti uzata kiel la nomo.  La Debian -defaŭlto
# IS /etc /MailName.
# myorigin = /etc /poŝtoName
# Aldonante .Domajno estas la tasko de MUA.
# Malkomprenu la sekvan linion por generi avertojn pri "malfrua poŝto"
# prokrasto_warning_time = 4h
# Vidu http://www.postfix.org/compatibility_readme.html - defaŭlte al 3.6 ON
# freŝaj instalaĵoj.
# TLS -Parametroj
# Miltra agordo

Sekva agordo!

nano config/etc_postfix_master.cf

Aldonu ĉi tiujn liniojn:

# 
# Postfix Master Process Configuration File.  Por detaloj pri la formato
# de la dosiero, vidu la Majstran (5) Manlibran Paĝon (Komando: "Viro 5 Majstro" aŭ
# Interrete: http://www.postfix.org/master.5.html).
# 
# Ne forgesu ekzekuti "Postfix -reŝarĝon" post redaktado de ĉi tiu dosiero.
# 
# ==========================================================================
# Serva Tipo Privata UNPRIV KROOT VAKA MAXPROC -Komando + Args
# (Jes) (Jes) (Ne) (Neniam) (100)
# ==========================================================================
# SMTP INET N - Y - 1 Postskribo
# SMTPD PASS - - Y - - SMTPD
# dnsblog Unikso - - y - 0 dnsblog
# Tlsproxy Unikso - - y - 0 Tlsproxy
# Elektu unu: Ebligu submetiĝon por Loopback -klientoj nur, aŭ por iu ajn kliento.
# 127.0.0.1:Submission Inet N - Y - - SMTPD
# -o syslog_name = postfikso/sendado
# -o smtpd_tls_security_level = ĉifrita
# -o smtpd_sasl_auth_enable = jes
# -o smtpd_tls_auth_only = jes
# -o smtpd_reject_unlisted_recipient = ne
# -o smtpd_client_restrictions = $ mua_client_restructions
# -o smtpd_helo_restriction
# -o smtpd_sender_restrictions = $ MUA_SENDER_RESTRICS
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restructions = permesi_sasl_authenticated, malakcepti
# -o milter_macro_daemon_name = originanta
# Elektu unu: Ebligu SMTP -ojn por Loopback -klientoj nur, aŭ por iu ajn kliento.
# 127.0.0.1:SMTPS INET N - Y - - SMTPD
# smtps inet n - y - - smtpd
# -o syslog_name = postfikso/smts
# -o smtpd_tls_wrappermode = jes
# -o smtpd_sasl_auth_enable = jes
# -o smtpd_reject_unlisted_recipient = ne
# -o smtpd_client_restrictions = $ mua_client_restructions
# -o smtpd_helo_restriction
# -o smtpd_sender_restrictions = $ MUA_SENDER_RESTRICS
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restructions = permesi_sasl_authenticated, malakcepti
# -o milter_macro_daemon_name = originanta
# 628 inet n - y - - qmqpd
# Qmgr UNIX N - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ==================================================================================================================
# Interfacoj al ne-postfix-programaro. Nepre ekzamenu la manlibron
# Paĝoj de la ne-postfix-programaro por ekscii, kiajn eblojn ĝi volas.
# 
# Multaj el la sekvaj servoj uzas la liveradon de Postfix Pipe (8)
# agento.  Vidu la paĝon pri pipo (8) mano por informoj pri $ {ricevanto}
# kaj aliaj mesaĝaj kovertaj opcioj.
# ==================================================================================================================
# 
# Maildrop. Vidu la dosieron Postfix Maildrop_Readme por detaloj.
# Specifu ankaŭ en main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# ==================================================================================================================
# 
# Lastatempaj ciraj versioj povas uzi la ekzistantan "LMTP" master.cf -eniron.
# 
# Specifu en Cyrus.conf:
# lmtp cmd = "lmtpd -a" aŭskulti = "localhost: lmtp" proto = tcp4
# 
# Specifu en Main.cf unu aŭ pli el la jenaj:
# Poŝtkesto_Transport = LMTP: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# ==================================================================================================================
# 
# Ciro 2.1.5 (Amos Gouaux)
# Specifu ankaŭ en main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus Unikso - N N - - Pipo
# flagoj = drx uzanto = ciro argv =/ciros/bin/liveri -e -r $ {sendinto} -m $ {etendaĵo} $ {uzanto}
# 
# ==================================================================================================================
# Malnova ekzemplo de liverado per Kiroso.
# 
# Old -Cyrus Unikso - N N - - Pipo
# Flagoj = R Uzanto = Cyrus Argv =/Cyrus/Bin/Liveri -e -m $ {Extension} $ {Uzanto}
# 
# ==================================================================================================================
# 
# Vidu la dosieron Postfix UUCP_README por agordaj detaloj.
# 
# 
# Aliaj eksteraj liveraj metodoj.
# 

Kaj la OpenDkim -agordo. OpenDkim identigas retpoŝtajn servilojn kun domajnaj ŝlosiloj por fari ilin pli sekuraj. Sen ĝi, Poŝto ne estas subskribita kaj eble ne faros ĝin al informkesto.

nano config/etc_default_opendkim

Aldonu ĉi tiujn liniojn:

# Noto: Ĉi tio estas hereda agorddosiero. Ĝi ne estas uzata de la opendkim
# Sistemod -servo. Bonvolu uzi la respondajn agordajn parametrojn en
# /etc/opendkim.conf anstataŭe.
# 
# Antaŭe, oni redaktus la defaŭltajn agordojn ĉi tie, kaj poste ekzekutos
# /lib/opendkim/opendkim.service.generate por generi SystemD superregi dosierojn ĉe
# /etc/systemd/system/opendkim.service.d/override.conf kaj
# /etc/tmpfiles.d/opendkim.conf. Dum ĉi tio ankoraŭ eblas, ĝi nun estas
# Rekomendita ĝustigi la agordojn rekte en /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ŝanĝi al/var/spool/postfix/run/opendkim por uzi Uniksan socket kun
# Postfikso en Chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Nekomprenebla por precizigi alternativan socket
# Notu, ke agordo ĉi tio anstataŭigos ajnan socket -valoron en opendkim.conf
# Defaŭlta:
# Aŭskultu ĉiujn interfacojn en la haveno 54321:
# Socket = inet: 54321
# Aŭskultu Loopback ĉe Haveno 12345:
# Socket = inet: 12345@localhost
# Aŭskultu 192.0.2.1 en la haveno 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Aldonu ĉi tiujn liniojn:

# Default_process_limit = 100
# Default_client_limit = 1000
# Defaŭlta VSZ (Virtuala Memoro -Grandeco) Limigo por Servaj Procezoj. Ĉi tio estas ĉefe
# intencis kapti kaj mortigi procezojn, kiuj filtras memoron antaŭ ol ili manĝas
# ĉio.
# Default_vsz_limit = 256m
# Ensaluta uzanto estas interne uzata de ensalutaj procezoj. Ĉi tio estas la plej ne fidinda
# uzanto en Dovecot -sistemo. Ĝi tute ne havu aliron al io ajn.
# Default_login_user = Dovenull
# Interna uzanto estas uzata per neprofundaj procezoj. Ĝi estu aparta de
# Ensaluta uzanto, por ke ensalutaj procezoj ne povas ĝeni aliajn procezojn.
# Default_internal_user = Dovecot
    # haveno = 143
    # haveno = 993
    # ssl = jes
  # Nombro de ligoj por pritrakti antaŭ ol komenci novan procezon. Tipe
  # la solaj utilaj valoroj estas 0 (senlima) aŭ 1. 1 estas pli sekura, sed 0
  # estas pli rapida. <doc/wiki/loginprocess.txt>
  # Servo_Count = 1
  # Nombro de procezoj por ĉiam atendi pli da rilatoj.
  # process_min_avail = 0
  # Se vi agordas Service_Count = 0, vi probable bezonas kreskigi ĉi tion.
  # vsz_limit = $ default_vsz_limit
    # haveno = 110
    # haveno = 995
    # ssl = jes
    # haveno = 587
  # Kreu inet -aŭskultanton nur se vi ne povas uzi la ĉi -supran UNIX -socket
  # inet_listener lmtp {
    # Evitu fari LMTP videbla por la tuta interreto
    # adreso =
    # haveno =
  # }
  # Plejparto de la memoro iras al mmap () ing dosieroj. Vi eble bezonas pliigi ĉi tion
  # Limigu se vi havas grandegajn retpoŝtajn kestojn.
  # vsz_limit = $ default_vsz_limit
  # Max. Nombro de IMAP -procezoj (ligoj)
  # procezo_limit = 1024
  # Max. Nombro de POP3 -procezoj (ligoj)
  # procezo_limit = 1024
  # Max. Nombro de SMTP -Submetaj Procezoj (Ligoj)
  # procezo_limit = 1024
  # AUTH_SOCKET_PATH notas ĉi tiun uzadon de uzanto. Ĝi estas tipe
  # uzata de Dovecot-Lda, Doveadm, eble IMAP-procezo, ktp. Uzantoj, kiuj havas
  # Plenaj permesoj al ĉi tiu socket kapablas akiri liston de ĉiuj uzantnomoj kaj
  # Akiru la rezultojn de ĉiuj uzantaj serĉoj.
  # 
  # La defaŭlta 0666 -reĝimo permesas al iu ajn konekti al la socket, sed la
  # UseDerdb -serĉoj sukcesos nur se la uzanto redonas "uid" kampon
  # kongruas kun la UID de la alvokanta procezo. Ankaŭ se la UID aŭ GID de alvokanto kongruas kun la
  # La uid de socket aŭ Gid la serĉado sukcesas. Ĉio alia kaŭzas fiaskon.
  # 
  # Por doni al la alvokanto plenajn permesojn por serĉi ĉiujn uzantojn, agordi la reĝimon al
  # io alia ol 0666 kaj Dovecot lasas la kernon plenumi la
  # Permesoj (ekz. 0777 permesas al ĉiuj plenajn permesojn).
  # Aŭt -laborista procezo funkcias kiel radiko defaŭlte, por ke ĝi povu aliri
  # /etc/ombro. Se ĉi tio ne necesas, la uzanto devas esti ŝanĝita al
  # $ defaŭlta_internal_user.
  # Uzanto = Radiko
  # Se DICT -prokuro estas uzata, poŝtaj procezoj devas havi aliron al ĝia socket.
  # Ekzemple: reĝimo = 0660, grupo = vmail kaj tutmonda mail_access_groups = vmail
    # reĝimo = 0600
    # Uzanto =
    # grupo =

Denove, certigu anstataŭigi la domajnon en ĉiuj ĉi tiuj dosieroj, femmebabe.com, kun la domajno, kiun vi elektis. Redaktu la sekvan dosieron, Agordo de Dovecot,

nano config/etc_dovecot_dovecot

Kaj aldonu ĉi tiujn liniojn

## Dovecot -agorddosiero
# Se vi rapidas, vidu http://wiki2.dovecot.org/quickconfiguration
# Komando "DoveConf -N" donas puran eliron de la ŝanĝitaj agordoj. Uzu ĝin
# Anstataŭ kopii kaj alglui dosierojn kiam vi afiŝas al la Dovecot -dissendolisto.
# '# 'Karaktero kaj ĉio post kiam ĝi estas traktataj kiel komentoj. Kromaj spacoj
# kaj langetoj estas ignorataj. Se vi volas uzi iun el ĉi tiuj eksplicite, metu la
# value inside quotes, eg.: key = "# char kaj trenanta blankan spacon "
# Plej multaj (sed ne ĉiuj) agordoj povas esti superregaj per malsamaj protokoloj kaj/aŭ
# fonto/celloko IPS metante la agordojn en sekciojn, ekzemple:
# Protokolo IMAP {}, Loka 127.0.0.1 {}, Remote 10.0.0.0/8 {}
# Defaŭltaj valoroj estas montritaj por ĉiu agordo, ĝi ne bezonas nekomprenebla
# tiuj. Ĉi tiuj estas esceptoj al ĉi tio tamen: neniuj sekcioj (ekz. Nomspaco {})
# Aŭ kromprogramoj estas aldonitaj defaŭlte, ili estas listigitaj nur kiel ekzemploj.
# Vojoj estas ankaŭ nur ekzemploj kun la realaj defaŭltoj bazitaj sur agordo
# Ebloj. La vojoj listigitaj ĉi tie estas por agordi --prefix =/usr
# -sysconfdir =/ktp --localstatedIr =/var
# Ebligu instalitajn protokolojn
# Komo disigita listo de IPS aŭ gastigantoj kie aŭskulti por ligoj.
# "*" Aŭskultas en ĉiuj IPv4 -interfacoj, "::" Aŭskultas en ĉiuj IPv6 -interfacoj.
# Se vi volas precizigi ne-defaŭltajn havenojn aŭ ion pli kompleksan,
# Redakti Conf.D/Master.conf.
# Aŭskultu = *, ::
# Baza dosierujo kie stoki rultempajn datumojn.
# bazo_dir =/var/run/kolombo/
# Nomo de ĉi tiu kazo. En multi-instanca aranĝo Doveadm kaj aliaj komandoj
# povas uzi -i <SESTANCE_NAME> Por elekti kiun petskribon uzas (alternativo
# al -c <figlo_path>). La instanca nomo ankaŭ estas aldonita al Dovecot -procezoj
# en PS -eligo.
# petskribo_nomo = kolomboto
# Saluta mesaĝo por klientoj.
# ensaluti_greeting = Dovecot preta.
# Spaca apartigita listo de fidindaj retaj gamoj. Ligoj de ĉi tiuj
# IP -oj rajtas anstataŭigi siajn IP -adresojn kaj havenojn (por arbohakado kaj
# por aŭtentikaj kontroloj). malebligi_plaintext_auth ankaŭ estas ignorita por
# ĉi tiuj retoj. Tipe vi specifus viajn IMAP -prokurajn servilojn ĉi tie.
# ensaluti_trud_networks =
# Spaca Apartigita Listo de Ensaluta Alira Kontrolo (ekz. TCPWRAP)
# ensaluti_access_sockets =
# Kun prokrasto_maybe = jes se prokura celloko kongruas kun iu el ĉi tiuj IP -oj, ne faru
# Proksimume. Ĉi tio ne necesas normale, sed povas esti utila se la celloko
# IP estas ekz. IP -ŝarĝa ekvilibrilo.
# auth_proxy_self =
# Montru pli da verbaj procezaj titoloj (en PS). Nuntempe montras uzantnomon kaj
# IP -adreso. Utila por vidi, kiuj fakte uzas la IMAP -procezojn
# (ekz. dividitaj poŝtaj kestoj aŭ se samaj UID estas uzataj por multnombraj kontoj).
# verbose_proctitle = ne
# Ĉu ĉiuj procezoj estu mortigitaj kiam Dovecot -majstra procezo malŝaltas.
# Agordi ĉi tion al "Ne" signifas, ke kolombo povas esti altgradigita sen
# devigante ekzistantajn klientajn ligojn fermi (kvankam tio ankaŭ povus esti
# problemo se la ĝisdatigo estas ekz. pro sekureca riparo).
# ShutDown_Clients = Jes
# Se ne-nula, kuru poŝtajn komandojn per ĉi tiuj multaj rilatoj al DoveAdm-servilo,
# anstataŭ kuri ilin rekte en la sama procezo.
# DOVEADM_WORKER_COUNT = 0
# UNIKSO SOCKET A OR GAST: Haveno uzata por konekti al DoveAdm -Servilo
# DOVEADM_SOCKET_PATH = Kolombo-servilo
# Spaca apartigita listo de mediaj variabloj konservitaj sur Dovecot
# ekfunkciigo kaj transdonis al ĉiuj ĝiaj infanaj procezoj. Vi ankaŭ povas doni
# Ŝlosilo = Valoraj paroj por ĉiam agordi specifajn agordojn.
# import_environment = tz
## 
## Vortaraj servilaj agordoj
## 
# Vortaro povas esti uzata por stoki ŝlosilon = valorlistoj. Ĉi tio estas uzata de pluraj
# kromaĵoj. La vortaro alireblas rekte aŭ kvankam
# Vortara servilo. La jenaj diktblokaj mapoj -vortaraj nomoj al Uris
# Kiam la servilo estas uzata. Ĉi tiuj tiam povas esti referencitaj per URI -formato
# "Proxy :: <nomo>".
  # quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# La plej granda parto de la efektiva agordo estas inkluzivita sube. La dosiernomoj estas
# Unue ordigita laŭ ilia ASCII -valoro kaj analizita laŭ tiu ordo. La 00-prefiksoj
# En dosiernomoj celas faciligi la komprenon de la mendado.
# Agorddosiero ankaŭ povas provi inkluzivi sen doni eraron se
# ĝi ne estas trovita:
# Permesas al Dovecot aŭskulti ĉiujn enigajn ligojn (IPv4 / IPv6)

Aldonu pasvorton por la Dovecot -uzanto:

nano config/etc_dovecot_passwd

La unua parto de la dosiero, antaŭ la dupunkto, estas la uzantnomo. La lasta parto, "YourPassword", indikas la pasvorton, kiun vi ŝatus doni al via poŝta servilo.

team:{plain}yourpassword

Tuj poste, la OpenDkim -agordo

nano config/etc_opendkim.conf

Kaj aldonu ĉi tiujn liniojn:

# Ĉi tio estas baza agordo por subskribi kaj kontroli. Ĝi povas facile esti
# Adaptita por konveni bazan instaladon. Vidu opendkim.conf (5) kaj
# /usr/share/doc/opendkim/examples/opendkim.conf.sample por kompleta
# Dokumentado de disponeblaj agordaj parametroj.
# Logwhy ne
# Oftaj subskribo kaj kontrolaj parametroj. En Debian, la "de" kaplinio estas
# troigita, ĉar ĝi ofte estas la identa ŝlosilo uzata de reputaciaj sistemoj
# kaj tiel iom sekureca sentema.
# Subskribanta domajnon, selektilon, kaj ŝlosilon (bezonatan). Ekzemple, plenumu subskribon
# Por domajno "Ekzemplo.com" kun Selektilo "2020" (2020._Domainkey.example.com),
# Uzante la privatan ŝlosilon stokitan en /etc/dkimkeys/example.private. Pli granula
# Agordaj opcioj troveblas en /usr/share/doc/opendkim/readme.opendkim.
# Domajna ekzemplo.com
# Selektilo 2020
# Keyfile /etc/dkimkeys/example.private
# En Debian, OpenDkim funkcias kiel uzanto "OpenDkim". Umasko de 007 estas bezonata kiam
# Uzante lokan socket kun MTA-oj, kiuj aliras la socket kiel ne-privilegian
# uzanto (ekzemple, Postfix). Vi eble bezonas aldoni uzanton "Postfix" al Grupo
# "OpenDkim" en tiu kazo.
# Socket por la MTA -konekto (bezonata). Se la MTA estas ene de Chroot -malliberejo,
# Oni devas certigi, ke la socket estas alirebla. En Debian, Postfix kuras
# Chroot en/var/spool/postfikso, tial Uniksa socket devus esti
# Agordita kiel montrita sur la lasta linio sube.
# Socket local: /run/opendkim/opendkim.sock
# Socket inet: 8891@localhost
# Socket inet: 8891
# Gastigantoj por kiuj subskribi prefere ol kontroli, defaŭlte estas 127.0.0.1. Vidu la
# Operacia sekcio de OpenDkim (8) por pliaj informoj.
# Internajhostoj 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# La konfido -ankro ebligas DNSSEC. En Debian, la fidinda ankro -dosiero estas provizita
# per la pakaĵo DNS-ROOT-DATA.
# Nomumiloj 127.0.0.1
# Mapaj domajnoj en de adresoj al ŝlosiloj uzataj por subskribi mesaĝojn
# Aro da internaj gastigantoj, kies poŝto estu subskribita
nano config/etc_default_opendkim

Kaj aldonu ĉi tiujn liniojn

# Noto: Ĉi tio estas hereda agorddosiero. Ĝi ne estas uzata de la opendkim
# Sistemod -servo. Bonvolu uzi la respondajn agordajn parametrojn en
# /etc/opendkim.conf anstataŭe.
# 
# Antaŭe, oni redaktus la defaŭltajn agordojn ĉi tie, kaj poste ekzekutos
# /lib/opendkim/opendkim.service.generate por generi SystemD superregi dosierojn ĉe
# /etc/systemd/system/opendkim.service.d/override.conf kaj
# /etc/tmpfiles.d/opendkim.conf. Dum ĉi tio ankoraŭ eblas, ĝi nun estas
# Rekomendita ĝustigi la agordojn rekte en /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ŝanĝi al/var/spool/postfix/run/opendkim por uzi Uniksan socket kun
# Postfikso en Chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Nekomprenebla por precizigi alternativan socket
# Notu, ke agordo ĉi tio anstataŭigos ajnan socket -valoron en opendkim.conf
# Defaŭlta:
# Aŭskultu ĉiujn interfacojn en la haveno 54321:
# Socket = inet: 54321
# Aŭskultu Loopback ĉe Haveno 12345:
# Socket = inet: 12345@localhost
# Aŭskultu 192.0.2.1 en la haveno 12345:
# Socket = inet: 12345@192.0.2.1

Kiam ni pretas agordi nian Postfix -servilon, ni funkciigos la suban kodon, kun la taŭga domajna nomo enigita. Komencu kreante skripton

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

Nun, en Nano, la teksta redaktilo, redaktu ĉi tiun dosieron, por ke ĝi inkluzivas vian domajnan nomon anstataŭ femmebabe.com.

# !/bin/bash
# Agordo Postfikso

Nun, kuru la kompletigitan skripton por agordi Postfix, OpenDkim kaj Dovecot.

./scripts/postfixsetup

Post kiam ĉi tiu skripto funkciis, kopiu la lastan linion, kiun ĝi presas kaj algluu ĝin en vian DNS -agordon kiel la valoro por Sendonly._Domainkey. Jen la ŝlosilo OpenDkim uzata por identigi vian domajnon kiam vi sendas sekuran poŝton.

Timinda! Ene de kelkaj tagoj, vi devus povi sendi poŝton de la servilo kondiĉe ke ĉio estas agordita ĝuste.

Se vi ĵus agordis la DNS por via poŝta servilo, ĝi devas daŭri malpli ol 72 horojn por ke la registroj ĝisdatigu. Ĝi kutime estas multe pli rapida. Vi povas kontroli, ĉu via servilo funkcias per ĉi tiu komando, provizis vian retpoŝton:

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

Se ĉio ŝajnas funkcii ĝuste, vi devus povi sendi retpoŝton kun via servilo. Se ĝi ne funkcias, provu rigardi la ŝtipojn por vidi, kia povus esti la eraro.

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

Ĉi tio ofertos verbajn informojn pri poŝto, kiu estas sendita de la servilo kaj ĉu ĝi funkcias ĝuste. Vi ankaŭ povus vidi la retpoŝton en via enirkesto, se ĝi ne estas tie, kontrolu vian spam -dosierujon.

Vi ankaŭ bezonos agordi viajn agordojn en via agordo.py por ke via retpoŝta servilo povu paroli kun via Django -app, la projekto. Aldonu aŭ anstataŭigu ĉi tiujn liniojn en viaj agordoj

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

Rimarku, ke ni uzas agordan dosieron por akiri la pasvorton. Ni ŝarĝu ĉi tiun dosieron en la agordoj kiel tiel, en la komenco de la dosiero:

# Malfermu kaj ŝarĝu agordon

Ni kreu ĉi tiun dosieron kaj aldonu sekretan ŝlosilon al ĝi, same kiel la poŝtan pasvorton. Por generi sekretan ŝlosilon, uzu ĉi tiun komandon, kun kia ajn longo vi ŝatas ĉe la fino:

openssl rand -base64 64

Nun, kopiu la tekston, kiu malfermas generitan kaj redakti /etc/config.json

sudo nano /etc/config.json

Aldonu la jenajn liniojn al via dosiero, kun la ŝlosilo, kiu malfermiĝas generita kiel la sekreta ŝlosilo.

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

JSON -formato estas simpla kaj facile uzebla, ni povas deklari aliajn ŝlosilojn, kiujn ni volas uzi ankaŭ en nia projekto, kaj konservi ilin aparte de nia projekt -dosierujo, por ke aliaj uzantoj ne povu skribi al ili kaj do ili ne povas esti legataj nur de nia projekt -adresaro. Ĉi tio estas rekomendinda praktiko por API -klavoj, el kiuj ni uzos pli ol kelkajn ĉi tie.

Vi ankaŭ volas subteni vian projekton por certigi, ke ĉio estas konservita kaj vi povos reakiri vian laboron poste eĉ se vi ne plu volas lui servilon.

sudo backup

Nun provu sendi HTML -retpoŝton de la retservilo, kondiĉe ke sendi unu el la komandlinio funkcias. Demandu vian uzantan petskribon en la ŝelo, kaj sendu HTML -retpoŝton al tiu uzanto per Django. Ŝanĝu mian nomon en la kodo, Charlotte, al via uzantnomo.

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

Se la unua komando ne funkcias, certigu uzi

source venv/bin/activate

Se ĉio estas agordita ĝuste, vi nun ricevos bonvenan retpoŝton en via leterkesto sendita de via retejo -programo. Bona laboro! Vi multe venis.

Mi volis aldoni, se vi iam luktas kun iuj eraroj dum mi laboras pri projekto kiel ĉi tio, ne hezitu serĉi respondojn kaj peti helpon. Google, inter aliaj serĉiloj, estas bonegaj rimedoj por serĉi programan helpon. Simple serĉu la eraron, kiun vi ricevas, kaj vi povos vidi kiel aliaj homoj solvas la problemon. Ankaŭ vi bonvenas kontakti min, viajn edukistojn (instruistoj, profesoroj, instruistoj), iujn samulojn en la interreto disponeblaj por programado, aŭ konsulti ĉi tiun libron denove aŭ aliajn rimedojn por trovi solvojn al la problemoj, kiujn vi spertas. Mi komprenas, ke ĉi tio ne facilas, sed eĉ se vi legis ĉi tie kaj ne verkas kodon, vi lernas multon pri konstruado de retejo -app de nulo. Pat mem malantaŭen, vi faras bonegan laboron.

Dankon pro la tempo por legi ĉi tiun Tria Eldona Reteja Gvidilo. En estontaj eldonoj, mi inkluzivos pli multajn el la gravaj ekzemploj diskutitaj en la komenco de la dokumento kaj ni plonĝos multe pli profunde en la mondon de programaro kaj aparataro. Restu agordita pri la venontaj, kaj mi antaŭĝojas instrui al vi kiel konstrui nekredeblan programon. Ĝis revido en la sekva eldono!






Fermi
Paĝo 1
Saltu
Vidu plenan artikolon
Daŭrigu Legadon

Aĉetu | Aĉetu kun kripto



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


Profesia distro, fotoj, filmetoj, audio, viva streaming kaj hazarda ludado, same kiel identiga skanado, retejo -disvolviĝo kaj surogataj servoj.

Lasu al mi konsilon en bitcoin uzante ĉi tiun adreson: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Kondiĉoj de Servo