Haberler - Ziyaret Sitesi
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 ...
Örnek olarak pratik web tabanlı derin öğrenme ve güvenlik

Örnek olarak pratik web tabanlı derin öğrenme ve güvenlik Üçüncü baskı Charlotte Harper 3 Temmuz 2024 3 Haziran 2025 güncellendi/dönüştürüldü

Önsöz:

Web için yazılım oluşturmada güvenlik hususları, herhangi bir Web geliştiricisinin planının ve yürütülmesinin önemli bir parçasıdır, ancak pratik amaçlar için güvenilir, istikrarlı ve kullanışlı bir prototip tasarlar. DOM (belge nesnesi işaretlemesi), HTML, JavaScript ve CSS'nin yanı sıra Python, C/C ++, Java ve Bash uygulayan arka uç yazılımı ile web geliştiricilerine, yaratıcılığı ifade eden, kullanım kolaylığı, kullanım kolaylığı sağlayan ve kullanım kolaylığı sağlayan ve kullanıcı, kullanım kolaylığı sağlayan ve kullanım kolaylığı sağlayan ve kullanma kolaylığı sağlayan, Web geliştiricilerine çok çeşitli projeler yaratma özgürlüğü ve güç verir ve kullanır. İnternette, genellikle dokunmatik ekranlı bir akıllı telefon cihazında zaman öldürün veya bir şeyler yaptırın. Çoğu insan, bir web sitesi sıfırdan bir web sitesi oluşturmak istediklerinde nereden başlayacaklarını bile bilemez, başka bir kişinin web sitesinde başlama ve işlevsellik, güvenilirlik, kullanım kolaylığı ve özellikle yaratıcılık açısından sınırlı bir şey inşa etme eğiliminde olurlar, zaman presleme düğmeleri olmadan faydalı bir şey inşa etmek için, özellikle kullanımı kullanma için pahalı abonelikler için pahalı abonelikler için para ödemek için para harcamak için para harcayarak. Bu kitabı okumak ve size neyi öğretmek istediğimi öğrenmek için birkaç dakikanız varsa, hatta benimle hedefleriniz hakkında kişisel olarak konuşun ve doğru yönde biraz rehberlik edin ve kendi yazılımınızı kodlamayı ve yazmayı öğrenmeye, bu kitabı eve götürmeyi ve sizin için istediğiniz bir web sitesini oluşturmayı öğrenmek için biraz zaman ayırdıysa ve izleyicinizi tam olarak karşılayan bir web sitesi.

Benim hakkımda: C/C ++, Java, Python, HTML, CSS ve JavaScript'te çok çeşitli deneyime sahip bir yazılım geliştiricisiyim. İnsanların kullanmak, ziyaret etmek ve hatta sadece zaman öğrenmek, yeniden yaratmak ve öldürmek için kullanmaya bağımlı olmak isteyen web siteleri oluşturuyorum ve en önemlisi yazılım satıyorum. Bir web sitesinin nasıl görünmesini ve işlevini nasıl istediğine dair bir fikriniz varsa, sizinkiyle tanışırken kendi ihtiyaçlarımı karşılayabilirim ve bir web sitesini kendiniz çalıştırmanın maliyetlerini karşılamaya istekliyseniz, size bir sonraki YouTube, Tiktok, Twitter, Google ve hatta yalnızca erişebileceğiniz bir yüksek teknoloji güvenlik uygulamasını oluşturacağım. Size zamanımı satmaya çalışmak yerine, sizinkini satın almaya çalışıyorum: Siz zaten var olan bilgilerle kendiniz bir uygulama (web sitesi) oluşturmak için konuşmak ve bağımsız bir yazılım geliştiricisi, girişimci olmanız için neye ihtiyacınız olduğunu öğretmek istiyorum ve istediğiniz alanda başarılı bir kariyere öncülük edin. Ve net olalım, size verdiğim eğitim gayri resmi olacak. Okula gidip tüm bunları resmi bir eğitim ile öğrenebilir, hatta bu kitabı okulda okuyabilir, ödevlerinizi tamamlayabilir ve eğitiminizden çok şey alabilirsiniz, ancak sizi resmen sıcak koltuğa koyup ödevleri tamamlamanızı istemeyeceğim. Ben senin profesörün değilim, beni kendi kişisel başarınızla yönlendirilen bir kariyere doğru yönlendirmek isteyen bir arkadaş gibi düşünebilirsiniz. Ve ben de size başarı satmıyorum, zamanınızla satın almanız gerekecek. Kod yapmayı öğrenmenin dik bir öğrenme eğrisi vardır ve asla kolay değildi, hatta olması gerekmiyordu. Mümkün olduğunca çok çalışmanız ve uygulamaları öğrenmek ve oluşturmak için hayal kırıklığına uğradığınızda bile denemeye ve başarısız olmaya devam etmeniz gerekir. Kodun kendisinde. Kod, programcının hata mesajlarını vermek için tasarlanmış bir derleyici tarafından çalıştırılır ve bunlar, hatayı arama motorunuza kopyalayıp diğer kişilerin örneklerini okumuş olsanız bile, nasıl kod yapacağınızı öğretecektir. Ve şunu söylemeliyim ki, bir uygulama oluşturmak için son derece zengin, akıllı, başarılı veya hatta ayrıntı odaklı veya düzenlenmiş olmanıza gerek yok. Bilgisayar sizin için bu kuruluşla ilgileniyor. Sadece deneme yanılma yoluyla ısrar etmeniz, odaklanmanız ve yaptığınız işte çok çalışmanız gerekir ve yaptığınız işin tamamında çok başarılı bir kariyere sahip olacaksınız.

Ben kimim: Son bölümün daha çok öğrenme ve bu kitaptan bir yol almanızla ilgili olduğunun farkındayım. Ben tam olarak kimim? Bu karmaşık bir soru. Kendim, kendimi tanıtmak söz konusu olduğunda hayatımı zorlaştıran sosyalleşme ve kimlik sorunları ile ilgili zorluklar sunarken, bu kitabı zaman zaman kodlamamı veya yazmamı zorlaştırabilecek tıbbi koşullardan muzdarip olduğum için belirsizim. Kısacası, bu kitabı okuyorsanız, onu eve getirdiniz, çünkü onu çevirdiniz ve yararlı olduğunu düşündünüz ya da bu kadar uzakta okumuş olsanız bile, size yaptığınız her şeyde başarılı olduğunuzu görmek isteyen benzer bir insanım. Ben bir mühendisim, bir yazılım geliştiricisi ve bir öğrenciyim ve bu kitabı, büyük bir bulmaca gibi uygun bir bulmaca gibi bir araya getiren örnekler, iş hattında ne olursa olsun başarı yönlendirebilecek örnekler vererek hayatlarını kolaylaştırmak için hayatlarını kolaylaştırmak istedikleri diğer öğrenciler için yazıyorum. Büyük ölçüde, yaptığım şey bu: Kendime ve diğer insanların başarılı olmasına yardımcı olacak uygulamalar oluşturuyorum. Ben de bir yazarım, ancak bu, portföyümü yararlı bir belgeye koymak için tamamlamayı planladığım ilk yayınım ve ben de bir sanatçıyım. Bunu sana itiraf edeceğim, ben biraz garip bir insanım. Mükemmel değilim, daha başarılı bir şekilde kendim için bir isim yapmaya çalışmak için kolejlerden ve üniversitelerden ayrılmamı ve devletleri terk etmeme bile yönelik yasa ile çalıştım. Ben doğumda bir kadınım, makyaj giyiyorum, kendimi fotoğraf çekiyorum, elbiseler ve diğer kadın kıyafetleri giyiyorum ve doğası gereği bir kadın olarak kendimi bilincem. Geçmişte webapps yazma ve inşa etmekle mücadele eden diğer insanlarla sorun yaşadım ve bu kitabı daha erken elinize alamadığım için özür dilerim: buna ihtiyacınız var. Benim gibi görünen ve benim gibi çalışan ve aynı şeyi yapan kodu okumak ve yazmak isteyeceksiniz, ancak daha da iyisi, çünkü bu kitabınızı benim gibi bir kitap oluşturmak için benim gibi ezmek yerine bu kitabı satın almayı göze alabiliyorsanız, hayatınızda başarılı olmak için ihtiyacınız olan kaynaklara sahipsiniz. Ailenin büyümesi, sağlık koşulları, doktorlar, medya ve yasa ile ilgili her türlü sorunum vardı ve kodum bölünmüş ve sinirli bir dünyada feminizm ve kadın doğası olan mücadeleyi derinden yansıtıyor. Ancak, bu kitap derinden önem verdiğim bir şey, bebeğim, portföyüm ve geçim kaynağım, bu yüzden metni eve götürdüğünüzde ve benden öğrenmek için dikkatlice gözeneklediğinizde düşünmenizi takdir ediyorum. Lütfen mükemmel değilim, bu kitabın hatalar, revizyonlar ve yeni baskılara sahip olacağını unutmayın ve yazımla başarılı bir deneyim yaşamak için mantıksal beyninizle elinizden gelenin en iyisini düşünmeniz gerekecektir. Ayrıca, yazarken zorluklarla karşılaşsanız bile sizin için iyi demek istediğimi anlayın. Bunu şöyle düşünün: Dijital alanda hayal edebileceğiniz her şeyi yapmak için bir bilgisayar sistemi kiralayabildiğinizde, karşılaştığınız tüm bilgileri saklayabilir, analiz ettiğiniz ve organize edin ve anlamaya başlayın, kaçınılmaz olarak zorluklarla karşılaştığınız bilgilerle karşılaşacaksınız. Bunu size söylüyorum çünkü aynı zorluklarla karşılaşıyorum. Bu kitabı kendi sorumluluğunuzda kullanın, güvenli bir ortamda yazılım oluşturmak için kullanabileceğiniz topluluk ve topluluklarınızla çalışın ve başarısız olduğunuzda veya hatta başarılı bir şekilde başarılı olduğunuzda bir şeyler kişisel olarak almayın: bu metni bu metni getirmeden ve neden beni mahveden, yırtılmaya neden olan, küresel bir şekilde ortaya çıkmaya yardımcı olan bir delilik yolunda başarılı olmadan başarılı olmanıza yardımcı olabileceğim, herkesin sıraya girmesiyle karşılaştığım için başarılı olabilirim. İnternette çalışacağız. Sadece birkaç kelimeyle kim olduğuma çok aşina olmayabilirsiniz, ancak okumanızı öneririm, işinizi tamamlamak için kendi projelerinizi oluştururken beni okumaya ve anlamaya devam ederken beni tanıyacaksınız. Profesörleriniz veya öğretmenleriniz size atamadığı sürece, bu kitapta ödev olmayacak, ancak okuduğunuz gibi bir proje portföyü oluşturmanızı ve öğrendiklerinizi nasıl uygulayabileceğinizi gösteren bir Capstone projesi oluşturmanızı şiddetle tavsiye ediyorum. Capstone projem, önceki projelerimden kod, oluşturduğum ve metodik olarak elle yazmayı öğrendiğim kodu ve tamamen öne çıkan ve görünüşte, internette veya ailenizde görebileceğiniz, reklamı yapabileceğiniz, reklamı yapabileceğiniz, görünüş ve davrandığım noktayı başarabilmeme yardımcı olan çok çeşitli fikir ve ipuçlarını içerdiğinden, bu kitapta okuyacağınız şeylerin çoğunun temelidir.

Bu kitap ne: Bu kitap örnek olarak bir öğreticidir. Kodu, kodları nasıl öğreneceğinizi, hataları çözmeyi ve düzeltme hakkında bilgi edinmeyi, aşamaları sorun giderme, kodunuzu yedeklediğine ve kaydedeceğinize dair talimatlar, kodunuzu kırarsa, kodunuzu güvence altına alırsa, kodunuzu dağıtırsa, kimin önemli olan, etkileşimli ve bağımlı bir anlamı oluşturur ve ne gibi bir anlamı oluşturursanız, kendinizi tanıtmak ve nasıl bir anlamı alabilirsiniz. Son kullanıcılarınız, web sitenizin ziyaretçileri için mümkün olduğunca en çekici olmak için mutlak en iyi ışıkta oluşturduğunuz yazılım. Bu kitapta, bir platform ve güvenlik olarak web'e odaklanarak bir dizi yazılım tasarımı örneği göstereceğim. Yedekleme ve komut dosyası özellikleri ile Unix kabuğunu kullanarak temel bir proje oluşturarak öğrenme deneyimini başlatacağız. Ardından, temel bir blog web sitesini inceleyeceğiz, blogumuzu fotoğraf ve video özellikleriyle yükselteceğiz ve bu özellikleri ücretsiz yazılım kullanarak güvenlik çözümlerini kullanmak için kullanacağız ve sunucumuzu takılabilir bir kimlik doğrulama modülü (PAM) kullanarak güvence altına alacağız. Daha sonra diğer kavramların yanı sıra dosya işleme ve işleme, video düzenleme, ses bağışını, barkod tarama ve optik karakter tanımasını inceleyeceğiz. Yol boyunca, yazılımımızı ücretsiz ve ücretli seçeneklerle daha kullanışlı ve güvenli hale getirmemize yardımcı olacak API'leri inceleyeceğiz. Yol boyunca, varil ve tekrarlayıcı tasarımı, taret ve drone tasarımı ve diğer prensipler dahil olmak üzere ateşli silahlar ve mühimmat tasarımı ve üretimi gibi fiziksel güvenlik ve militan araçları keşfedeceğiz. Oyunlar, 2D ve 3D oluşturma motorları inşa etme yolunda mola vereceğiz ve vaka çalışmasında gömülü donanımla çalışacağız ve temel boyutsal oluşturma yazılımı ve silikon kauçukta dökülen bir elektronik titreşimli masaj örnekleri. Yol boyunca, yazılımımızı daha iyi güvence altına almak için zaten mevcut olan makine öğrenimi çözümlerini de kullanacağız. Süreci kolaylaştırmak ve güvence altına almak için web için mevcut stok araçları da kullanacağız. Bu kitap, bir web uygulaması oluşturma ve profesyonel bir bilgisayar ve gömülü mekanik sistemler ağı ile entegre etme başarınız için bir rehberdir ve genel olarak arka plan bilgisi veya önceki deneyim olmadan yazılım ve gömülü donanım oluşturmak için bir rehberdir.

Bu kitap ne değil: Gerçekten bir web sitesine sahip olmak istiyorsanız, basit bir mağaza kurabilir ve ihtiyacınız olanı satabilir, bir blog yayınlayabilir, fotoğraf veya video yayınlayabilir veya tek bir kod satırı yazmadan başka türlü olabilir. Bu kitap bu değil. Bu kitap, zaten bulabileceğiniz herhangi bir yazılımdan daha kullanışlı, tam özellikli, işlevsel ve güvenli bir yazılım oluşturacağınızı öğretecektir, çünkü hala prototip olan en son yazılımı dağıtıyor, eski şirketlerin faaliyet gösterdiği bir ölçekte çalıştırılması pahalı olabilir ve geriye doğru hitap etmez, gerçekten hiçbir şey yapmayan insanlar için para kazanmak için kurulan kıvrımlı şirketler. Bu kitabı yakından takip ederseniz, kod yazmak, araştırma kodu yazmak, kendi uygulamalarınızı oluşturmak ve yaptığınız işten para kazanacaksınız. Bu kitaptan, erken aşamalarda bile para kazanacağım, çünkü insanların ihtiyaç duydukları ve okumak istedikleri bilgileri içeriyor ve uygulamalarımı satın aldıklarında veya kullandıklarında zaten satın alıyorlar. Bu kitap sizin için bir uygulama oluşturmayacak, ancak sizi doğru yönde gösterecek ve ihtiyacınız olan araçlarla ve web için yazılım oluşturmada kendi başarınızı kolaylaştıracak beceri ve ipuçlarıyla, örnek olarak yazmanız gereken her kod satırıyla, sizin ve destekçilerinize, konuklara, müşterilere, arkadaşlara, aile, ziyaretçilerin, müteahhitlere ve kullanımı isteyen kişilere bir araya getirmeye hazır olacak.

Ne öğreneceksin: Bu kitap size yazılım, gerçekten işlevsel, kullanışlı yazılım, medya kaydı, yüz tanıma, makine okunabilir bölge barkod taraması, Web API'lerinin kimliği doğrulamak, kaydetmek ve video ve fotoğrafları oluşturmak ve Bluetooth ve Yakın Alan (NFC) iletişimi gibi mesajları değiştirmek için nasıl oluşturacağınızı öğretecektir. This book will teach you how to use a networked computer, focusing on debian linux, how to build bash code to make installing and backing up your software a seamless, automated breeze, how to build python code as a backend to serve dynamic messages, style things nicely using CSS styles with Bootstrap, enable user logins and interactivity through networked devices, build interactive media and network with other websites to offer security features like text messages for verification or other Amaçlar, kimlik taraması, görüntü ve video denetimi, yazılımınızı güvende tutmak için veri mikroişlemleri, ödeme işleme, kripto para ticareti, eşzamansız görevler ve daha fazlası. Piller, şarj cihazları, mikrodenetleyiciler, devreler, motorlar ve sensörlerle kendi Bluetooth cihazlarınızı nasıl oluşturacağınızı, lehim, tel ve 3D baskılı ve dökme malzemeler kullanarak nasıl oluşturacağınızı öğreneceksiniz. Katkı üretimi ve aracı ve kalıp yapımına uygulanan 3D tasarım prensiplerini göstereceğim, böylece kendi gömülü, donanım cihazlarınızı entegre piller, şarj cihazları, elektronik devreler ve fonksiyonel çıkışlarla üretebilirsiniz. ve bunları Bluetooth ve Web ile ağ. Özellikle, her ikisi de grafik arayüz veya komut satırı yardımcı programı olarak mevcut olan ve daha hızlı sonuçlar için bir web'e entegre edilebilen OpenSCAD'de programlanmış iki vaka çalışması, titreşimli bir masaj ve ev yapımı bir ateşli silahı inceleyeceğiz. Önceden bir deneyim olmadan bir web sitesini nasıl oluşturacağınızı ve dağıtacağınızı öğreneceksiniz, işlevsel, güvenli, güzel, kullanışlı ve en önemlisi pratik hale getireceksiniz. Bir siteyi güvenli ve daha pratik hale getirmek, web sitenizden video ve ses kaydetmek için makine öğrenimini ve bilgisayar vizyonunu nasıl kullanacağınızı öğreneceksiniz, sesli örnekler oluşturmak için sesinizi bağışlayın ve sesli örnekler oluşturacak ve insanları sunduğunuz tüm faydalı bilgileri paylaşmak için doğrudan kendinize bağlantı verebileceğiniz en iyi web sitelerini kullanarak, insanları daha da önemli olarak kendinize ve daha da önemli ölçüde paylaşmak için gürültüyü nasıl kıracağınızı öğreneceksiniz. Bu kitap, en yoğun olarak, otomatik ve sağlam iken yanlış olanları gerçekçi, pratik, eller üzerinde ve etkileşime girerek yanlış olanları devre dışı bırakarak Web için yararlı yazılımlar oluşturmanıza yardımcı olacak en büyük üç bileşen olan medya, güvenlik ve makine öğrenimine odaklanacaktır. Bu kitap UNIX, özellikle Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript ve Python gibi istekler gibi bir dizi yararlı yazılım paketini ve GIT ve FFMPEG gibi yararlı BASH yazılımlarını öğretir. Ayrıca, kripto para birimini otomatik olarak nasıl takas edeceğinizi ve kripto para biriminde veya normal banka kartlarından ödeme almayı öğretirken, ziyaretçilerinize bunu yapmayı seçerseniz gelirinizden bir pay ödeyecek. Reklamcılık yoluyla web sitenizden nasıl para kazanacağınızı, uygulamanızı arama motorlarına nasıl hazırlayacağınızı ve hızlı yapacağınızı, müşterilerinizin sizi bulmak için arayacakları ilk sıralamada ve mümkün olduğunca çok yaygın arama sıralamasında nasıl sıralayacağınızı öğreteceğim. Size yazılımınızı nasıl satacağınızı, reklamı yapacağınızı, hizmetlerinizi arayan müşterilere nasıl hitap edeceğinizi ve zaten var olan, ucuz ve iyi çalışan yollarla internette kendiniz için bir isim yapacağımı öğreteceğim. Verilerinizi sizin için çalışan bulut bilgisayarlarına nasıl kaydedeceğinizi ve verilerinizi ucuz bir şekilde kaydedeceğinizi, kullanıcılarınızın ne istediğini ve ne istediğinizi ve kullanıcılarınızı bildirimler, e -posta, metin mesajları, telefon görüşmeleri ve daha fazla yolla, kullanıcılarınızı bir düğmenize geri döndürerek telefonlarına bir musluk koyarak nasıl tutarak nasıl planlayacağınızı öğreteceğim. Bu kitap, metnden fotoğraflara, videolara, sese (müşteriniz) iyi bir izlenim bırakan ve kendinizi, sizin ve sadece siz temsil eden bir uygulama oluşturmak için yaptığınız herhangi bir şekilde satmak için büyük miktarlarda medya yayınlamanın ve dağıtmanın pratikliğine odaklanacak ve kendinizi, yazılımınızı ve şirketinizin mümkün olan en iyi şekilde iyi görünmesini sağlayacaktır. Ayrıca, kodlama ipuçlarından, makyaj ve fotoğrafçılık gibi pratik makyaj, modelleme ve oyunculuk ve daha fazlasını, kendinizi ve şirketinizi, yazılımınızı gerektiğinde sağlıklı bir denge dengesini kullanarak, daha fazla çaba, çalışma veya parayla frupiting yapmak için sizin için mevcut tüm araçları kullanarak mümkün olan tüm araçları kullanarak mümkün olan en iyi ışıkta tasvir etmek için önemli olacaktır. Bu kitaba "PratikWeb Tabanlı Derin Öğrenme ve Güvenlik Örnek "Bir Sebep: Özellikle Web için, özellikle güvenliğe odaklanarak, metinde belirtilen pratik amaçlara odaklanarak, bu metnin öğrenme bileşenine, makine öğrenimini kapsayan, görüntüyü güçlendirecek, görüntü geliştirecek, görüntünün nasıl çalıştırılacağını gösterecek, görüntünün nasıl çalıştırılacağını gösterecektir. Görüntü altyazısı ve görüntülerden kaynaklanan tahmin metrikleri, otantik, bilgisayarla aktarılan bir görüntü veya bir görüntünün fotoğrafı veya basılı bir fotoğraf, web güvenliği ve yazılım güvenliği söz konusu olduğunda çok önemlidir. Bir sunucu bilgisayarı bu güvenli hale getirebilirsiniz, normalde bir kullanıcı adı ve parola isteyecek bir bilgisayar yapabilirsiniz, belki de her yeni giriş veya yeni IP adresi için bir onay jetonu ile, ancak büyük ölçekli, temel olarak güvenli ve güçlü bir yazılım oluşturuyorsanız, yazılımınızı bir başkasının yazılımına çok yakın bir şekilde kullanabilir. Kusursuz bir şekilde güvenli olan yazılım oluşturan herkes, bunun ne anlama geldiğine dair bir fikre sahiptir. Yazılım doğal olarak güvensizdir, çünkü ona erişmek için kullandığımız cihazlar ve hesaplar her zaman elimizde değildir, yazılım için kötü niyetli olan herkesin elinde olabilirler ve bu nedenle yazılımın kendisi için bir risk oluşturabilir. Bu kitabın odak noktası. Ağa bağlı bir bilgisayar varsayılan olarak, SSH veya Secure Shell tuşu olarak adlandırılan ve SSH veya Güvenli Kabuk Tuşu ile uzun bir anahtar belirteci ile sabitlenir ve aksi takdirde en iyi bir web sunucusu ile sabitlenir, çünkü web sunucusu sunucunun kendisinde çalışan en iyi güvenlik araçlarının yanı sıra açık erişim sağlar. Web sunucusu, kullanıcının cihazının tartışmasız en güçlü kısmı olan kullanıcının web tarayıcısına erişebilir, çünkü kullanıcının ağa bağlı yazılımlara erişebileceği yerdir. Bu araç seti, gördüğünüz web sayfalarını oluşturabilir ve görüntüleri, ses ve videoyu (bir yüzün veya durum kimliğinin fotoğrafı gibi) kaydedebilir, Bluetooth radyo cihazlarına okuyabilir ve yazabilir ve yakın alan transponder etiketleri, ucuz anahtar kartlar, fob'ler, çıkartmalar, çıkartmalar, yüzükler ve hatta yazılı olarak yazabilir ve yazabilir. Emrünüzdeki tüm araçları kullanarak, bu kitapla güvenli bir web sitesi oluşturmak için kendinizi bilgi ile donatacaksınız ve genel olarak sizin için çalışan, teklifinizi yapan ve hissi veren ve hissi veren güvenli bir ağa bağlı bilgisayar sistemi olacaksınız.

Nereden başlamalı: Özellikle daha önce kodlama konusunda veya bu kitapta ayrıntılı olarak açıklanacağım araçlardan herhangi birine sahip olduğunuz ve kullanım durumlarını ve pratik örneklerini belgelemeniz durumunda, bu kitaba veya herhangi bir bölümle başladığım bölümü veya herhangi bir bölüme başladığım bölümden geçebilirsiniz. Kodu yazma deneyiminiz yoksa, bu kitabın tümünü okumanızı ve özellikle bu kitabın sizin için doğru olduğundan emin olmak için önceki bölümleri okumanızı tavsiye ederim. Bu kitap sizin için doğru değilse, web gelişimini kendileri öğrenmek isteyebilecek bir arkadaşa veya akrabaya vermeyi düşünün ve hatta onu bir öğretmen olarak başarısız olduğum boşlukları doldurmak için geri ödünç almayı ve onlardan öğrenmeyi düşünün. Olacağınız yere başlayın, bu kitabın her kısmı kullanışlı bir uygulama oluşturmayı düşünüyorsanız yararlı olacaktır ve en iyi uygulamaların son kullanıcıyı göz önünde bulundurarak oluşturulduğunu düşünün: müşterinizi tanıyın. Şimdi beni biliyorsun, bu kitabı biliyorsun ve başlamaya hazırsın. Başlamak için bir bilgisayar alın (bir kutudan, Amazon veya eski bir masaüstü çalışmasının en ucuz dizüstü bilgisayarını bile yapın ve sizin için işe yarayacak şekilde ayarlayın.

Bu Kitap Nasıl Okunur: Vurgulanan metin, metnin çalıştırdığınız kodu yazacağınız bir komut istemine ait olduğunu belirtir. Komut istemi büyük ölçüde klavye odaklıdır ve çok az tıklama veya hiç tıklama, iş akışınızı hızlandırma ve sizin için işleri kolaylaştırır.

Başlarken: Dalış yapalım. Yerel bir makinede kod oluşturarak başlayacağız ve İnternet'e bağlı bir web sitesi oluşturmadan başlayacağız. Bu başlamak daha güvenlidir, hiçbir maliyeti yoktur ve sizin için kolaydır. İşletim sisteminize bağlı olarak, bir bash kabuğuna girmek biraz farklı olacaktır. Mac OS için, sanal bir makineyle en fazla uyumluluğu elde edeceğiniz için bu noktada bir sanal makine kurmanızı öneririm. VirtualBox ve Paralells gibi çeşitli sağlayıcılar sizin için bir sanal makine çalıştırabilir, ancak hızlı, aerodinamik bir deneyim oluşturmak için önerilen yerel bir ortam kullanmayı tercih ediyorsanız, Ubuntu'yu doğrudan makineye yüklemek de mümkündür. Önerdiğim Linux veya Windows kullanıyorsanız, bir proje oluşturmak oldukça kolay olmalıdır. Terminalinizi açın, boyutlandırmayı uygun gördüğünüz gibi ayarlayın ve 2. adımı takip etmeye başlayın. Windows kullanıyorsanız, lütfen 1. adımı izleyin.

1. Adım: - Yalnızca Windows Kullanıcıları Windows'ta yönetici ve tür olarak komut istemini açın WSL –

2. Adım: - Buraya devam edin veya Windows kullanmıyorsanız 1. Adımı buraya atlayın Açık bir terminalde (işletim sisteminize bağlı olarak, Windows'ta Ubuntu, Mac veya Linux'ta Terminal veya benzer bir ad olarak adlandırılır) bir proje oluşturarak başlayın. Bunu bir dizin oluşturan MKDIR komutu ile yapıyoruz. Önerilen projenizi saklamak için bir dizin oluşturmanız gerekiyorsa, dizinde değiştirmek için CD komutunu kullanın ve ve

CD/PATH/TO/DIALTORY - Yol, hedef dizininizden önce gelen klasörlerdir (dosyalar), varsayılan yolunuz ~ veya/home/kullanıcı adıdır (kullanıcı adı kullanıcı adınızdır). Varsayılan dizin olarak değiştirmek için CD veya CD yazın ~ MKDIR Örneği - "Örnek" i dizinin adıyla değiştirin

Şimdi projeniz için bir çalışma dizininiz var. Farklı bir makineye geçmeniz veya yazdığınız kodu dağıtmanız gerektiğinde bu dizinin kaydedilmesinin çok önemli olduğu için, web için hazır olacak şekilde, önümüzdeki birkaç adımda dizininizi yedeklemek için bir komut dosyası oluşturacağız. Ancak bir komut dosyası oluşturmak biraz kod alır ve kodun mümkün olduğunca yararlı olması için otomatikleştirilmesi gerekir. Öyleyse önce senaryolar oluşturmak için bir komut dosyası oluşturalım. Komut dosyasını oluşturarak ve yürütülebilir hale getirerek başlayalım. Bunun için sudo, chmod kullanacağız ve dokunacağız ve senaryoyu "ascript" olarak adlandıracağız.

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

Şimdi komut dosyasını oluşturduk, yürütülebilir hale getirdik ve düzenlemeye hazırız. Nano, tıklamadan metni düzenlemenize izin verecek bir metin düzenleyicisidir, bu da grafik kullanıcı arayüzünü kullanmaktan çok daha kolaydır. Nano ile bir dosya düzenlemek için Nano ve ardından dosyaya giden yolu kullanın. Bir komut dosyası oluşturan bir komut dosyası oluşturmak için, senaryomuzu ilk etapta yapmaya oldukça benzer. "Ascript" komut dosyasının adını bir bağımsız değişken parametresi, 1 $ ile değiştirerek yukarıdaki ile aynı kodu kullanacağız. Bu, komut dosyasını basitçe sudo asscript Newscript yazarak çağırmamızı sağlar, bu noktada "Newscript" i komut dosyasının adıyla değiştirerek yeni bir komut dosyası oluşturabiliriz. Nano'daki kod:

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

Nano'yu kapatmak için, kontrol tuşunu basılı tutabilir ve X'e basabiliriz, sonra D dosyayı kaydettiğimizi ve geri dönüşü vurduğumuzu belirtmek için Y. Şimdi bir komut dosyasını düzenlemek için bu üç komutu yazmak yerine, komut dosyasını tekrar düzenlemek için sudo ascript ascript yazabiliriz. Bu işe yarıyor! Ve herhangi bir yeni komut dosyası kabukta çağrılarak kolayca çalıştırılabilir. Şimdi çalışmamızı kaydedelim: Yeni komut dosyamızı kaydetmek için bir yedekleme komut dosyası yazalım ve ardından yedek komut dosyasını da yedeklerken proje dizinimizde yedekleyelim.

sudo ascript backup

Şimdi, Nano'da:

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

Nerede/yol/to/dizin, MKDIR ile oluşturduğunuz projeye giden yoldur. Daha sonra, böyle tekrar yolları daha az kod olan bir döngü ve bir liste ile nasıl kopyalayacağımızı öğreneceğiz, ancak şimdilik basit tutalım ve birkaç satıra sahip olalım. Bu komut dosyasını çalıştırmak ve kodunuzu yedeklemek için dosyayı Nano'da Control+X, Y ile kaydedin ve geri döndürün ve aşağıdakileri kabuğunuza yazın

backup

Bu kitabı okurken ve kabukla takip ederken bir şifre için istenirse, lütfen kullanıcı şifrenizi doğru bir şekilde girin, komutu yeniden çalıştırmanız gerekmeden önce üç denemeniz olacaktır. İki kez bir şey çalıştırmanız gerekirse, komutları yeniden çalıştırmak ve düzenlemek için yukarı ve aşağı okları kullanabilirsiniz. Bir komut seçmek için aralıklı olarak yukarı ve aşağı bastırın, komutu sağa, sol okları ve silme tuşunun yanı sıra klavyeyi de düzenlemeden önce ve geri dönüşle çalıştırın.

Tebrikler! Çalışma dizininizde iki önemli kabuk komut dosyasını yedekleyen harika bir yedekleme komut dosyası oluşturmayı başardınız. Proje büyüdükçe işleri daha sonra hareket ettirebiliriz, ancak bu şimdilik çalışıyor. Bulutta yedeklemeye geçelim, bunun için GitHub'ı kullanacağız (yedekleme için çok sayıda başka git çözümü olsa da, hepsi aynı.) Git, yazılımınıza bir sunucuya yaparken tüm kopyaları indirmenizi sağlayan bir verisi kontrol yazılımıdır. Yazılımınızı kaydetmede etkilidir, özellikle de tek bir kod satırı başarısız olduğunda bazen kırılan Linux örneklerine geçerken, otomatik olarak yedekleme şansına sahip değilseniz, kodunuz yedeklenmeyebilirken sizi kilitlemenizi sağlar.

Bu noktada zaten bir Ubuntu sanal makinesi kullanmıyorsanız, bu noktada bir Ubuntu sanal makinesini kullanmayı öneriyorum, çünkü çalışan bir web sitesi oluşturmak ve bilgisayarınızda derin öğrenme işlemlerini hazırlamak için gerekli tüm paketleri yüklerken hayatınızı kolaylaştıracaktır. Kodu yakın gelecekte bir web sunucusuna taşıyacağız, ancak web sunucumuzun arkasında kimlik avına dirençli en az birkaç güvenlik katmanı olduğundan ve bunu yapmak için bir dizi Linux paketini kullandığından emin olmak istiyoruz. Hala Mac OS kullanmak istiyorsanız, gerekli paketleri çevrimiçi olarak arayabilir ve yükleyebilirsiniz, ancak bu kitap veya seri kapsacağı her paket için alternatifler olmayabilir.

Sudo ascript yedekleme komutunu çalıştırarak yedekleme komut dosyası ile çalışmamızı yapmak için birkaç komut ekleyelim.

# …

Bir kez daha, kaydetmek için X'i kontrol edin.

Şimdi bu proje için bir kez yapılandırma yapmamız gerekiyor. Yakında bir GIT projesi olacağı için, her komutu bir GIT deposundan her konuşlandırdığımızda yazmamız gerekmez, ancak dağıtım komut dosyalarımızı yazdığımızda bunu asacağız. Başlamak için, doğru dizinde olduğumuzdan ve Git deposunu başlattığımızdan ve SSH tuşlarını oluşturduğumuzdan emin olalım.

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

SSH-Keygen'i yazdıktan sonra, yeni anahtar .ssh adlı bir klasör altında ana klasöre kaydedilmelidir. Buna id_rsa.pub denir. Bu anahtarı bulalım ve kopyalayalım. Görmek için

cd ~
cat .ssh/id_rsa.pub

Son komut tarafından döndürülen metni kopyalayın ve hesabınıza SSH tuşunu eklemeden önce GIT sağlayıcınızla (ideal olarak GitHub) bir hesap oluşturun. Bir hesabınız olduğunda, SSH tuşunuzu menüde erişim altında SSH ve GPG anahtarlarına eklemeden önce sağ üst menüyü tıklayın ve ayarları girin. Yeni bir depo oluşturmak için GitHub'a kaydetmeden ve geri dönmeden önce bir SSH tuşu ekleyin ve bir başlık vererek ekleyin. Bu, diğer git sağlayıcılar için benzerdir, belgelerini okumanız gerekecektir. Yeni depo yapılandırmasında, deponuza açıklayıcı bir ad verin ve yayınlamak isteyip istemediğinize karar verin ve henüz dahil edilmek üzere hiçbir dosyayı yapılandırdığınızdan emin olun. Depo oluşturulduktan sonra, klonu SSH URL ile kopyalayın ve aşağıdaki komuta yapıştırın.

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

Şimdi CD ile deponuza geri dönebilirsiniz, buna aşina olacaksınız. Yedekleme komut dosyasını şimdi yedeklemeyle deneyin

Harika! Şimdi gerçekten kodlayabiliriz. Bash ve git üzerinde iyi bir kavrayışa sahip olduğumuza göre Django'yu yükleyelim. Django yazılımımızı otomatik olarak yedeklememize izin verecek, Bash bunu da yapabilir, ancak Django daha basit bir uygulamaya sahip olmalıdır (devre dışı bırakılabilir ve daha kolay yapılandırılabilir).

Ubuntu'ya yazılım yüklemek için Sudo Apt-Get komutunu kullanacağız. İlk olarak, zaten sahip olduğumuz yazılımı güncelleyelim ve yükseltelim. Bu, sudo apt-get güncellemesi ve sudo apt-get yükseltme -y ile yapılabilir. Ardından, Python'u ve sanal ortamımızı, kodumuzun evini, aşağıdaki komutla yükleyelim: sudo apt-get Instow Python-is-python3 python3-venv

Ubuntu örneğinde yazılım yüklemeleri açısından Django ile gitmek için ihtiyacınız olan tek şey budur. Windows ve Linux için bu oldukça basit olmalıdır, ancak Mac için üzerine bir sanal makine ve Linux yüklemek isteyebilirsiniz. Ubuntu bu durumda kritiktir, çünkü web sitelerinin çalıştırdığı yazılımdır ve yukarıda belirtilen tüm yazılımlarla web sitelerini barındırmalarını sağlar.

Django'ya girelim.

Yine dizinimizde, CD ile:

python -m venv venv # Kodun depolandığı sanal ortamı oluşturur
source venv/bin/activate # Sanal ortamı etkinleştirir
django-admin startproject mysite . # Mevcut dizinimde başladığım proje MySite.

Django bizi yeni başlıyor, çünkü Django web sunucusuna ev sahipliği yapıyor ve temel bir yerel web sitesini hazırlamak için ihtiyacımız olan her şeyi yapıyor. Artık Django'yu yüklediğimiz için, ihtiyacımız olan nasıl çalışmasını sağlamak için ayarları biraz düzenleyelim. İlk olarak, yeni bir uygulama oluşturalım

python manage.py startapp feed

İlk uygulamanın Feed denildiğini fark edeceksiniz. Uygulama ne istersen olarak adlandırılmalı ve yeni uygulamalar oluşturacağız, ancak uygulama kodda her referans alındığında her uygulamanın adı tutarlı olmalıdır. Yeni bir uygulama eklemek için, her zaman settings.py'yi düzenleyeceğiz ve bu da AhsteProje, bundan sonra uygulama olarak adlandırılan uygulamanın oluşturulan diğer dizinde düzenleyeceğiz. Nano kullanma,

nano app/settings.py

Ayarlarda, yüklemeli_apps bulun ve [] 'i 3 satıra ayırın. Boş merkez hattında dört boşluk kullanarak 'besleme' ekleyin veya uygulamanızın adı. Settings.py'nin bu bölümü şöyle görünmelidir:

INSTALLED_APPS = [
    'feed',
]

Unutmadan önce Django'nun çalıştığını test edelim. Python Manage.py Runserver 0.0.0.0:8000 komutunu kullanarak, sunucuyu çalıştırabilir ve daha sonra kodu http: // localhost: 8000 olarak çalıştıran bilgisayardaki bir web tarayıcısında gezinebiliriz ve örnek bir web sayfası görün (çalışır!) Sunucuyu diğer komutlarla aynı şekilde kontrol C ile bırakın.

Şimdi, bazı Python kodu yazmaya başlayalım. Django'nun hepsi tamamen kod tarafından işletilen üç ana bileşeni var. Bileşenlere model, görünüm ve şablon denir ve web sayfası kullanıcıya teslim edilmeden önce her biri sırasıyla daha yüksek ve daha düşük seviyededir.

Model, alım, sıralama ve oluşturma için veritabanında bilgileri depolayan koddur.

Görünüm, modelin nasıl oluşturulduğuna, manipüle edildiğine ve değiştirildiğine karar verir, hemen hemen her görünüm doğrudan bir model kullanacaktır.

Şablon, şablon dili olarak adlandırılan bazı ekstra çan ve ıslık ile HTML kodudur. Şablon, Python kodu ve modeller ve bilgiler (usuall dizeleri ve tamsayılar) gibi bağlamla doldurulduğu görünümle oluşturulur.

Django'nun başka bileşenleri de var, ancak bunlarla sınırlı değil:

Uygulamayı tartıştığımız gibi yapılandıran ayarlar.

Web uygulamasının belirli bölümlerine erişmek için kullanıcının izlediği kalıplar olan URL'ler.

Sunucuya gönderilen bilgilerin veritabanına ve kullanıcıya nasıl işlendiğini ve işlendiğini tanımlayan formlar. Bunlar, sunucu tarafında bilgilerin işlenmesinin temelidir ve bilgisayarın depolandığı her türlü bilgiyi kabul edebilir, özellikle metin dizeleri, sayıları ve doğru/yanlış boolean (genellikle onay kutuları).

HTML kodu ve şablon dili olan ve Python ve HTML arasındaki boşluğu köprüleyen şablonlar, yani Python bilgileri, herkesin erişebileceği ve Python kodunu Web için erişilebilir hale getirebileceği ve sunucu yakınında olması gerekmeyen çeşitli amaçlar için kullanışlı hale getirebileceği HTML kodu olarak sunulabilir.

Genellikle JavaScript olan statik dosyalar ve sunucunun hizmet verdiği ve şablonla bağlantılı olan kütüphaneleri.

Sunucunun hizmet verdiği veya harici olarak barındırılan veya işlenmeden önce sunucuya yazılı olarak yazılı olarak yazılı olarak yazılan ve barındırma için başka bir sunucuya (bir kova) gönderilen medya dosyaları.

Her görünümle aynı zamanda çalıştırılan ve görünümde "dahil" olarak kabul edilen kod parçaları olan ara katman yazılımı.

Her bir görünümün bağlamını işleyen ve ekstra bağlam eklemek için kullanılan bağlam işlemcileri.

Görünüm oluşturulmadan önce kullanıcının veya talebin belirli gereksinimleri geçtiğini doğrulayan testler.

WebSocks'ın iletişimi nasıl ele aldığını ve iletişime nasıl yanıt verdiğini belirleyen tüketiciler.

Veritabanının grafik bir arayüz aracılığıyla uygulanabileceği Django yönetici sayfasında ayrıntılı olarak manipüle edilebilecek şekilde modelleri kaydetmek için kullanılan yönetici.

Django kodunun eşzamansız görevleri tanımlayan kereviz, bir sonraki göreve veya kod satırına hemen geçmeden önce çalışmaya başlayabilir.

Django'nun burada ayrıntılı olarak tartışacağımız birçok bileşeni olabilir. Django'yu daha işlevsel hale getirmenin, hızlı, aerodinamik iletişim kanalları, eşzamansız görevleri yürüten kereviz ve django'yu genişletmek için, özellikle kodun çoğunun yürütüldüğü görünüm fonksiyonlarında çok sayıda diğer yazılım parçasını eklemenin birçok yolu vardır. Görünüm işlevleri anahtardır, çünkü genellikle belirli bir URL modeline veya sunucunun bir bölümüne özgü her kod parçasını bildirirler.

İlk olarak, görünüm işlevlerini keşfedelim. Görüntüle İşlevler, görünümde kullanılacak kodu gösteren ve normal işlev tanımları veya sınıfları kullanılarak tanımlanır. En basit görünümler, işlev tanımı DEF ile tanımlanır ve temel bir şablonla bir httpreponse döndürür. "Merhaba Dünya" metnini döndürmek için temel bir görünüm tanımlayarak başlayalım. DEF gibi bir ifadeden sonra her kod eklediğinizde, işlevinize uygulamak istediğiniz önceki tanımların her biri için 4 boşluk eklemeniz gerektiğini unutmayın. Bunların her birinin yakında ne anlama geldiğine gireceğiz.

Sitemizin dizininden Nano kullanarak Feed/Views.py dosyasını düzenleyin ve dosyanın sonuna aşağıdaki satırları ekleyin.

from django.http import HttpResponse

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

Django'nun HTTPResponse, açılış ve kapanışla gösterilen bir metin dizesi ile yanıt verir '. İstek veya dize gibi bir işleve veya sınıfa her aktardığınızda parantez kullanmanız (, açma ve kapanış) kullanmanız gerekir.

Henüz görüşümüzü görmemiz gereken bu değil. Tabii ki, sunucuya görünümün tam olarak nerede olduğunu söylemedik, yine de görünümün oluşturulması gereken bir yolu tanımlamamız gerekiyor. Uygulama/urls.py'de temel bir yol tanımlayarak başlayalım ve daha sonra yol gruplarına gireceğiz.

App/urls.py'de, yeni oluşturduğumuz görünümü içe aktardıktan sonra içe aktarma ifadelerinden sonra bir satır ekleyin.

from feed import views as feed_views

Şimdi görünüm modelini tanımlayalım. Görünüm kalıpları, sunucunun sunucuda görünümün nerede olduğunu (kullanıcının web sayfasına girmek için navigasyon çubuğuna yazdığı URL yolu), görünümün görünüm bileşeni ve görünüm için dostça bir ad olduğunu söyleyen üç bileşene sahiptir, bu nedenle bir şablonla çalışırken, özellikle bir görüntü için gerektiğinde veya gerektiğinde gerektiğinde, gerektiğinde desenini geri almak kolaydır. İşleri bu şekilde yapmak ve esnek olmak mantıklıdır, çünkü kod tabanınız değerli ve çalışması kolay olmak için esneklik ve doğaçlama gerektiren sürekli değişen bir ortam olacaktır. Görüşünüz nasıl görünecek, bunu urlpatterns = [uygulama/urls.py bölümüne ekleyebilirsiniz. Görünüm modeli, yukarıda açıklanan üç bileşen ve yol adı verilen bir işlevle tanımlanır. URL kalıplarınız bir listedir, bu nedenle içindeki her öğeyi her zaman bir virgülle bitirdiğinizden emin olun, çünkü bu her birini ayırır. Her öğe, tıpkı settings.py'deki uygulama gibi, bir kez daha önünde dört boşluk olan yeni bir satıra geçmelidir. Web sunucusunun kök dizininde çalışan bir görünüm oluşturmak için görünümün ilk bileşenini boş bir dize işleviyle tanımlayacağız. Urls.py şimdi şöyle görünmelidir:

from feed import views as feed_views

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

Bu, tamamen statik olan Django ile bir web sitesi oluşturmanın temelidir. Görüntüler, videolar, ses ve daha fazlası gibi bilgileri önbelleğe almaya başlayabileceğimiz daha dinamik bir web sitesi yapmak için, bir sonraki keşfedeceğimiz modelleri kullanmamız gerekecek. Şimdilik kodumuzu kontrol edelim ve sunucuyu çalıştıralım. Kodu hatalar için kontrol etmek için:

python manage.py check

Herhangi bir hata mesajı varsa, uygulamanızda yaptığınız değişiklikleri dikkatlice gözden geçirmeli ve yabancı veya eksik bir alan, ekstra bir karakter, kaplamayan bir ip, herhangi bir yazım hatası, yanlışlıkla silinen herhangi bir karakter veya başka bir şey gibi düzeltilmesi gereken bir şey olup olmadığını görmelisiniz. Hata mesajını okumak (eğer varsa), bir satır numarasıyla birlikte oluşturduğunuz veya düzenlediğiniz bir dosyaya giden yolu görebilmeniz gerekir, bu nedenle bu dosyaya ve satıra bakın ve orada olan bir şeyi düzeltip düzeltemeyeceğinizi görün. Sorunu çözdüyseniz, yukarıdaki komutu tekrar çalıştırın. Yazılımınız çalışmaya hazır olduğunda ve çalıştığında, "Sistem kontrolü hiçbir sorun tanımlamadı" çıktısını göreceksiniz. Şimdi gitmeye hazırsın. Sunucuyu şu şekilde çalıştırın:

python manage.py runserver 0.0.0.0:8000

Şimdi bir web tarayıcısı açın ve http: // localhost: 8000 adresine gidin. HTTPResponse işlevinin parantez ve alıntılarında döndürülen metni görmelisiniz. Bu sadece temel bir örnektir, ancak şimdiye kadar yaptıysanız, Linux, Bash, Python ve Django'nun nasıl çalıştığının temellerini anlıyorsunuz. Bazı veritabanı modellemelerini daha derinlemesine inceleyelim ve bir Python sınıfının bilgi depolamada gücünü keşfedelim. Ardından, sitemizi JavaScript ve makine öğrenimi kullanarak tam özellikli, esnek ve güvenli hale getirmeden önce HTML ve CSS üzerinde bir kavrama almaya başlayacağız.

Sınıflar, uygulamanızın Models.py'de saklanır. Nano'yu kullanarak App/Models.py'yi düzenleyin ve yeni bir sınıf ekleyin. Bir sınıf sınıf tanımı ile tanımlanır ve bu durumda modellerde miras aldığı bir üst sınıfın geçirilmesi. Sınıfın adı sınıf tanımından sonra gelir ve sınıf tanımı A: (kolon) kullanıldıktan sonra, sınıfa bağlı özellikler ve işlev tanımları aşağıda belirtilmeden önce. Sınıfımızın onu almak ve benzersiz tutmak için kullanabileceğimiz bir kimliğe ihtiyacı var ve ayrıca bazı bilgileri saklamak için bir metin alanına ihtiyacı var. Daha sonra bir zaman damgası, dosyalar, booleanlar (kodumuzun modelle ne yapacağına karar vermesine yardımcı olabilecek ve bunu sıralamak için kullanılabilen gerçek veya yanlış tanımlar), modeli sunucuya giriş yapan bir kullanıcıya ve daha fazlasını ekleyebiliriz. Aşağıdaki kodu açalım:

from django.db import models # Sınıfımızı tanımlamak için kullanılan ithalat ve özellikleri
class Post(models.Model): # Sınıfımızın kendisinin tanımı
    id = models.AutoField(primary_key=True) # Modeli sorgulamamıza, benzersiz tutmamıza ve oluşturulduktan sonra modelle etkileşime girmemiz gerektiğinde kullanışlı olan otomatik olarak oluşturulmuş bir anahtar olan modelimizin kimliği.
    text = models.TextField(default='') # Sınıfımızı, bu durumda, bazı metinleri, boş bir dizeyi temerrüde atan nitelendirir.

Dosyayı daha önce bitirmek için yaptığımız gibi kapatın ve kaydedin.

Uygulamamız geliştikçe bu sınıfı güncellediğimizde keşfedeceğimiz birçok alan ve seçenek var, ancak bu, bazı metinler göndermek için bir uygulama oluşturmanın temel gereklilikleridir. Ancak, bu model yalnız çalışmayacak. Daha önce açıklandığı gibi, bu modelin çalışması için özel bir görünüm ve özel URL modeline ihtiyacımız olacak ve ayrıca bir şablonla birlikte bir forma ihtiyacımız olacak. Önce formu keşfedelim.

Bir form tanımlamak için App/Forms.py'yi Nano ile düzenleyin ve aşağıdaki satırları ekleyin. Form sınıfımızın yanı sıra oluşturduğumuz model (feed.models.post), modele benzer bir sınıf tanımı ve formun etkileşime girdiği modeli tanımlayacak bir alt sınıfla birlikte bir alana ihtiyacımız olacak. Form ayrıca, istek, model veya başka türlü bilgilere göre ayarlayan bir başlatma işlevine de sahip olabilir, bunu daha sonra keşfedeceğiz.

Model formları çok kullanışlıdır çünkü bir model oluşturabilir veya bir modeli düzenleyebilirler, bu yüzden bunları her ikisi için de kullanacağız. Aşağıdaki Forms.py'de birini tanımlayalım.

from django import forms
from feed.models import Post

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

Bu, bir form ve modelin neye benzediğinin temelleridir. Bu model formu, içerdiği metni değiştirerek bir yayını başlatmak veya düzenlemek için kullanılabilir. Bu formu bir sonraki manzaraya entegre etmeye bakacağız. İlk olarak, kodumuz çalıştığında modelle etkileşime girebilmesi için geçiş yapalım ve veritabanını taşıyalım. Bunu yapmak için aşağıdaki komutları çalıştırın:

python manage.py makemigrations
python manage.py migrate

Bunun yürütülmesi bir dakika sürecektir, ancak bir kez yapıldıktan sonra, modele görünümlerde, ara katman yazılımı veya yazılımdaki başka bir yerde erişmenize izin verecektir. Modelimizi görebileceğimiz bir görüş yaparak devam edelim. Feed/views.py'yi düzenleyin ve belirtildiği gibi aşağıdaki kodu ekleyin. # İşaretten sonra hiçbir şey eklemeniz gerekmez, bu kod kodla ilgili bilgileri belirtmek için kullanılan yorumlardır. Modelimizi görünümlerde içe aktararak ve bunu bir şablonda ekran için bir liste olarak oluşturabileceğimiz bir bağlama ekleyerek başlayacağız. Ardından, modele dayalı yeni bir nesne oluşturmak ve sunucuya göndermek için formu ve modeli bir düğme ile oluşturabileceğimiz bir şablon ekleyeceğiz. Bu karmaşık geliyor, bu yüzden adım adım atalım. Görünümü bitirmeden önce, sadece modeli oluşturan bir şablon oluşturalım ve kabukta yeni bir yazı oluşturarak görebildiğimizden emin olun. İşte bu görüş nasıl görünmelidir:

    posts = Post.objects.all() # Veritabanındaki tüm yayınları şimdiye kadar sorgulayın

Bu dibe ulaşana kadar hepsi oldukça basit görünüyor. İşlev tarafından bir önceki örnek gibi bir HTTP yanıtı yerine döndürülen değer, her zaman ilk giriş olarak bir isteği alır, şimdi şablonda oluşturulabilen ve işlevde tanımlanan şablonu döndüren bir bağlamı (bu durumda veritabanındaki yayınları) kabul eder. Şablon, Python bilgisini HTML'ye dönüştüren Jinja2 adlı bir dilin biraz olduğu bir HTML belgesi olacak.

Şablon oluşturmaya başlamak için Feed'de iki dizin oluşturun.

mkdir feed/templates
mkdir feed/templates/feed

Ardından, yukarıdaki dizinde bir şablonu düzenleyin, besleme/şablonlar/besleme ve bu örnek için kodu ekleyin. Bu örnek için şablona bakalım.

Bu çok basit bir şablon. HTML etiketlerini açma ve kapatma, bir belge türü etiketi, efsane başlıklı bir gövde etiketi, ekran boyunca küçük bir satır ekleyen bir ara etiketi ve şablonda bir paragraf olarak yayınlar listesindeki her gönderiyi oluşturan bir döngü için A for döngü tanımlar. Mesajları oluşturmak için gereken tek şey budur, ancak veritabanında henüz hiçbiri yoktur. Kabukla biraz yaratalım. Manage.py ile kabuğu çalıştırabiliriz

python manage.py shell

Şimdi yazı modelimizi içe aktaralım

from feed.models import Post

Ardından, bir ip içeren basit bir yazı oluşturacağız ve kabuktan çıkacağız. Dize, geçerli metin olduğu sürece herhangi bir şey olabilir.

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

Son olarak, beslememize bir URL deseni eklememiz gerekecek. Feed uygulamamız birden fazla URL kullanacağından ve dosya boyutlarını küçük tutmak istediğimiz için, feed uygulamamızda şöyle görünen yerel bir urls.py oluşturalım:

from django.urls import path
from . import views

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

Ayrıca urls.py'yi temel uygulamada düzenlememiz gerekecek, ne dediğimiz her ne olursa olsun, bu oluşturduğumuz ilk dizinti. App/App.py'yi düzenleyin ve URL modellerine aşağıdakileri ekleyin

from django.urls import include # üstte
    # ... Önceki kod burada

Şimdi, sunucuyu python manage.py runserver ile çalıştırdığımızda, veritabanındaki öğelerle birlikte model, görünüm ve şablonun yanı sıra URL desenimiz olduğu için oluşturduğumuz sayfayı göreceğiz. Ardından, oluşturduğumuz formu uygulayalım ve kendi yayınlarımızı oluşturmaya başlayalım. Ancak çok fazla kod yazmadan önce, daha önce yazdığımız komut dosyasını kullanarak bir yedekleme yapalım. Bu komut dosyasını kabukta çalıştırın, birkaç dakika bekleyin ve tüm kod Git depomuza yedeklenecektir.

backup

Formun uygulanması nispeten basittir. Formumuzu içe aktaracağız, görünüme bir post isteği işleyicisi ekleyeceğiz ve aynı görünüme yönlendirmeden önce gönderiyi veritabanına kaydedeceğiz. Zaten içe aktardığımız yönlendirme işlevini ve görünüm modeli için URL'yi almak için Ters adını verilen başka bir işlevi kullanabiliriz. Bunu, dahil edilen desenin ad alanı beslenir ve görünüme de besleme olarak da adlandırıldığından 'feed: feed' dizesi ile sorgulayacağız.

    posts = Post.objects.all() # Veritabanındaki tüm yayınları şimdiye kadar sorgulayın
    if request.method == 'POST': # Gönderi isteğini ele alalım
        form = PostForm(request.POST) # Formun bir örneğini oluşturun ve verileri ona kaydedin
        if form.is_valid(): # Formu doğrulayın
            form.save() # Yeni Nesneyi Kaydet
        return redirect(reverse('feed:feed')) # Bir GET isteği ile aynı URL'ye yönlendirin
        'form': PostForm(), # Formu bağlam içine aktardığınızdan emin olun, böylece onu oluşturabiliriz.

Şimdi, yeni formu hesaba katmak için şablonu güncellememiz gerekecek. Bunu kullanarak yapabiliriz

HTML'de etiketleyin ve HTML şablonundaki formu bir gönder düğmesi ile oluşturun. Ayrıca, harici sitelerin önce bir sayfa yüklemeden forma göndermesini önleyen bir jetona sahip bir CSRF jetonuna da ihtiyacımız olacak.

Bunu yıkalım. Yeni bir form sınıfı, bir jeton, formun kendisi ve bir gönderme düğmesi var. Oldukça basit, ama ona bir göz attığımızda, daha iyi görünmesini isteyebiliriz. Çalışır, formla yeni yayınlar gönderebiliriz ve şimdi veritabanına kaydedilir. Burada birkaç şey oluyor. Belgenin bir HTML belgesi olduğunu beyan etmek için HTML etiketlerini kullanıyoruz, form için jetonu oluşturmak için bir şablon etiketi ({ %… %}) ve formu oluşturmak için {{…}}. Ayrıca blok etiketleri ve bir şablon etiketi kullanarak metni oluşturmak için bir döngümüz var. Blok etiketleri gerçekten önemlidir, çünkü şablonun bölümlerinin onlarla nasıl oluşturulduğunu tanımlayabiliriz ve şablon etiketleri, değişkenleri kodumuza nasıl koyduğumuzun temelidir.

Şimdi uygulamamızı daha iyi göstermemiz gerekiyor, çünkü şimdilik gerçekten temel görünüyor. Bunu, satır içi veya belgedeki her nesneye bağlı sınıflarda CSS kullanarak yapabiliriz. CSS gerçekten güzel çünkü sayfadaki her şeyi nasıl görünmesi gerektiğini anlatıyor ve gerçekten iyi görünmesini sağlayabilir. Bunu yapabilen birkaç kütüphane var, ancak kişisel gitmem Bootstrap.

Bootstrap web sitelerinden indirilebilir,getbootstrap.com/. Oraya girdikten sonra, yükleme belgelerini okumak için düğmeye basın ve kodu dahil CDN bölümünden kopyalayın. Bu kodun HTML belgenizin üstünde, Head adlı bir etikette ihtiyacınız olacak. Ayrıca, devam edelim ve bir temel şablon oluşturalım, böylece her bir şablonda bu bağlantıları yeniden oluşturmamız gerekmiyor.

MKDIR şablonlarına sahip şablonlar adı verilen yeni bir dizin yapın ve ardından Templates/Base.html düzenleyin.

Şöyle görünmeli:

CSS ve JavaScript, .css ve .js dosyalarını kopyaladığınızdan emin olun, çünkü sitemizi gelecekte daha işlevsel hale getirmek için JavaScript'e ihtiyacımız olacak.

Şimdi, bash kabuğuna dönelim ve hızlı bir komuta çalıştıralım. Unutmayın, sanal ortama erişmeniz gerekiyorsa, kaynak Venv/bin/aktivite yazın. Bu, Python paketlerini yerel olarak Django'nun onlara erişmesine izin verecek şekilde kurmanıza izin verecektir. Django Bootstrap sınıfları tarafından oluşturulan formlarımızı vermek için Crispy Forms adlı bir Python paketi kullanacağız. Bunu aşağıdaki komutla indirebiliriz

pip install django-crispy-forms

Bu yüklendikten sonra, settings.py'ye ekleyin

    # … Önceki kod burada

Şimdi, yem şablonumuzda bazı şeyleri kaldırabiliriz. Belgenin başlangıcını ve sonunu kaldıralım ve genişletme ve blok tanımını kullanarak temel şablonumuzdan miras ile değiştirelim. Ayrıca, yük ve bir şablon filtresi ile bir şablon filtresi içe aktarma ekleyeceğiz. Son olarak, daha çok bir düğmeye benzemesi için formdaki düğmeye bir bootstrap sınıfı ekleyelim. Bu şöyle görünmeli:

Güzel! Bu zaten biraz kod. Sonra, test etmeliyiz ve her şeyin güzel göründüğünü görebildiğimizden ve her şeyin düzgün çalıştığından emin olmalıyız. Sunucuyu önceki talimatlara göre çalıştırın ve sitenin iyi göründüğünden ve çalıştığından emin olun. Harika iş! Benzer URL'leri, formları, görünümleri ve şablonları kullanarak kullanıcı giriş işlevselliği ekleyeceğimiz bir sonraki adıma geçmeye hazırsınız. Temel şablon önemlidir ve onu değiştirmeye ve gerektiğinde değişiklik yapmaya devam edeceğiz, ancak şimdilik, kullanıcıların bir kullanıcı adı ve kısıtlama ile giriş yapmalarını sağlayarak, uygulamanızı ve kendi hesabınızı yalnızca sizin tarafınızdan erişilebilir tutmaya yardımcı olacak daha önemli bilgiler ile daha güvenli hale getirmeye odaklanalım.

Bunu yapmak için Django'da yerleşik kullanıcı modelini kullanmamız gerekecek. Kullanıcı modeli, bir kullanıcıyı web sitesine kaydetmek için oluşturulabilen bir veritabanı modelidir. Gelecekte, siteyi internete dağıtmadan önce, bu modeli ona atfedilen diğer modellerle genişleteceğiz ve kimlik avına dirençli giriş için ek güvenlik önlemleri oluşturacağız. Django'nun sağladığı bazı yerleşik giriş formlarını kullanarak başlayacağız. İlk olarak, temel giriş sayfası için şablonları ve görünümleri oluşturmak için kullanacağımız yeni bir uygulama oluşturalım. Ayrıca, bir pinkod, yüz tanıma, yakın alan iletişimi, harici cihazlar, çok faktörlü kimlik doğrulama ve parmak izi tanıma da dahil olmak üzere uygulamayı güvence altına almak için devam eden giriş zorluklarını temsil etmek için başka uygulamalar da oluşturacağız.

Zaten bir uygulama başlatma hakkında konuştuk. Dizinimizden, sanal ortamın içinde, bu argümanları yönetin.

python manage.py startapp users

Şimdi, yeni uygulama için bir dizinimiz olmalı. Bu dizinde kullanıcı girişine karşılık gelen bir görünüm oluşturarak başlayalım. Django, kullanıcı girişleri için görünümler geliştirdi, ancak bunlar bizim için uygun olmayacak çünkü tercihen bir tanımla yapılan özel bir görünüme ihtiyacımız var.

Bu görüşe göre, bir yayın isteği kontrol ederek başlayacağız, Pass isteği.

Kullanıcılar/Views.py'de aşağıdaki kodu ekleyin

        username = request.POST['username'] # Kullanıcı Adı ve Şifreyi Gönderi Gönderiden Alın
        password = request.POST['password'] # Kullanıcıyı doğrulayın

Temel bir oturum açma görünümü için ihtiyacınız olan tek şey budur. Şimdi, temel şablonu genişleterek görünüm için bir form oluşturalım. Kullanıcılar klasöründeki şablonlar için yeni bir dizin oluşturarak başlayacağız.

mkdir users/templates
mkdir users/templates/users

Şimdi, kullanıcıları/şablonları/kullanıcıları/login.html'yi düzenleyebilmeliyiz. Biz oradayken, kullanıcının da kaydolmasına izin vermek için bir şablon oluşturacağız.

nano users/templates/users/login.html

Şimdi, şablonda,

Bu bir giriş şablonunun temelleridir. Gerçekten yapıdaki diğer şablon gibi, ancak işlendiğinde biraz farklı görünüyor. Bu kodu, Register.html adlı çok benzer bir şablon oluşturmak için kopyalayabiliriz, burada ifadeleri değiştirir ve oluşturduğumuz yeni bir form kullanacağız. Önce şablonu yapalım. Kullanıcıları/Şablonları/Kullanıcıları/Register.html'i düzenleyin ve aşağıdaki kodu ekleyin:

Şimdi, kullanıcı kaydımız için bir form oluşturalım ve kullanıcı girişlerimizi bir modelle yükseltmeden önce görünümlere geri dönelim. Bu formu başlamak için temel hale getireceğiz, ancak gelecekte anlaşmalar ve captcha gibi daha fazla ayrıntı ve güvenlik özellikleri dahil edeceğiz. Nano kullanıcıları/forms.py ile formları düzenleyin ve aşağıdaki kodu ekleyin.

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

Bu yüzden burada oldukça basit bir şekilde çalışan başka bir formumuz var. Kullanıcı adı, e -posta ve şifre ile bir şifre alanı olan bir kullanıcı kaydı formudur. Bu formun normal formları genişletmediğini unutmayın. Form sınıfı, bir meta olduğu anlamına gelen bir model formudur. Bir alan aynı şekilde tanımlanır ve sınıf meta, formun formda yazılacak bilgilerin geri kalanına karşılık gelen modeli tanımlar. Bunların çoğu zaten Django'nun yerleşik userCreationForm'da mevcuttur, bu yüzden bunu sınıfın temeli olarak kullanacağız (parantez içinde geçer).

Ardından, bir formumuz ve bir şablonumuz olduğu için bir kullanıcıyı kaydetme görünümünü inceleyeceğiz. Bu, tıpkı yeni Post görünümündeki gibi bir modelform. Kullanıcılar/views.py düzenleyin ve aşağıdaki kodu ekleyin:

# … İthalat

Bir kullanıcıyı kaydetmek için ihtiyacımız olan tek şey bu, ancak daha fazla bilgiye sahip olmalıyız. Kullanıcının kaydedildiği zamanı, sitede en son ne zaman olduklarını, biyografi, saat dilimleri vb. Gibi bazı bilgiler bilmek istiyoruz. Ayrıca, her kullanıcıya kullanıcı modelini ve yayınlamaları hesaba katmak için besleme modelimizi, yayınımızı güncellememiz gerekecek. Bunu yapmak için Models.py'yi her iki uygulamada güncelleyeceğiz. Besleme modelini düzenleyerek başlayalım. Şimdi böyle görünmeli:

from django.db import models # … İthalat
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Bu satıra ekle

Dosyaya eklenen ikinci satıra dikkat edin. Bu, her gönderiyi yazı başına tek bir kullanıcıya atfetecek yabancı bir anahtardır, böylece yayınları kullanıcı başına kullanıcı bazında kaydettiğimizden ve bir kullanıcıya atfetmeden hiçbir yayın yapılamayacağından emin olabiliriz. Bu yabancı anahtarı temsil ettiği sınıfla tanımlıyoruz, gönderilerin kullanıcılarla silinmesini sağlamak için bir silme argümanı, gerektiğinde kullanıcıyı kaldırabildiğimizden emin olmak ve daha önce oluşturduğumuz yayınlarda bir kullanıcının eksikliği ve kullanıcının yarattığı yayın nesnelerine başvurmak için kullanabileceğimiz bir ad. Bu ilgili isim, Post'un yazarı olan Post.author'un aksine, gönderiyi gönderen kullanıcıya veriyor. Artık bir kullanıcının user.posts.all () veya work.posts.all () çalıştırmasıyla yapılan yayınları alabiliriz.

Şimdi, girişlerimizi daha esnek hale getirelim. Sitemizi, siteye bir girişe kaç kez izin vereceğimizi sınırlandırarak, bu oldukça kolaydır. Uygulamamızı geliştirmeye devam ederken daha önce her kullanıcı hakkında bazı bilgileri saklamaya başlayalım. Kullanıcılar/Models.py düzenleme, aşağıdaki kodu ekleyin.

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

Bu modelin post modeline oldukça benzediğini unutmayın. DateTime alanlarında varsayılanlar ayarlamamıza izin verecek ek bir içe aktarma, Timezone'umuz var ve ayrıca yazı gibi bir karaktere ve metin alanımız var. Bu zaman damgalarını kullanmak, siteyi güvence altına almamıza ve kullanımını anlamamıza yardımcı olur ve metin alanları, web sitesinde her kullanıcı veya yazar hakkında bilgi vermemize izin verir. Onetoonefield tek küçük husus olmalıdır, öngörü ile tamamen aynı davranır, ancak sonraki model başına sadece bir tane vardır. Bu şekilde, kullanıcının yalnızca bir profili vardır, ancak birçok yayın olabilir.

Şimdi, girişimizi geliştirelim ve profili hesaba katmak için görünümleri kaydedelim. İlk olarak, kullanıcılar/views.py düzenleyin ve kayıt görünümüne odaklanın:

# … İthalat
            Profile.objects.create(user=user) # Kullanıcı için bir profil oluşturmak için bu satırı eklediğinizden emin olun

Bu, herhangi bir bilgiyi doldurmadan kullanıcı için bir profil oluşturur. Şimdi, kullanıcı hesabının çok sık oturum açılamayacağından emin olmak istiyoruz veya en azından şifreler çok sık denenemeyeceğinden emin olmak istiyoruz, bu yüzden giriş görünümünü güncelleyelim.

# … İthalat
        if user and user.profile.can_login < timezone.now(): # Şimdi kullanıcının giriş yapıp yapamayacağını kontrol ettiğimizi unutmayın.
        else: # Giriş başarılı değilse,
            user = User.objects.filter(username=username).first() # Bu, kullanıcıların profilini güncellediğimiz kısım
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Bu yüzden birkaç saniye tekrar giriş yapamazlar

Bu, güvenliğin temel temeldir. Sitenin, olası her şifre kombinasyonunu, hatta bunlardan birkaçını aynı anda deneyen birine karşı savunmasız olmadığından emin olun. Bu, şifrelerini bilen ve sadece birkaç cihazda oturum açan sıradan kullanıcı için sinir bozucu olmayacak, ancak çok sayıda kimlik avı robotunu uygulamadan uzak tutacaktır. Geçmişte bir zaman olması gereken bir değişken olan Can_login ile bir IF ifadesi eklediğimizi ve aynı kullanıcı adını kullanarak her başarısız girişle güncellediğimizi unutmayın. Bu şekilde, kötü niyetli bir kullanıcı, bir şifreyi hızlı bir şekilde tahmin edemez. DateTime.timedelta () 'deki saniye sayısı da güncellenebilir ve web sitesi daha esnek ancak biraz daha az kullanılabilir olacaktır. 15 ile başlamayı tavsiye ederim.

Unutmayın, işimizi kaydetmek için bir yedekleme komut dosyası oluşturduk, bu yüzden devam edelim ve her şeyin kaydedildiğinden emin olmak için şimdiye kadar sahip olduğumuzu yedekleyelim. Komutu çalıştırın:

sudo backup

Bir kez daha, bu işinizi şimdiye kadar kurtaracak. Çalışmanızı kaydetmek için sık yedeklemeler yapmanızı öneririm ve hatta otomatik olarak bir yedekleme işi çalıştırmak isteyebilirsiniz. Bunu Cron adlı bir UNIX yardımcı programı kullanarak yapabilirsiniz. Bu yardımcı programı etkinleştirmek için aşağıdaki komutu çalıştırın ve şifrenizi girin:

sudo crontab -e

Zaten aşina olmanız gereken Metin Düzenleyicisi için zaten Seçenek 1'i seçmediyseniz ve ok tuşlarını kullanarak dosyanın altına kaydırın. Aşağıdaki satırı ekleyin:

0 * * * * sudo backup

CRON, A * veya bir sayı komutu ne zaman çalıştıracağını temsil eden dakika, saat, ay, ay, haftanın gününü kullanır. Dakika için 0 ve * seçeneklerin geri kalanı için *, dakikanın başında her saatin ilk dakikasında bir komut çalıştırabiliriz. Bu, kodu otomatik olarak yedeklememizi sağlar. Sudo ile yürütüldüğünde Cron'un tüm işleri kök olarak çalıştırılır, bu yüzden her saat bir şifre yazmamız gerekmez.

Parola kullanmadan kodumuzu yedeklemeyi kolaylaştırmak için yedekleme komutumuzun parolasını devre dışı bırakalım. Bunu aşağıdaki komutu yürüterek ve bir şifre girerek yapacağız:

sudo visudo

Şimdi, dosyanın altına kaydıralım ve başka bir satır ekleyelim:

ALL ALL=NOPASSWD: /bin/backup

Bu, herhangi bir kullanıcı olarak "yedekleme" komutunu şifre olmadan çalıştırmamızı sağlar. Bunun formatı kolaydır, sadece "tümü = nopasswd:/bin/" satırını ön ekleyin ve örneğin/usr/bin/içinde bulunan komut/bin/yedekleme komutu ile sonlandırın.

Şimdi e -posta ile çalışmaya başlayalım. E -posta web siteleri için gerçekten önemlidir, çünkü bir web sitesini daha güvenli tutmanın, kullanıcıların gerçek insanlar olduğunu ve hatta müşterilere pazar ürünleri veya hizmetleri olduğunu doğrulamanın bir yoludur. İnternette sık sık e -postalarını kontrol eden birçok kişi, ilgilendikleri ürün ve hizmetler hakkında her türlü pazarlama e -postasını alır. Bir Django web sitesinde e -posta etkinleştirmek söz konusu olduğunda birkaç seçenek vardır ve sizin için en iyi olanı seçebilirsiniz.

İlk olarak, alan adınızdan e -posta göndermenizi sağlayacak ve minimum kod gerektirecek bir e -posta hizmeti için ödeme yapabilirsiniz. Bunu sunan Google Workspace, SendminBlue, MailGun ve daha fazlası gibi birçok hizmet var.

Aksi takdirde, sunucunuzda kendi e -posta hizmetinizi sıfırdan inşa edersiniz. Daha fazla kod olmasına ve özel barındırma gerektirmesine rağmen bu seçeneği tavsiye ederim. Büyük olasılıkla ev bilgisayarınızdan bir posta sunucusu başlatamazsınız, bu yüzden bulutta bir sunucu başlatmadan ve içinde kendi posta sunucumuzu oluşturmadan önce e -posta göndermek için yapılandırmayı ve kodu inceleyelim.

İlk olarak, aşağıdaki komutla settings.py'yi düzenleyin:

nano app/settings.py

Uygulama, StartApp ile oluşturduğunuz uygulamanın adıdır.

Aşağıdaki satırları ekleyin:

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)

Uygulamanızı dağıtmaya hazır olduğunuzda bunları değiştirdiğinizden emin olun, bunu daha sonra tekrar ziyaret edeceğiz. E -posta_address ayarı göndermek istediğiniz e -posta olmalı ve sunucu için oluşturduğunuz şifreye parola (e -posta_host_password) ayarlanmalıdır. Parolayı, aşağıdaki mantığı kullanarak koddan uzak tutmak için bir yapılandırma dosyasından yüklüyorum, bu satırların üstünde Settings.py:

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

Daha sonra, nano'yu aşağıdaki gibi kullanarak yapılandıran bir JSON dosyası ayarladım.

Dosyayı düzenlemek için:

sudo nano /etc/config.json

Aşağıdaki satırları ekleyin:

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

Yapılandırma dosyasını düzenlemeye ve uygulamada kullanacağımız tüm şifreleri ve anahtarları eklemeye devam edeceğiz. Şimdilik, Python kullanarak nasıl e -posta göndereceğinizi hızlı bir şekilde inceleyelim. İlk olarak, kullanıcılarımıza gönderebileceğimiz bir doğrulama e -postası için bir şablon oluşturalım ve kullanıcı şablonları dizinine koyalım. Bu şablon HTML'de yazılacaktır.

nano users/templates/users/verification_email.html

Bu e -posta oldukça basit. Bir kullanıcının bağlamı, site için temel URL ve kullanıcının e -postasını doğrulamak için kullanılan bir kullanıcı kimliği ve jetonu alır. Şablonu oluşturmak için bazı Python kodu yazmadan önce Settings.py'de temel URL'yi tanımladığınızdan emin olun. Devam edin ve başlangıçta APP/settings.py'ye aşağıdaki satırları ekleyin.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Sonunda, siteniz internet için hazır olduğunda ve dağıttığınızda, alan adınızı siteyi temsil etmek için satın aldığınız alan adı olarak tanımlamak istersiniz. Sitenize erişmek için NAVBAR'a yazacağınız ad budur. Şimdilik, etki alanını boş bırakabilir veya bir yer tutucu kullanabilirsiniz. Ayrıca site_name'i seçtiğiniz sitenize vermek istediğiniz bir adla değiştirmek isteyeceksiniz.

E -posta göndermeden önce, asla sona ermeyen bir hesap etkinleştirme jetonuna sahip olabilmemiz için bir jeton jeneratörü oluşturalım. Bunu, aşağıdakilere benzeyen bir hesap etkinleştirme jetonu oluşturarak ve içe aktararak yapabiliriz. Dosyayı düzenleyin:

nano users/tokens.py

Aşağıdaki kodu ekleyin:

from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp)
        )
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()

Bu temel token jeneratörü, kullanıcıyı bir URL'ye gönderebileceğimiz bir jeton oluşturur ve kullanıcı e -postalarını doğrulamak ve hesaplarını etkinleştirmek için kullanabilir.

Ardından, nasıl bir e -posta göndereceğinizi görelim. Nano'yu kullanarak, kullanıcıları/e -posta.py'yi düzenleyin.

nano users/email.py

Doğrulama HTML e -postasının gönderilmesi şöyle görünecektir:

from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback

def send_verification_email(user):
    User = get_user_model()
    mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
    html_message = render_to_string('users/verification_email.html', {
        'user': user,
        'domain': settings.DOMAIN,
        'protocol': 'https',
        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
        'token': account_activation_token.make_token(user),
    })
    send_html_email(user, mail_subject, html_message)

Bu oldukça basit. E -postayı göndermek, e -postayı şablonlarla ve ayarlarımızı oluşturmak için ihtiyacımız olan işlevleri içe aktarıyoruz ve daha sonra e -postayı şablon adına göre tanımlıyoruz ve bir işlev kullanarak kullanıcıya gönderiyoruz. Send_html_email gönderme işlevini tanımlamadığımızı fark edeceksiniz, ancak bunu zaten kullanıcılar/e -posta.py'ye eklediğimiz kodun altına yazalım

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

Bu biraz daha karmaşık ve henüz tüm bu kodu çalıştırmaya hazır değiliz. Bir UNSub_Link tanımladığımıza dikkat edin, kullanıcının e -postalarımızdan iptal etmek için kullanabileceği bağlantı. Bu önemlidir, çünkü kullanıcıların herhangi bir zamanda görmek istemedikçe e -postalarımızdan çıkabilmeleri gerekecektir. Ayrıca, HTML etiketlerinden çıkarılmış HTML mesajı olan mesajımıza bir metin alternatifi de ekliyoruz. Son olarak, e -postanın gönderilip gönderilmeyeceğini kontrol ediyoruz ve eğer yapmadıysa, kullanıcının profilinde e -postalarının geçerli olmadığını işaretliyoruz.

Tüm bunları işe yarayabilmemiz için kullanıcı modellerine geri dönelim. Abonelikten çıkma bağlantısı oluşturmak için bir işlev tanımlamamız ve kullanıcının e -postasının geçerli olmadığını işaretlemek için bir Boolean alanı tanımlamamız gerekir.

İlk olarak, kullanıcıların/modellerin en üstüne aşağıdaki içe aktarma ekleyin.

nano users/models.py
# …

Ardından, jetonu yapmak için kullanıcı modeline işlevler ekleyelim ve e -postayı etkinleştirmek için kullanılan jetonun yanı sıra kullanıcının postalarını başarıyla alıp almadığını kaydetmek için alanı kontrol edelim. Kullanıcılar/Models.py'de tekrar, modelin sonuna aşağıdaki kodu ekleyin (girintili kod)

# …
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 30 gün boyunca geçerli

Bu oldukça basittir, belirli bir süre sonra sona erecek bir jeton oluşturmak için temel bir kriptografi aracı olan bir TimestampSigner kullanıyoruz ve geçerli olup olmadığını kontrol etmek için başka bir işlevi de kullanıyoruz. Bu jetonları iki kez, bir kez e -postayı doğrulamak için ve bir kez abonelikten çıkma bağlantısı için kullanıyoruz.

Artık bunlara sahip olduğumuza göre, yapmamız gereken son iş görüşlerinde. Kullanıcılar/Views.py içinde, e -posta adresini doğrulamak ve abonelikten iptal etmek için görünümler ekleyelim.

nano users/views.py

İlk olarak, aşağıdaki ithalatı ekleyin. Birkaç ekstra attım, böylece daha sonra tekrar daha fazla ürün içe aktarmak zorunda kalmayacağız.

from .email import send_verification_email # Doğrulama e -posta gönderme işlevini içe aktardığınızdan emin olun

Bu ithalatlardan bazılarına zaten sahip olabilirsiniz, ancak bunları tekrarlamak zarar vermez. Diğer ithalatların yanı sıra, kullanıcılar.tokens'ten doğrulama e -posta gönderme işlevini ve hesap_activation_token'i aktarmanız gerekecektir.

Şimdi, dosyanın altına aşağıdaki kodu ekleyin:

        # abonelikten çıkın
    # Aksi takdirde giriş sayfasına yönlendirin
# SendWelomeMail (istek, kullanıcı)

Bu çok fazla kod. Hadi parçalayalım. Temiz ve basit ilk işlev, kullanıcıyı posta listesinden çıkarır. İkinci işlev e -postalarını etkinleştirir ve yorumlanan bir işlev olan SendWelomeMail eklediğimi fark edeceksiniz. Bir karşılama e -postası göndermek için bir e -posta şablonu ve işlev tanımı kullanabilirsiniz, henüz yapmadım. Etkinleştirme e -postalarının süresi dolduğundan, attığım son işlev önemlidir. Bu nedenle, aktivasyon e -postasını bir süre önce yeniden göndermemiz gerekecek. Bunun için temel bir form kullanabilir ve doğrulama e -postasını göndermek için işlevi arayabiliriz. Bunu yapmadan önce, kayıt görünümüne bir işlev çağrısı ekleyerek ilk etapta gönderildiğinden emin olalım. Bu satırı, Kayıt görünümünde, DEF Register'daki yönlendirmeden hemen önce kullanıcılar/views.py ekleyin.

nano users/views.py
# … (Sonra) Def Register (istek):
# … (Daha önce) yönlendirme (

Bu kod snippet'ine ilk ve son satırları eklemenize gerek yoktur, sadece kayıt görünümünün doğrulama e -postasını kullanıcıya gönderdiğinden emin olun. Şöyle görünmeli:

# … İthalat
            send_verification_email(user) # Bu çizgiyi eklediğinizden emin olun!

Şimdi, etkinleştirme e -postasını yeniden göndermek için bir form eklememiz gerekecek. Kullanıcılar/forms.py'de aşağıdaki formu ekleyin:

# … (İthalat)

Ayrıca, bu yeniden e -posta etkinleştirme formuna karşılık gelen bir şablona ihtiyacımız olacak. Bu şablonu ekleyelim. Dosyayı düzenleyin:

nano users/templates/users/resend_activation.html

Ardından, dosyaya aşağıdaki kodu ekleyin.

Vay canına, bu çok! Şimdi, kodu sunucumuza dağıttığımızda, html e -posta gönderebilir ve e -postayı tıklayarak kullanıcı hesaplarını etkinleştirebiliriz. Ayrıca basit bir karşılama e -postası göndermek isteyebiliriz, bu yüzden bunu nasıl yapacağımızı görelim. Kullanıcılara/E -posta.py'ye geri dönün, aşağıdaki kodu ekleyin:

def sendwelcomeemail(user):
    User = get_user_model()
    html = open('{}/users/welcome_email.html'.format(settings.BASE_DIR)).read()
    subject = 'Welcome to ' + settings.SITE_NAME + ', {{ username }}!'
    template = Template(html)
    subjtemplate = Template(subject)
    context = Context({'username': user.username, 'base_url': settings.BASE_URL, 'model_name': 'Daisy Holton, 'site_name': settings.SITE_NAME})
    renderedtemplate = template.render(context)
    subjcontext = Context({'username': user.username})
    subjrenderedtemplate = subjtemplate.render(subjcontext)
    send_html_email(user, subjrenderedtemplate, renderedtemplate)

Ayrıca, tüm bu bilgileri oluşturmak için bir şablona ihtiyacımız olacak. Web sitemde, şablon aşağıdaki gibi görünüyor, ancak istediğiniz gibi biçimlendirebilirsiniz.

Kapanış gövdesi veya HTML etiketlerimiz olmadığını unutmayın, çünkü bunları HTML abonelikten çıkma bağlantısını eklediğimizde ekliyoruz. Bunlar önemlidir, ancak onları iki kez tanımlamak istemiyoruz.

Peki sırada ne var? Uzun bir yol kat ettik. Gerçekten, siteyi bir sunucuya dağıtmaya hazır olmalıyız. @Login_required dekoratörünü ekleyebilir ve görüşlerimizi güvende edebilir, kullanıcı kayıtları alabilir, uyumlu e -posta gönderebilir ve bir web sitesinin alakalı kalmak için ne yapması gerektiğinin temeli olan önbellek bilgileri yapabiliriz. Birkaç daha kullanışlı özellik ekleyeceğiz ve ardından sitemizi güvenli ve uygun hale getirmek için kodumuzu uzak bir sunucuya dağıtmak, bir posta sunucusu, etki alanı yapılandırması ve filtreler ayarlamak için bir temel oluşturacağız.

Ayrıca bir şifre sıfırlama görünümüne ihtiyacımız var, bu yüzden bunu gerçekten hızlı bir şekilde ekleyelim. Django'nun yerleşik şifre sıfırlama görünümü bazı işlevlerde bozulur, ancak kendi görünümümüzü, e -posta şablonumuzu, formlarımızı ve URL modellerimizi nasıl yazacağımıza bakacağız. İşte kullanıcılar/views.py'de görünüm nasıl görünüyor

# ... İthalat

Bu form Django'da yerleşiktir, ancak şifre sıfırlamasını, kullanıcıları/şablonları/kullanıcıları/parolayı/parolayı_reset_confirm.html'yi onaylamak için bir şablona ihtiyacımız olacak

Ayrıca, kullanıcılar/şablonlarda/kullanıcılar/parola_reset.html'de basit bir formla bir şifre sıfırlama e -postası göndermek için bir şablonumuz var

E -postanın kendisi için şablon basittir, kullanıcılar/şablonlar/kullanıcılar/parola_reset_email.html'de şifreyi sıfırlamak için bir bağlantı oluşturan temel bir HTML dosyasıdır. Django bu dosyayı otomatik olarak yorumlayacaktır.

Ayrıca iki şablon daha da ihtiyacımız olacak. Birincisi, e -postanın gönderildiğini doğrulamaktır. Bunların görüntüleri zaten Django'da, bu yüzden sadece urls.py'de ele almamız gerekiyor. Bu şablon kullanıcılar/şablonlar/kullanıcılar/parola_reset_done.html'de bulunur

Ve son olarak, şifre sıfırlamanın tamamlandığını doğrulamak için kullanıcılar/şablonlar/kullanıcılar/parola_reset_complete.html

Şimdi, bu görüşler için URL modellerine ihtiyacımız var. Kullanıcılar/urls.py'de aşağıdaki URL modellerini ekleyin:

    # ... Önceki URL'ler burada

Dört şablon, bu çok! Ancak şimdi, tüm web tarayıcısından ihtiyacımız olan her zaman kullanıcının şifresini sıfırlayabildiğimizden emin olabiliriz.

Bunun çok fazla kod olduğunu anlıyorum. Biraz kafanın üzerinde görünüyorsa, sorun değil. Gelişeceksiniz, anlayışınız iyileşecek ve çok yakında kodla çok daha yetkin hale geleceksiniz. Tamamen kaybolursanız, kendi hızında çalıştıktan sonra bu yazılıma daha sonra geri dönmenizi tavsiye ederim. Bunlar genellikle başlamak için ücretsizdir ve bu projeye geri döndüğünüzde başarılı olmanız gereken her şeyde size rehberlik edecektir. Devam etmeye hazır olduğunuzu düşünüyorsanız, okumaya devam edin, daha sonra, kodunuzu uzak bir sunucuya dağıtmayı ve bir posta sunucusunu kurmayı ve her zaman birkaç basit komutla yeni bir proje ayarlayabilmeniz için BASH kullanarak dağıtımınızı otomatikleştireceğiz.

Uzak bir sunucuya dağıtmadan önce yapmamız gereken son şey, sitemizi biraz daha güvenli hale getirmektir. Oturum açma görünümünün yalnızca bir kullanıcı adı ve şifre aldığını ve çok faktörlü bir kimlik doğrulama veya bir zaman kodu olmadığını fark edeceksiniz. Bu kolay bir düzeltmedir ve aynı kodla, sitemizin metin mesajları göndermesini ve hatta sunucuya gönderilen metin mesajlarına yanıt vermesini sağlayabiliriz. Başlamak için, kullanıcı modellerine geri döneceğiz ve her bir girişi temsil edecek bir zaman damgası imzalayan ekleyeceğiz. Ayrıca, girişimize ekstra güvenlik eklemek için kullanılacak kullanıcı modeline benzersiz, dönen bir tanımlayıcı ekleyeceğiz. Kullanıcı modellerini, kullanıcıları/modellerini düzenleme, aşağıdaki kodu ekleyin:

# UUID, zaman damgası imzalayan ve URL jeneratörünü (ters) içe aktardığınızdan emin olun.
    # Bu kodu buraya ekle
    # Ve bu işlevi ekle
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 3 dakika geçerli

Yorumların yanı sıra kullanıcılarınızın/modellerinizin böyle göründüğünden emin olun ( #ile satırlarda kod). Bunu kırmak, basit. Birkaç ithalatımız var, güvenli bir kod oluşturabilen ve geçerli olduğundan emin olmak için, sadece bir kez kullanıldığından ve belirli sayıda saniyeden daha eski olmayan bir kriptografik yardımcı program olan bir zaman damgası var. Ayrıca, jetonun imzalanmasında ve jetonun kullanıcıya gönderildiği URL'de kullanıcılarımızı tanımlayan benzersiz bir tanımlayıcı olan bir UUID kullanıyoruz. Bu temel şifrelemeyi iki faktörlü bir kimlik doğrulama görünümü oluşturmak için kullanacağız. Başka bir şey yapmadan önce, kullanıcı modellerimiz güncellenmesi için geçişleri çalıştıralım. Manage.py ile dizinde, geçiş yapmak ve tamamlamak için aşağıdaki komutları çalıştırın.

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

Bu önemlidir, çünkü modellerde her değişiklik yaptığımızda, modelleri gerçekten kullanmadan önce tabloları oluşturmamız ve veritabanını varsayılanlarla güncellememiz gerekecektir.

Ardından, ikincil bir kimlik doğrulama görünümüne yönlendirmek için giriş görünümümüzü doğaçlama yapalım. Kullanıcılar/Views.py'de oturum açma işlevini kaldırın ve kullanıcı modellerinde yeni oluşturduğumuz URL'ye yönlendirin.

# … İthalat
        if user and user.profile.can_login < timezone.now(): # Şimdi kullanıcının giriş yapıp yapamayacağını kontrol ettiğimizi unutmayın.
            # Burada bulunan Auth_login işlevini kaldırın
                return redirect(user.profile.create_auth_url()) # Not burada yeni bir URL'ye yönlendiriyoruz
            else: # Kullanıcı çok faktörlü kimlik doğrulama kullanmıyorsa, bunları giriş yapın.
        else: # Giriş başarılı değilse,
            user = User.objects.filter(username=username).first() # Bu, kullanıcıların profilini güncellediğimiz kısım
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Bu yüzden birkaç saniye tekrar giriş yapamazlar

Yani bu oldukça basit, şimdi oluşturduğumuzda iki faktörlü kimlik doğrulama görünümüne yönlendirmenin bir yolu var. Ayrıca kullanıcının bir telefon numarası eklememesi durumunda bir geri dönüşümüz var. Yakında bir telefon numarası eklemek için temel bir görünüm ekleyeceğiz ve yakında bir kısa mesajla oturum açacağız.

İlk olarak, kodumuzdan kısa mesaj göndermenin kolay bir yoluna ihtiyacımız var. Bunu yapmak için bir dizi API arasından seçim yapabiliriz, ancak bence en kolay olan Twilio. Ayrıca daha küçük projeler için iyi fiyatlandırma ve toplu indirimler sunarlar. Twilio.com'da bir hesap oluşturun, projenizle ilgili bazı ayrıntıları doldurun, bir telefon numarası satın alın ve API anahtarlarınızı settings.py'nize kopyalayın. Ardından, bu kodu yeni bir dosya, kullanıcılar/sms.py altına ekleyin.

nano users/sms.py
# Gerekli tüm paketleri içe aktarın
# Bu kod metni Twilio ile gönderir
# Bu kadar basamaklı bir sayı elde etmek için bir yardımcı işlev
# Kullanıcıyı doğrulamak için metni gönderin
# Bir kullanıcıya bu işlevle ilgili herhangi bir metin gönderin
# Bu işlevle kodu doğrulayın
# Zamanı doğrulayın

Bu satırları anahtarlarınızla ekleyerek ayarlarınızı uygun şekilde değiştirdiğinizden emin olun:

# Bunları Twilio Gösterge Tablonuzdan Kopyaladığınızdan Emin Olun
AUTH_VALID_MINUTES = 3 # TFA sayfasının somutlaştırıldıktan sonra etkin olduğu dakika sayısı

İlk olarak, iki faktörlü kimlik doğrulama görünümümüz için formlara ihtiyacımız olacak. Kullanıcılar/forms.py düzenleme, aşağıdaki kodu ekleyin.

# … İthalat
# Telefon Numaramıza Girmek İçin Bir Form
# Kimlik doğrulaması için bir form

Ardından, kullanıcılar/views.py'de görünümleri oluşturalım

# … İthalat

Bu görüşlerin her ikisi için de şablonlara ihtiyacımız olacak. Önce MFA şablonunu ekleyelim.

nano users/templates/users/mfa.html

Bu HTML kodunu şablona ekleyin

Bu oldukça açıklayıcı. Form bir kod veya boş bir kod gönderir ve boş bir kod alırsak kodu gönderdiğimizi fark edersiniz. Sonra sadece iki gönderme düğmemiz var ve bu şekilde kodu her iki düğmeyle gönderebiliriz. Ardından, bir telefon numarası eklemek için basit bir form ekleyeceğiz.

nano users/templates/users/mfa_onboarding.html

Aşağıdaki HTML'yi ekleyin:

Bu form çok daha basittir, sadece oluşturduğumuz telefon numarası formunu oluşturur ve kullanıcının bir telefon numarası eklemesini sağlar.

Bu gerçekten iyi görünüyor! Her şey düzgün bir şekilde ayarlandığı sürece, mesaj gönderebilmeli ve URL kalıplarını eklediğimiz anda kullanıcıyı telefon numaralarıyla birlikte günlüğe kaydedebilmeliyiz. Kurmamız gereken son şey bir profil görünümüdür, böylece kullanıcının oturum açmadan telefon numaralarını değiştirebilmesini sağlayabiliriz. Ayrıca, sonunda bir "Bırakın Durun" seçeneği eklemek isteyeceğiz, böylece kullanıcı gelecekteki metin mesajlarını devre dışı bırakabilir.

Kullanıcılara/views.py'ye bir profil görünümü ekleyelim. Bu görünüm, kullanıcının biyografisini, e -postasını, kullanıcı adı ve telefon numarasını güncelleyecek ve çok faktörlü kimlik doğrulamasını etkinleştirmemize izin verecektir. İlk olarak, kullanıcılar/forms.py'de iki forma daha ihtiyacımız olacak

# ... İthalat

Ardından, bu formların her ikisini de kullanmak için bir görünüm oluşturabiliriz. Kullanıcılar/views.py düzenleyin ve görünümü ekleyin.

# Bu ithalatı ekleyin

Ayrıca bu görüş için bir şablona ihtiyacımız olacak.

nano users/templates/users/profile.html

Bunun oldukça basit bir form olduğunu fark edeceksiniz, ancak içinde formun içeriğini güncellenirken otomatik olarak gönderen bazı JavaScript var. Bu, her seferinde göndermek zorunda kalmadan düzenlemeler yapabilirsiniz.

Daha sonra, kullanıcıların URL modellerinde tüm bu görünümleri temsil eden URL'lere ihtiyacımız var. Kullanıcıları/urls.py'yi düzenleyin ve bu kodu ekleyin:

# … Önceki kod, içe aktarma
# … Daha önce girdiğimiz URL desenleri, sonraki üç satırı ekleyin

Şimdi projemizi test etmek için iyi bir zaman. Ama önce, başka bir yedekleme yapalım.

backup

Ve sunucuyu çalıştırın. Bir Linux sunucusuna dağıtmadan önce, hesapta iki faktörlü kimlik doğrulamasını etkinleştirmek iyi bir fikirdir. Bunu profil URL'mize,/kullanıcılar/profil//telefon numaramıza girdikten sonra kimlik doğrulamayı etkinleştirmek için kutuyu kontrol edip formu göndereceğiz.

python manage.py runserver localhost:8000

Web tarayıcınıza giderek web sayfasını ziyaret edin, bu örnekte Google Chrome kullanıyorum ve https: // localhost: 8000/hesaplar/profil/

Gerekirse oturum açabilir ve iki faktörlü kimlik doğrulamasını etkinleştirebilirsiniz.

Bu projenin çalışması için bir sunucuya ihtiyacı var, böylece gerçekten posta gönderebilir. Ama önce, hataları görmek için bir yola ihtiyacımız var. Sunucuyu Hata Ayıklama Modunda çalıştırırsanız, Settings.Debug'a eşit olarak çalışırsanız, sunucunun hataları otomatik olarak gösterdiğini fark edeceksiniz. Bir üretim sunucusunda güvensiz olan hata ayıklama modu kullanmadan hataları göstermek için bunun için bir görünüm eklemeliyiz. İşleyebilmemiz gereken en önemli hatalar:

Hata 500 - Kodumuzla ilgili bir sorun Hata 404 - Bulunamayan Bir Sayfa (Kırık URL) Hata 403 - İzin reddedilen hata

Hatalar adı verilen bu hataları işlemek için yeni bir uygulama ekleyelim.

python manage.py startapp errors

Bunu daha önce yaptığımız gibi settings.py'ye ekleyin, Installed_Apps ayarında ve uygulama Django projenizin adı olan App/urls.py'deki bazı görünümlere referanslar ekleyerek başlayın.

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

Hata görünümleri, şablonlar ve biraz ara katman yazılımı dışında ihtiyacımız olan tek şey bu. Bunları şöyle tanımlayalım:

# Görüşlerinizi burada oluşturun.

Ardından, bu hataları ele almak için ara katman yazılımı tanımlayalım. Bunu önce Middleware_Classes'e Acections.py'de, ara katman yazılımımızın adıyla ekleyerek yapacağız.

    # ... önceki ara katman yazılımı

Ardından, ara katman yazılımı ekleyelim.

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

Kodumuzdaki hataları izlememize yardımcı olan bir iş parçacığı yerel kullanarak mevcut istisnayı almak için bir işlev ekliyoruz. Şablonlar açısından, sadece bir tanesine ihtiyacımız var, çünkü görünümdeki başlığı dinamik olarak tanımlıyoruz. Şablonun sadece başlık ve "Trace" adlı başlığı oluşturması gerekiyor, hatamız bağlamdan izlememiz.

nano errors/templates/errors/error.html

Bu bizim en basit şablonumuz, ancak projemizdeki hataları görmek bu kadar kolay. Ardından, ayarlarda hata ayıklamayı devre dışı bırakalım.

nano app/settings.py

Bu satırı doğru olarak ayarlayın ve yanlış olarak değiştirin

DEBUG = False

Devam edin ve uygulamayı şimdi yedekleyin. Uzak bir Linux sunucusuna konuşlandırılmaya ve oradan özellikler eklemeye hazırız.

sudo backup

Bu kodu bir sunucuya göndermeden önce, kodla ilgili bazı sorunlar olabileceğini düşünmeliyiz. Davaya bağlı olarak, kendilerine gönderilen bilgileri kabul eden siteler, spam yayınlanmasıyla ilgili sorunlar ve spam'i kaldırmada zorluk yaşayacaktır. Bu hemen gerçekleşmemeli, ancak eğer gerçekleşiyorsa, daha sonra sitedeki spam'i otomatik olarak ılımlı bir şekilde nasıl ılımlı hale getireceğinizi ve robotların siteye erişmesini daha zor hale getirmeyi ve kullanıcı hesaplarının nasıl devre dışı bırakılacağını ve bir kullanıcının kimliğini kimliklerini veya biyometrik tarama ile bir parmak izi veya yüz tanınma gibi bir tarama ile doğrulayacağını inceleyeceğiz.

Üretimde incelediğimiz çok faktörlü kimlik doğrulama örneğine bakıldığında, işler farklı olabilir. Nasıl oran sınırlama girişleri ve süresi dolmuş jetonlar olduğumuza dikkat edin. Robotlar bir siteye erişiyorsa, kullanıcının aynı anda kodlar girebileceği için iki faktörlü kimlik doğrulaması daha zor olabilir. Bununla mücadele etmek için, bir telefon numarasıyla çok faktörlü kimlik doğrulama kullanarak kimlik doğrulaması yaparken siteyle nasıl etkileşime girdiğimizi bildiren kullanıcı modellerinde bir model kullanalım. Ayrıca e -posta ile kimlik doğrulaması yapmak için bir seçenek ekleyeceğiz. Kullanıcı modellerini Nano ile düzenleyerek başlayın.

nano users/models.py

Eklediğimiz model böyle görünmeli. Herhangi bir yönteme ihtiyacımız yok, sadece bir kimlik, kullanıcı, zaman damgası, son kullanma, uzunluk ve herhangi bir çok faktörlü kimlik doğrulamasına karşı denemeler (bir telefon veya e -postaya gönderilen 123456 gibi bir kod).

# Web sitesine giriş yapmak için kullanılan temel bir jeton

Ayrıca kullanıcımıza bir ayrıcalık ekleyelim ve sonunda ayrıcalıklı kullanıcıları otomatik olarak kaydolmaya geçmeden önce bunu manuel olarak ayarlayacağız. Kullanıcı modellerinde bu satırı profile ekleyin:

    vendor = models.BooleanField(default=False)

Veritabanındaki değişikliklerde olduğu gibi, Django'da bir Models.py dosyasını her düzenlediğimizde geçiş yapmamız ve veritabanını taşımamız gerekir. Unutmayın, bunu yapmak için önce kaynağı kullanırız (terminal açık olduğundan beri zaten kullanılmamışsa) ve ardından göçü yapmak ve göç etmek için python manage.py.

cd project-directory-you-named # (gerekirse)

Şimdilik, kabuğu kullanarak satıcı olarak oluşturduğunuz hesapları askere alabilirsiniz.

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

Şimdi, bu jetonu kullanmak için çok faktörlü kimlik doğrulama görünümümüzü geliştirelim. İlk olarak, MFA yardımcı programlarımızı değiştirmemiz gerekiyor. Nano kullanma,

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

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# E -posta veya telefon numaralarını kullanarak kullanıcıyı doğrulayın
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Jetonu URL'den geçirilen değerle filtreleyin (bir 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)) # Bu oturum oluşturulmadıysa, yaratın
    user = User.objects.filter(id=token.user.id).first() # Kullanıcıyı jetondan alın
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Zaten doğrulanmışlarsa, bunları giriş yapın
    if not user: raise PermissionDenied() # Kullanıcı bulunmadıysa inkar edin
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Auth belirtecini kontrol edin
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Halihazırda giriş yapmadılarsa kullanıcıya giriş yapın
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Çok faktörlü kimlik doğrulamaları hakkında bir son kullanma
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Kullanıcıyı bir sonraki sayfaya yönlendirin
    if not user.profile.mfa_enabled: # MFA'nın etkin olup olmadığını kontrol edin
        if not check_verification_time(user, token): # Zamanı kontrol edin
            user.profile.mfa_enabled = False # Telefon numarasını temizle
            user.profile.enable_two_factor_authentication = True # MFA'yı etkinleştir
            user.profile.phone_number = '+1' # Telefon numarasını devre dışı bırakın
            user.profile.save() # Profili Kaydet
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # MFA'ları etkin değilse kullanıcıyı kaydedin
    if request.method == 'POST' and not fraud_detect(request, True): # İstek bir yayın isteği ise
        form = TfaForm(request.POST) # Formu somutlaştır
        code = str(form.data.get('code', None)) # Kodu alın
        if code and code != '' and code != None: # Boş olmadığından emin olun
            token_validated = user.profile.check_auth_token(usertoken) # Auth belirtecini kontrol edin
            is_verified = check_verification_code(user, token, code) # Kodu kontrol edin
            if token_validated: # Eğer her şey
                if is_verified: # Sırayla
                    user.profile.mfa_enabled = True # MFA'yı etkinleştirin (henüz etkinleştirilmezse)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Kullanıcıya giriş yapın
                    for key, value in request.GET.items(): # Bir sonraki parametre için bir sorgulama oluşturun (varsa)
                        return HttpResponseRedirect(next) # Yeniden yönlendirmek
            elif not token_validated: # Jeton geçersizse
            if p.mfa_attempts > 3: # Çok fazla girişim olsaydı
            if form.data.get('send_email', False): # E -postayı (veya metni) gönderin
    # Formu oluşturun (istekler almak için)

Bu kodu eklerken, bir e -posta göndermek için işlevi içe aktardığınızdan emin olun. Dosyanın en üstünde, kullanıcı görünümleri (diğer ithalatlarla), ekleyin

from .mfa import send_verification_email as send_mfa_verification_email

Şimdi, bunlardan herhangi biri işe yaramadan önce bu işlevi yazmamız gerekiyor. E -posta işlevimizi genişletmeli ve doğrulama koduyla kullanıcıya bir e -posta göndermelidir.

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

Yani bunların hepsi harika çalışıyor, şimdi oturum açmak için bir telefon numarasına veya e -postaya bağlı çok faktörlü bir kimlik doğrulama sistemimiz var. Ancak, kaldırmak veya en azından şartlarımızla işbirliği yapmayan kullanıcıları gizlemek için bir yola ihtiyacımız var. Bunlar spam gönderenler, robotlar veya işimiz için iyi bir anlamı olmayan herkes olabilir. Web sitemdeki kullanıcıları izlemek için sahip olduğum bir manzaraya bir göz atın:

# ithalat
from .tests import is_superuser_or_vendor # Bu testi oluşturmamız gerekecek
    # Kullanıcıların Listesini Alın
    return render(request, 'users/users.html', { # Kullanıcıları bir şablonda iade edin

Bu kodun bir test kullandığını unutmayın, bu testi bir Tests.py dosyasında bildirmemiz ve içe aktarmamız gerekecektir. Kullanıcıları Düzenleme/Tests.py, Testi oluşturalım.

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

Bu, kullanıcılar/kullanıcılar. Html şablonu ile birlikte, şuna benzer:

Şablonun başka bir şablon, kullanıcılar/user.html. Alt kremalı ve uzatma kullanmayan bir şablon kullanırken, bir alt çizgiyi eklemek için iyi bir fikir () şablonları ayırt etmek için dosyanın adından önce.

Bunun bir sürü Jinja olduğunu unutmayın, bu değişkenlerin tümünü tanımlamayabilir. Ama kodum böyle görünüyor.

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

Ayrıca başka bir alt dönem, toggle_active.html'ye ihtiyacımız var. Bu şablon, bir kullanıcının etkin olup olmadığını değiştirmemizi sağlayan bir form olmalıdır.

Ayrıca, kullanıcı etkinliğini ve uygun URL kalıplarını değiştirmek için bir görünüm eklememiz gerekecek. Biz oradayken, buna ihtiyacımız olması durumunda bir kullanıcıyı silmek için bir görünüm ekleyelim.

# İthalat
    success_url = '/' # Başarı URL'sinde Yönlendirme
    def test_func(self): # Kullanıcının süper kullanıcı olup olmadığını test edin ve silme iznine sahip

Bu gerektiğinde pratik olsa da, bir kullanıcının silinmesi çoğu zaman gerekli olmamalıdır, sadece onları reddetmemiz gerekirse siteyi ziyaret eden kullanıcıların görünürlüğünü değiştirebiliriz.

Eklediğimiz URL kalıpları böyle görünüyor. Nano ile kullanıcıları/urls.py'yi düzenleyin ve şu satırları ekleyin:

nano users/urls.py

Satırlar, "]" sonlandırmadan önce kullanıcı görünümlerindeki yollar listesine girmelidir, ancak başlangıçtan sonra "[".

# …
# …

Şimdi, üzerinde çalışmaya devam edeceğimiz web sunucusuna indirebilmeniz için siteyi yedeklediğinizden emin olun. Komut satırından,

sudo backup

Şimdi sitemiz yedeklendi.

Şimdi birkaç daha kullanışlı özelliğimiz var. Peki ya buradaki büyük resim? Bu kod hala internetten erişilemiyor, henüz posta sunucumuz yok ve ayrıcalıklı kullanıcıları doğrulamak için güvenli protokollerin yanı sıra siteyi keşfetmemize yardımcı olmak için kapsamlı doğrulama sürecini ve pürüzsüz düzenleri içerecek şekilde uygulamamızı genişletmemiz gerekiyor.

Tüm bunlara ulaşacağız. Şimdilik en önemli şey, bir Ubuntu sunucusunda sadece birkaç satır Bash ile yapabileceğimiz bu kodu çevrimiçi alacak. Evde bir sunucunuz ve bağlantı noktalarını açmanıza izin veren bir işletme internet aboneliğiniz yoksa bunun için bir sunucu kiralamanız gerekecektir. Web sitemi kişisel olarak daireme yüklü bir HP Z440 üzerinde çalıştırıyorum, ancak temel ihtiyaçların sanal bir özel sunucu (VPS) kiralaması genellikle çok daha ucuz.

Şimdi çalıştırdığımız kodun nispeten ince olduğunu, bir ürün oluşturmak için sahip olduğumuz şeyi kullanmaya hazır olmadan önce korunması ve geliştirilmesi gerektiğini unutmayın. İnternet ile ne yaptığınıza dikkat ettiğinizden emin olun, bu siteyi bir Linux sunucusunda web'e herkese açık olarak dağıttığınızdan emin olun, web sitenizle istenmeyen etkileşimleri engellemek için bir planınız olduğundan emin olun. Bu muhtemelen ilk başta bir sorun olmayacak, ancak bununla mücadele etmek için makine öğrenimi, yapay zeka ve bilgisayar vizyonu da dahil olmak üzere çeşitli çözümlere bakacağız. Sorun haline geldiğinde, bir çözüm için bu metne daha fazla bakın.

Bir VPS kiralama açısından, gidebileceğiniz birçok yer var. Google Cloud, VPS sunucuları, Ionos, Kamatera, Amazon AWS ve daha fazla sağlayıcı, ihtiyaçlarımıza uygun bulut sunucusu çözümleri sunuyor.

Formlarını tıklamanız ve başlamak için bir plan seçmeniz gerekir. Herhangi bir sağlayıcıyla temel bir planla gidebilirsiniz, ancak sağlayıcının e -posta göndermek için bağlantı noktası posta sunucusu bağlantı noktalarını açmanıza izin verdiğinden emin olun (bu, 587 ve bağlantı noktası 25 olmalıdır), bazı sağlayıcılar bu bağlantı noktalarını engeller. Şimdiye kadar Ionos ve Kamatera ile en iyi deneyimi yaşadım, her ikisi de sınırsız e -posta göndermeme izin verecek ve fiyatlandırmaları oldukça ucuz.

Yeni sunucunuza, kişisel bilgisayarınızdan sunucuyla tam olarak kişisel bilgisayarınız gibi uzaktan arayüz oluşturmanıza olanak tanıyan SSH veya Secure Shell adlı bir protokol üzerinden bağlanacaksınız. Sunucuyu ayarladığınızda, barındırma sağlayıcısı muhtemelen bir SSH anahtarı eklemenizi isteyecektir veya size bir kullanıcı adı ve şifre verecektir. SSH anahtarı, kodu düzenlemek için komut satırından sunucuya nasıl giriş yapacağınızdır. Bir SSH tuşu oluşturmak için aşağıdaki SSH-Keygen seçeneklerini kullanın.

ssh-keygen

Dosyayı kaydedin ve gerektiğinde üzerine yazın, henüz yapmadıysanız SSH anahtarlarınızı döndürmek iyidir. Şimdi, SSH anahtarınızı görmek için aşağıdaki komutu kullanabilirsiniz. Kimliği doğrulamak için kullanabilmeniz için uzak sunucunuza kopyalamak isteyeceksiniz.

cat ~/.ssh/id_rsa.pub

Bu komutu yazarken bir SSH anahtarı göremediyseniz ("SSH-RSA AAA" ile başlayan uzun bir dizi rakam ve harf dizisi), bir RSA anahtarı oluşturmayı deneyin (daha güvenlidirler, bu yüzden bunları kullanmayı tavsiye ederim.) Aşağıdaki kod 4096 bit RSA SSH tuşu oluşturur.

ssh-keygen -t rsa -b 4096

Ubuntu çalıştıran bir VPS oluşturun, ancak bunu yapmayı planlıyorsunuz. Sağlayıcılar web sitesindeki formları (Kamatera.com, Ionos.com veya benzeri) tıklayarak bir VPS oluşturduktan sonra, giriş yapmak istersiniz. Bunu yapmak için SSH komutunu IP adresinizle (xx.xx.xx.xx gibi görünen adres) kullanın. Ayrıca, örneğin Ubuntu gibi oluşturduğumuz sunucudaki varsayılan kullanıcı adına duyarlı olmanız gerekir.

ssh ubuntu@XX.XX.XX.XX

Bir şifre istenebilir, eğer bir şifre istenirse, girin. Varsayılan kullanıcı adını kullanmayacağız, bu yüzden yeni bir kullanıcı oluşturarak ve hesaplarına bir SSH anahtarı ekleyerek başlayalım.

Sunucuya SSH'yi nasıl kullanacağını anlatan yeni bir SSHD_CONFIG dosyası ekleyerek başlayalım.

nano sshd_config
# Bu, SSHD sunucusu sistem çapında yapılandırma dosyasıdır.  Görmek
# Daha fazla bilgi için sshd_config (5).
# Bu SSHD,/usr/local/sbin:/usr/local/bin ile derlendi:/usr/sbin:/usr/bin:/sbin:/bin:/usr/oyunlar
# Varsayılan SSHD_CONFIG'deki seçenekler için kullanılan strateji
# OpenSsh, nerede varsayılan değerleri ile seçenekleri belirlemektir.
# Mümkün, ama onları yorum bırak.  Seçkin seçenekler geçersiz kılın
# varsayılan değer.
# Port 22
# Adres family
# Dinleaddress 0.0.0.0
# Dinleaddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Sipherler ve anahtarlama
# Rekeylimit varsayılan yok
# Günlüğe kaydetme
# Syslogfacility auth
# Loglevel Bilgisi
# Kimlik Doğrulama:
# Logingracetime 2m
# Permitrootlogin Yasak-Password
# StrictModes Evet
# Maxauthtries 6
# Maxsessess 10
# .SSH/JUTSISTION_KEYS2'nin gelecekte varsayılan olarak göz ardı edilmesini bekleyin.
# YetkiliPrincipalsFile Yok
# Yetkili Tekscommand Yok
# Yetkili Tekscommanduser Kimse
# Bunun çalışması için/etc/SSH/SSH_KING_HOSTS içindeki ana anahtarlara da ihtiyacınız olacak
# HostbaseTauthentication Hayır
# Güvenmiyorsanız ~/.ssh/bilinen_hosts için evet olarak değiştirin
# Hostbaseauthentication
# Ignoreuser Binekler Hayır
# Kullanıcının ~/.rhosts ve ~/.Shosts dosyalarını okumayın
# Cahiller evet
# Tünelli açık metin şifrelerini devre dışı bırakmak için burada hayır olarak değiştirin!
# İzmitemptypasswords no
# Challenge-yanıt şifrelerini etkinleştirmek için evet olarak değiştirin (
# bazı PAM modülleri ve iş parçacıkları)
# Kerberos Seçenekleri
# Kerberosauthentiction no
# KerberosorlocalPasswd evet
# KerberosticketCleanup evet
# Kerberosgetafstoken no
# GSSAPI Seçenekleri
# GSSAPIATHECTICATION NO
# Gssapicleanupcredials evet
# GSSAPISTRICTACECTORCHECK EVET
# Gssapikeyexchange hayır
# Pam kimlik doğrulamasını, hesap işlemeyi etkinleştirmek için bunu 'evet' olarak ayarlayın,
# ve oturum işlemesi. Bu etkinleştirilirse, PAM kimlik doğrulaması
# KBDInteractiveAuthentication'a izin verilebilir ve
# Parola.  Pam yapılandırmanıza bağlı olarak,
# KbdinteractiveAuthentication aracılığıyla PAM kimlik doğrulaması atlayabilir
# "Password Olmadan Permitrootlogin" ayarı.
# Pam hesabının ve oturum kontrollerinin olmadan çalışmasını istiyorsanız
# PAM kimlik doğrulaması, ardından bunu etkinleştir, ancak parola ayarını ayarlayın
# ve 'hayır' için kbdinteractiveauthentiction.
# Alafına verilen evet
# Veriltcporwarding EVET
# Gatewayports Hayır
# X11displayoffet 10
# X11uselocalhost evet
# PERSITTY EVET
# Printlastlog evet
# Tcpkeepalive evet
# İzmituserEnvolment no
# Sıkıştırma gecikti
# ClientaliveInterval 0
# ClientaliveNountMax 3
# Kullanılır hayır
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Permittunnel Hayır
# ChrootDirectory yok
# Sürüm yok
# Varsayılan banner yolu yok
# İstemcinin yerel ortam değişkenlerini geçmesine izin verin
# Alt Sistemlerin Varsayılanını Geçersiz Kesinlikle
# Kullanıcı bazında geçersiz kılma örneği
# Kullanıcı anoncvs eşleştirin
# X11 HAYIR HAYIR
# İzin verilen hayır
# PERSITTY HAYIR
# Forcecommand CVS Sunucusu

Dosyayı kaydetmek için Ctrl+X ve Y'yi unutmayın. Ardından, başlatma (hepsi kullanıcımızın varsayılan ana dizininde) adlı temel bir komut dosyası yazalım.

nano initialize

Bu satırları değiştirerek dosyaya ekleyinSSH anahtarınızla Cat'i kullanarak buldunuz. (.ssh/id_rsa.pub)

# !/Bin/Bash

Sizi bu dosyada yönlendirmek için satır satır başlayalım. İlk satır derleyiciye bunun bir Bash komut dosyası olduğunu söyler. Ardından bağımlılıkları yüklüyor, SSHD_CONFIG'yi doğru dizine kopyalıyor, SSH'yi yeniden başlatıyoruz, kök için SSH tuşları oluşturuyor, kullanıcı 'ekibini' ekleyiyoruz (bunun için istediğiniz bir ad seçebilir, adlarıyla ve devre dışı şifresini şimdilik kullanabilirsiniz). Ayrıca Sudo Grubuna ekip ekliyoruz, SSH anahtarlarını oluşturuyoruz, anahtarımızı yetkili anahtarlara ve onlarınkine ekliyoruz ve anahtarlarını yazdırıyoruz. Bu yeni kullanıcı, siteye nasıl giriş yapacağımız olacaktır.

Yeni bir terminalde devam edin ve sunucuyu tekrar açın.

ssh team@XX.XX.XX.XX

Bir SSH anahtarınız olduğu gibi, bu sefer bir şifreye ihtiyacınız olmamalıdır. Ayrıca siteyi daha güvenli tutmak için girişimi şifre ile devre dışı bıraktık.

Şimdi, bu sunucu hakkında hiçbir bilgi olmadan tamamen boş başlıyor. Uzak makineyi indirip çalıştırabilmemiz için projemizi GIT'den klonlayarak başlayalım. SSH'ye bağlı uzak sunucuda, önce SSH anahtarınızı yazdırın:

cat ~/.ssh/id_rsa.pub

Ardından, bu anahtarı git depomuzu ayarlamak için daha önce yaptığımız gibi git ayarlarına yapıştırın. Şimdi projemizi doğrudan sunucuya klonlayabiliriz. İndirmek için GIT sunucusunda olacak şekilde projeyi yerel olarak yedeklediğinizden emin olun.

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

Mükemmel. Şimdi tüm dosyalar burada. Onları LS ile görebiliriz

ls

Şimdi sunucuyu kurmaya başlayalım. İlk olarak, proje dizininizi proje için kullanacağımız basit, unutulmaz bir ada kopyalayın.

cp -r yourproject whatyoucalledit

"WhatoUnalledit" projenizin yeni adıdır. Ardından, sunucuyu kurmak için temel bir yardımcı program oluşturmamız gerekecek. Bu yardımcı programı kaydedeceğiz ve gelecekte kullanacağız. Bu yardımcı programı oluşturmak için, bir komut dosyasını nasıl düzenlediğimizi tanımlamak için bir kullanıcı ikili oluşturalım. Bash, Düzenle/USR/BIN/Ascript kullanma

sudo nano /usr/bin/ascript

Dosyayı düzenlemek için izinleriniz olması için orada sudo kullandığınızdan emin olun. Dosyaya şu satırları ekleyin:

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

Unutmayın, bu senaryo bir argüman, senaryo adı, 1 $ olarak. İlk olarak dosyanın var olup olmadığını kontrol eder veya başka bir şekilde oluşturur, komut dosyasının bash olduğunu bildiren ilk satırı ekler, izinlerini değiştirir, düzenler ve adını oluşturduğumuz komut dosyalarının adlarını depolamamıza izin veren /etc /ascripts'e ekler. Dosya zaten varsa, izinleri değiştirin ve düzenleyin. Dosyayı kaydedin ve sonra izinlerini değiştireceğiz. Bu komut dosyasını kullandığımız sürece, bunu bir daha yapmak zorunda kalmayacağız.

sudo chmod a+x /usr/bin/ascript

Mükemmel. Şimdi Setup adlı bir komut dosyası oluşturalım. İlk olarak, sizi boğmak değil, ama kurulum betiğimin neye benzediğine bir göz atın. Projenizde bu senaryo nasıl görünmesi gerektiği arasında dolaşacağız, başlamak için senaryomdaki her şeye ihtiyacınız olmayacak.

# !/Bin/Bash
# sudo chmod a+x komut dosyaları/usersetup
# ./scripts/usersetup
# SSH-Keygen
# Proje dizin
# Günlük komutları
# Nano Config
# Git yapılandırma
# Güncelle ve yükle
# Clamav antivirüsünü etkinleştirin
# Ana bilgisayar adını ayarla
# Postgres kurulum
# Veritabanı yedeklemesi
# İptables'ı devre dışı bırak
# Bitdefender'ı yükleyin
# Kurulum Postfix
# Dirs Oluştur
# VirtualEnv'i kurulum
# Bağımlılıklar al ve oluşturun
# Güvenlik duvarı kurallarını ayarlayın
# PYPI bağımlılıklarını yükleyin
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP yüklemesi OpenCV-Python == 4.5.5.64
# PIP Kurulumu OpenCV-Contrib-Python == 4.5.5.64
# Sertifika kurun
# Sertifika çalıştırın
# Posta Sunucusunu Yeniden Yükle
# Kopyala sertifikası
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Yama venv
# Kullanıcı ayarlarını ayarlayın
# İzinler Ayarla
# Sudo Chown -r Takımı: Kullanıcılar/Var/Run/
# Sudo Chown Kök: Kök/Run/Sudo/TS -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: kullanıcılar db.sqlite3
# Yapılandırma kopyala ve izinleri ayarlayın
# Kurulum veritabanı
# Pam yapılandırmasını enjekte edin ve hatalı SSH yapılandırmasını kaldır
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profil
# Bin komut dosyalarını kopyalayın ve izinleri ayarlayın
# Hizmetleri yeniden yükleyin ve etkinleştirin
# Apache modüllerini etkinleştir
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Varsayılan siteyi devre dışı bırakın
# Sitemizi etkinleştirin
# Daemon'u yeniden yükleyin ve Apache, Postfix ve OpendKim'i yeniden başlatın
# İzinler Ayarla
# Takas Yapılandırması
# İnit altyazı motoru
# Kurulum Git
# Etki alanı yapılandırması için IPv6 ve OpendKIM'i gösterin
# Kurulum tamamlandı

Bu çok fazla kurulum! Kısacası, bu kod günlükleri günlüğe kaydetti, nano ve git yapılandırır, dosyalar üzerinden kopyalar, ubuntu apt paketlerini indirir ve yükler, python bağımlılıkları, postfix (veritabanı sunucusu) yapılandırır ve yükler, UFW'yi yapılandırır, UFW'yi yapılandırır, UFW (kargaşa ve disiples, dağıtır, disiples, displactes, dağıtımlar, disiples, dağıtımlar, klonlar, klonlar, klonlar yapar, klonlar, klonlar, klonlar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar yapar, klonlar, Sunucuyu ayarlar, yapılandırmayı yükler, başlatır ve sevgiyi etkinleştirir, takas ayırır, izinleri ayarlar ve IP, IPv6 adresini ve OpendKim tuşunu yazdırır. Oldukça basit, ama çok fazla kod gibi görünüyor. Buna çok ihtiyacımız olmayacak çünkü bağımlılıklarımız yok, kereviz, celererybeat veya daphne kullanmıyoruz, ancak başlamak için bazılarını yine de yükleyeceğiz. Bu kodun birkaç kez beyan edilen bir alan adına sahip olduğuna dikkat edin.

Ayrıca bir alan adı satın almamız gerekecek (bu da yıllık küçük bir ücrettir). Bir alan adı satın almak için Squarespace'i tavsiye ederim, düzenleri sezgisel ve kullanımı kolaydır. Seçtiğiniz herhangi bir etki alanını satın alabilirsiniz, ancak bu örnekte femmebabe.com alanını kullanıyorum. Bir etki alanı satın aldıktan sonra, Squarespace DNS yapılandırma paneline gidin ve alan adınızı IP adresi ile sunucuya işaret eden A kayıt ekleyin. Şöyle görünmeli:

@ A xx.xx.xx.xx

Ana bilgisayar olarak @ operatör ile, bu etki alanı ve kök etki alanı altındaki tüm alt alanların tümü sunucuya yönlendirilir. Beyan edilecek daha fazla kayıt var, ancak posta göndermeye hazır olduğumuzda bunlara geçebiliriz. Unutmayın, sunucudan başarılı bir şekilde posta gönderebilmeniz birkaç gün sürebilir. Belirlediğimiz DNS kayıtları yayılması zaman alacak.

Her neyse, başlamamız gereken tek kayıt A Record. Şimdi projemize göre aşağıdaki komut dosyasını doldurabilir ve çalıştırabiliriz.

Temel bir ilerleme için ihtiyacımız olanı yüklemek için daha küçük bir kurulum komut dosyasıyla başlayalım. Çok fazla bağımlılık veya PostgreSQL kullanmayacağız, sadece temel bir HTTP sunucusu başlatacağız ve yapıldığında onaylama konusunda endişeleneceğiz. Bir HTTPS sertifikası almak ve sunucuyu güvenli bir şekilde çalıştırmak için, Rent A Sunucu ile birlikte bir alan adı satın almamız gerekecek. Şimdilik, bu dosyadaki "Team" i kullanıcınızın adıyla "Dir" yi projenizin dizini ile değiştirin ve e -postanızı ve etki alanınızı <> etiketlerde sağlayın.

Buna ek olarak, bu kodu çalıştırmadan önce, eğer varsa barındırma sağlayıcının desteklediği güvenlik duvarına ayarları değiştirmemiz gerekir. Genellikle bu, barındırma sağlayıcınızın 'ağlar' sekmesinde veya kendi kendine barındırıyorsanız, yönlendiricinizin 'bağlantı noktası yönlendirme' bölümünde. Ayrıca, kendi kendine barındırma kullanıyorsanız, sunucu makinenizin adresi ile yönlendiriciniz aracılığıyla statik bir IP kurmak isteyeceksiniz. Okuma/yazma erişimi için aşağıdaki bağlantı noktalarını açmanız gerekir.

22 (SSH) 25 (posta) 587 (posta) 110 (posta istemcisi) 80 (HTTP) 443 (HTTPS)

# !/Bin/Bash
# Günlük komutları
# Nano Config
# Git yapılandırma
# Güncelle ve yükle
# Clamav antivirüsünü etkinleştirin
# Ana bilgisayar adını ayarla
# Veritabanı yedeklemesi
# İptables'ı devre dışı bırak
# VirtualEnv'i kurulum
# Sertifika kurun
# Sertifika çalıştırın
# Kullanıcı ayarlarını ayarlayın
# İzinler Ayarla
# Sudo Chown -r Takımı: Kullanıcılar/Var/Run/
# Sudo Chown Kök: Kök/Run/Sudo/TS -r
# Hizmetleri yeniden yükleyin ve etkinleştirin
# Apache modüllerini etkinleştir
# Daemon'u yeniden yükleyin ve Apache, Postfix ve OpendKim'i yeniden başlatın
# Etki alanı yapılandırması için IPv6 ve OpendKIM'i gösterin

Bu kodu çalıştırmadan önce, satın aldığınız etki alanının sunucuya bağlı olduğundan emin olun. Bunu yapmak için, yerel makinenizde bir terminal açın ve bu komutu alan adınızla çalıştırın:

ping femmebabe.com # Ping'den sonra alan adınızı buraya ekleyin

Her şey yolunda görünüyorsa ve sunucu yanıt gönderiyorsa, komut dosyasını çalıştırmaya ve paketleri yüklemeye ve Apache sunucumuzu başlatmaya, etkinleştirmeye ve onaylamaya hazırız.

Postfix'i yapılandırmak için gereken tüm kurulum değil, bu kuruluma daha sonra bakacağız. Şimdilik, bu kurulum kodunu çalıştırın ve sunucunuzu yüklemek ve onaylamak birkaç dakika sürmelidir. Bir kez daha, satın aldığınız ada göre komut dosyasındaki ad, e -posta ve alan adını değiştirdiğinizden emin olun.

Sunucunun sağlandığına göre, herhangi bir web tarayıcısında URL'ye gidebilir ve sunucunun HTTPS çalıştırdığından emin olmak için kontrol edebilirsiniz. Değilse, DNS kayıtlarının yakalanmasını ve ardından sertifika sertifikasını yeniden denemek için aşağıdaki komutu çalıştırmasını beklemeyi deneyin:

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

Her şeyi doğru yapılandırdığınız sürece, kodunuzun çalıştığını ve canlı bir web sayfası görüntülediğini bilmek için Apache'nin varsayılan sayfasına erişebilmeniz gerekir. Ardından, varsayılan hata ayıklama modumuzu üretime dönüştürmek için settings.py'yi düzenleyelim. Ayrıca Dahili IP'lerin yanı sıra ayarlarda da etki alanını yapılandıracağız.

nano yourproject/settings.py

Ayarlarda, bu satırları değiştirin/ekleyin.

# Site Yapılandırması

Şimdi Apache2'yi yapılandırmamız gerekecek. Bu satırla dağıtacağımız yapılandırma dosyasını düzenleyelim:

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

Bu yapılandırma dosyasında etki alanı adımız ve kullanıcı ve projenin adı olmalıdır. Femmebabe.com alan adını, kullanıcı adı ekibini ve femmebabe proje adı kullanıyorum.

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>

Sunucunuzu yapılandırırken bu örnek koddaki projenin, dizinlerin ve etki alanının adını değiştirdiğinizden emin olun. Şimdi, varsayılan siteyi devre dışı bırakmamız gerekecek. Bu BASH kullanılarak yapılabilir.

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

Ardından, Varsayılan Siteyi etkinleştirebilir ve BASH'ı kullanarak Apache2'yi yeniden yükleyebiliriz. Femmebabe'yi/etc/apache2/sites-üileable/düzenlerken bildirdiğiniz dosyanın adıyla değiştirmeyi unutmayın.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Navbar'daki alan adınıza geri dönün. Web tarayıcınızda yapılandırdığınız siteyi görmelisiniz. Tebrikler! Eğer görmüyorsanız, bazı değişiklikler yapmanız gerekebilir. Projenizdeki ayarları, Apache yapılandırmasını dikkatlice inceleyin ve hatalarınız olmadığından emin olun ve projeyi hatalar için kontrol etmek için aşağıdaki komutları çalıştırın.

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

Python projenizde hatalarınız varsa, onları bulundukları yere kadar takip edin ve düzeltin. Tüm hatalarınızı nerede olduklarına bağlı olarak göremeyebilirsiniz, bu nedenle sadece "Populate yeniden giriş yapmaz" diyen bir hatanız varsa, hatayı ortaya çıkarmak için sanal ortamda aşağıdaki dosyayı düzenleyin.

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

Bu çalışma zamanı hatasının yükseltildiği 83. satıra kaydırın (RuntimeError ("Populate () yeniden giriş yapmaz")) ve bu satırdan önce bir yorum ekleyin, ardından aynı girinti ekleyerek self.app_configs = {}. Bu şöyle görünüyor:

                # AppConfig.Ready () çalıştırmaktan kaçınmak için yeniden giriş çağrılarını önleyin
                # yöntemler iki kez.
# RuntimeRor ("Populate () yeniden giriş yapmıyor") yükseltme

Daha sonra projeyi tekrar kontrol edebilir ve hatayı ortaya çıkarabilirsiniz.

python manage.py check

Sonra hatayı görebilir ve düzeltebilirsiniz. Düzelttiğiniz ve kod hatasız derlendiğinde, dosyayı şöyle görünecek şekilde değiştirdiğinizden emin olun:

                # AppConfig.Ready () çalıştırmaktan kaçınmak için yeniden giriş çağrılarını önleyin
                # yöntemler iki kez.
# self.app_configs = {}

Sunucunun çevrimiçi olması koşuluyla, daha fazla değişiklik yaptığımızda, sunucuyu yeniden yüklemek için aşağıdaki komutu kullanmamız gerekir:

sudo systemctl reload apache2

Mükemmel! Peki ya posta göndermeye ne dersiniz? E -posta göndermeye başlamak için önce etki alanı yapılandırmasını güncellememiz gerekecektir. Bu, Squarespace'deki DNS panelinizde veya seçtiğiniz alan adı kayıt şirketinde olmalıdır. Ayrıca yapılandırma yüklemeli ve eklememiz ve birkaç komut çalıştırmamız gerekecek.

İlk olarak, sunucunun IPv6 adresini alalım. Daha sonra DN'lerinizi açacağız ve kayıtları ekleyeceğiz.

Sunucunun IPv6 adresini almak için şu komutu kullanın:

ip -6 addr

Şimdi, aşağıdaki kayıtları DNS ayarlarına ekleyebiliriz. Kayıtlarım böyle görünüyor. Ancak, kayıtlarınız için IP adresini IP'nizle değiştirmelisiniz (75.147.182.214 değil, bu benim). Ayrıca alan adınızı femmebabe.com'un yanı sıra önceki komutla bulunan IPv6 adresinizi de ekleyin (Mayın, Fe80 :: 725a: FFF: FE49: 3E02) kullanamazsınız). Şimdilik Domainkey için endişelenmeyin, bu, Postfix, posta sunucusu, OpendKim ile ayarladığımızda ve tuşu yazdırdığımızda oluşturulur. Bunu en son yapılandıracağız.

@ 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 ~ Tüm

varsayılan._bimi TXT N/A v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg

_dmarc TXT N/A V = DMARC1; P = yok

sendonly._domainkey TXT N/A

Şimdi, Postfix için bazı kalıcı yapılandırma eklememiz gerekecek. Tek yapmamız gereken alan adını Femmebabe.com, kullandığınız alan adıyla değiştirdiğimizden emin olmaktır. Tüm yapılandırma dosyalarına tek tek bakalım ve işletim sistemine yüklemek için bunları projemizde yapılandıran bir dizine yükleyelim.

nano config/etc_postfix_main.cf

Bu metni dosyaya ekle

# Yorumlanan, daha eksiksiz bir sürüm için bkz. /Usr/share/postfix/main.cf.dist
# Debian Spesifik: Bir dosya adı belirlemek ilkine neden olur
# Bu dosyanın satırı adı olarak kullanılacak.  Debian Varsayılan
# IS /etc /mailname.
# Myorigin = /etc /mailname
# Ekleme.
# "Gecikmeli Posta" uyarıları oluşturmak için bir sonraki satırın
# DELAK_WARNING_TIME = 4H
# Bkz.
# Taze kurulumlar.
# TLS parametreleri
# Milter yapılandırması

Sonraki Yapılandırma!

nano config/etc_postfix_master.cf

Bu satırları ekleyin:

# 
# Postfix ana işlem yapılandırma dosyası.  Biçim hakkında ayrıntılar için
# Dosyadan Master (5) manuel sayfasına bakın (komut: "Man 5 Master" veya
# On-line: http://www.postfix.org/master.5.html).
# 
# Bu dosyayı düzenledikten sonra "Postfix Reload" i yürütmeyi unutmayın.
# 
# =========================================================================
# Servis Türü Özel İncil Chroot Wakeup Maxproc Command + Args
# (evet) (evet) (hayır) (asla) (100)
# =========================================================================
# SMTP INET N - Y - 1 Postscreen
# smtpd geçişi - - y - - smtpd
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Birini seçin: Yalnızca Loopback istemcileri veya herhangi bir istemci için gönderimi etkinleştirin.
# 127.0.0.1:submission inet n - y - - smtpd
# -O syslog_name = postfix/gönderim
# -O smtpd_tls_security_level = şifreleme
# -O SMTPD_SASL_AUTH_ENABLE = EVET
# -O smtpd_tls_auth_only = evet
# -O smtpd_reject_unlisted_recipient = hayır
# -O smtpd_client_restrictions = $ mua_client_restrtions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O smtpd_recipient_restrictions =
# -O smtpd_relay_restrictions = permit_sasl_authenticated, reddet
# -O milter_macro_daemon_name = kökenli
# Birini seçin: Yalnızca geri döngü istemcileri veya herhangi bir istemci için SMTPS'yi etkinleştirin.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -O syslog_name = postfix/smtps
# -O smtpd_tls_wrappermode = evet
# -O SMTPD_SASL_AUTH_ENABLE = EVET
# -O smtpd_reject_unlisted_recipient = hayır
# -O smtpd_client_restrictions = $ mua_client_restrtions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O smtpd_recipient_restrictions =
# -O smtpd_relay_restrictions = permit_sasl_authenticated, reddet
# -O milter_macro_daemon_name = kökenli
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -O smtp_helo_timeout = 5 -O smtp_connect_timeout = 5
# 
# ======================================================================
# PostFix olmayan yazılım arayüzleri. Kılavuzu incelediğinizden emin olun
# Hangi seçenekleri istediğini öğrenmek için PostFix yazılımının sayfaları.
# 
# Aşağıdaki hizmetlerin birçoğu Postfix borusu (8) teslimatını kullanıyor
# ajan.  $ {Alıcı} Hakkında Bilgi İçin Pipe (8) Man Sayfasına bakın
# ve diğer mesaj zarf seçenekleri.
# ======================================================================
# 
# Maildrop. Ayrıntılar için postfix maildrop_readme dosyasına bakın.
# Ayrıca main.cf'de belirtin: maildrop_destination_recipient_limit = 1
# 
# 
# ======================================================================
# 
# Son Cyrus sürümleri mevcut "LMTP" master.cf girişini kullanabilir.
# 
# Cyrus.conf'da belirtin:
# lmtp cmd = "lmtpd -a" dinleme = "localhost: lmtp" proto = tcp4
# 
# Main.cf'de aşağıdakilerden bir veya daha fazlasını belirtin:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# ======================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Ayrıca Main.cf'de belirtin: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - boru
# Flags = drx kullanıcı = cyrus argv =/cyrus/bin/dağıtım -e -r $ {gönderen} -m $ {extension} $ {user}
# 
# ======================================================================
# Cyrus üzerinden teslimat örneği.
# 
# eski -cyrus unix - n n - - boru
# Flags = R USER = Cyrus argv =/cyrus/bin/teslim -e -m $ {extension} $ {user}
# 
# ======================================================================
# 
# Yapılandırma detayları için Postfix UUCP_README dosyasına bakın.
# 
# 
# Diğer harici dağıtım yöntemleri.
# 

Ve OpendKim yapılandırması. OpendKim, e -posta sunucularını daha güvenli hale getirmek için etki alanı anahtarlarıyla tanımlar. Onsuz, posta imzalanmaz ve bir gelen kutusuna girmeyebilir.

nano config/etc_default_opendkim

Bu satırları ekleyin:

# Not: Bu, eski bir yapılandırma dosyasıdır. Opendkim tarafından kullanılmıyor
# Systemd hizmeti. Lütfen ilgili yapılandırma parametrelerini kullanın
# bunun yerine /etc/opendkim.conf.
# 
# Daha önce, burada varsayılan ayarları düzenler ve ardından yürütür
# /lib/opendkim/opendkim.service.Genera, SystemD'yi geçersiz kılma dosyalarını oluşturmak için
# /etc/systemd/system/opendkim.service.d/override.conf ve
# /etc/tmpfiles.d/opendkim.conf. Bu hala mümkün olsa da, şimdi
# Ayarları doğrudan /etc/opendkim.conf adresinde ayarlamanız önerilir.
# 
# Daemon_opts = ""
# /Var/makara/postfix/run/opendKim olarak değiştirin,
# Postfix bir chroot:
# RunDir =/var/makar/postfix/run/opendKim
# 
# Alternatif bir soket belirlemek için
# Bunu ayarlamanın opendkim.conf'daki herhangi bir soket değerini geçersiz kılacağını unutmayın.
# varsayılan:
# 54321 bağlantı noktasındaki tüm arayüzleri dinleyin:
# Soket = inet: 54321
# 12345 numaralı bağlantı noktasında döngü dinleyin:
# Soket = inet: 12345@localhost
# Port 12345'te 192.0.2.1'de dinleyin:
# Soket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Bu satırları ekleyin:

# default_process_limit = 100
# default_client_limit = 1000
# Hizmet işlemleri için varsayılan VSZ (sanal bellek boyutu) sınırı. Bu esas olarak
# Yemeden önce hafızayı sızdıran süreçleri yakalamayı ve öldürmeyi amaçladı
# her şey.
# varsayılan_vsz_limit = 256m
# Oturum açıcı kullanıcı, giriş işlemleri tarafından dahili olarak kullanılır. Bu en güvenilmeyen şey
# Dovecot sisteminde kullanıcı. Hiçbir şeye erişememelidir.
# default_login_user = dovenull
# Dahili kullanıcı, ayrıcalıklı işlemler tarafından kullanılır. Ayrı olmalı
# Giriş kullanıcısı, böylece oturum açma işlemleri diğer işlemleri bozamaz.
# default_internal_user = Dovecot
    # Port = 143
    # Port = 993
    # ssl = evet
  # Yeni bir sürece başlamadan önce işlenecek bağlantı sayısı. Tipik olarak
  # Tek yararlı değerler 0 (sınırsız) veya 1. 1 daha güvenlidir, ancak 0
  # daha hızlı. <doc/wiki/loginprocess.txt>
  # Service_count = 1
  # Her zaman daha fazla bağlantı beklemeye devam edecek süreç sayısı.
  # Process_min_avail = 0
  # Service_count = 0 ayarlarsanız, muhtemelen bunu büyütmeniz gerekir.
  # vsz_limit = $ default_vsz_limit
    # Port = 110
    # Port = 995
    # ssl = evet
    # Port = 587
  # Yalnızca yukarıdaki UNIX soketini kullanamıyorsanız, Inet dinleyici oluşturun
  # inet_listener lmtp {
    # LMTP'yi tüm internet için görünür kılmaktan kaçının
    # adres =
    # bağlantı noktası =
  # }
  # Belleğin çoğu mmap () ing dosyalarına gider. Bunu artırmanız gerekebilir
  # Büyük posta kutularınız varsa sınırlayın.
  # vsz_limit = $ default_vsz_limit
  # Maks. IMAP işlemlerinin sayısı (bağlantılar)
  # Process_limit = 1024
  # Maks. POP3 işlemlerinin sayısı (bağlantılar)
  # Process_limit = 1024
  # Maks. SMTP Gönderme Süreçlerinin Sayısı (Bağlantılar)
  # Process_limit = 1024
  # Auth_socket_path varsayılan olarak bu UserDB soketine işaret eder. Tipik olarak
  # Dovecot-Lda, Doveadm, muhtemelen IMAP işlemi vb. Tarafından kullanılır. Sahip olan kullanıcılar
  # Bu sokete tam izinler, tüm kullanıcı adlarının bir listesini alabilir ve
  # Herkesin UserDB aramalarının sonuçlarını alın.
  # 
  # Varsayılan 0666 modu, herkesin sokete bağlanmasına izin verir, ancak
  # Userdb aramaları, yalnızca userdb bir "uid" alanı döndürürse başarılı olur
  # Arayan işleminin UID'siyle eşleşir. Ayrıca arayanın UID veya GID'si eşleşirse
  # Soketin UID veya GID Arama başarılı olur. Başka bir şey başarısızlığa neden olur.
  # 
  # Arayana tüm kullanıcıları aramaya tam izin vermek için modu ayarlayın
  # 0666'dan başka bir şey ve Dovecot, çekirdeğin uygulanmasını sağlar.
  # izinler (örneğin 0777 herkese tam izin verir).
  # Yetkilendirme işçisi süreci varsayılan olarak kök olarak çalıştırılır, böylece erişebilir
  # /etc/shadow. Bu gerekli değilse, kullanıcı
  # $ varsayılan_internal_user.
  # kullanıcı = kök
  # Dict proxy kullanılırsa, posta işlemlerinin soketine erişimi olmalıdır.
  # Örneğin: Mod = 0660, Grup = Vmail ve Global Mail_access_groups = Vmail
    # mod = 0600
    # kullanıcı =
    # grup =

Bir kez daha, bu dosyalardaki alan adını femmebabe.com'da seçtiğiniz alan adıyla değiştirdiğinizden emin olun. Bir sonraki dosyayı düzenleyin, Dovecot'un Yapılandırması,

nano config/etc_dovecot_dovecot

Ve bu çizgileri ekle

## Dovecot yapılandırma dosyası
# Eğer acele ediyorsanız, http://wiki2.dovecot.org/quickconfiguration bkz.
# "Doveconf -n" komutu, değiştirilen ayarların temiz bir çıkışını verir. Kullanın
# Dovecot posta listesine gönderirken dosyaları kopyalamak ve yapıştırmak yerine.
# '# 'Karakter ve ondan sonraki her şey yorum olarak değerlendirilir. Ekstra Mekanlar
# ve sekmeler göz ardı edilir. Bunlardan birini açıkça kullanmak istiyorsanız,
# value inside quotes, eg.: key = "# Char ve son boşluk "
# Çoğu (hepsi değil) ayarlar farklı protokoller tarafından geçersiz kılınabilir ve/veya
# Örneğin, ayarları bölümlerin içine yerleştirerek kaynak/hedef IPS:
# Protokol IMAP {}, Yerel 127.0.0.1 {}, uzaktan 10.0.0.0/8 {}
# Her ayar için varsayılan değerler gösterilir, çözülmesi gerekmez
# onlar. Bunlar bunun istisnalarıdır: Bölüm yok (örneğin ad alanı {})
# Veya eklenti ayarları varsayılan olarak eklenir, bunlar yalnızca örnek olarak listelenir.
# Yollar ayrıca sadece gerçek varsayılanların yapılandırmaya dayalı örnekleridir
# seçenekler. Burada listelenen yollar yapılandırma içindir ---prefix =/usr
# ---sysconfdir =/etc --localstatedir =/var
# Yüklü protokolleri etkinleştirin
# Bağlantı için nerede dinleneceğiniz IP'lerin veya ana bilgisayarların virgül ayrılmış bir listesi.
# "*" Tüm IPv4 arabirimlerini dinler, "::" Tüm IPv6 arabirimlerini dinler.
# Varış dışı bağlantı noktaları veya daha karmaşık bir şey belirtmek istiyorsanız,
# Conf.d/master.conf'u düzenleyin.
# dinle = *, ::
# Temel dizin çalışma zamanı verilerini nerede saklayabiliriz.
# Base_dir =/var/run/dovecot/
# Bu örneğin adı. Çoklu kurulum Doveadm ve diğer komutlarda
# hangi örneğin kullanıldığını seçmek için -i <cruct_name> kullanabilir (alternatif
# -c <config_path>). Örnek adı Dovecot işlemlerine de eklenir
# PS çıkışında.
# instance_name = Dovecot
# Müşteriler için tebrik mesajı.
# login_greeting = Dovecot hazır.
# Güvenilir ağ aralıklarının uzay ayrılmış listesi. Bunlardan bağlantılar
# IP'lerin IP adreslerini ve bağlantı noktalarını geçersiz kılmalarına izin verilir (günlük kaydı ve
# kimlik doğrulama kontrolleri için). disable_plaintext_auth da göz ardı edilir
# Bu ağlar. Genellikle IMAP proxy sunucularınızı buradan belirlersiniz.
# login_trusted_networks =
# Alandan Ayrılmış Oturum Açma Erişim Kontrolü Soketleri (örn. TCPWRAP)
# login_access_sockets =
# Proxy_Maybe ile = EVET Bu IP'lerden herhangi biriyle eşleşiyorsa, yapmayın
# Proxy. Bu normalde gerekli değildir, ancak hedef varsa yararlı olabilir
# IP, örn. bir yük dengeleyicisinin IP'si.
# Auth_proxy_felf =
# Daha ayrıntılı işlem başlıklarını (PS'de) gösterin. Şu anda kullanıcı adını gösteriyor ve
# IP adresi. IMAP işlemlerini kimin kullandığını görmek için kullanışlı
# (Örneğin paylaşılan posta kutuları veya birden çok hesap için aynı UID kullanılıyorsa).
# VerBose_proctitle = hayır
# Dovecot Master işlemi kapandığında tüm süreçler öldürülürse.
# Bunu "hayır" olarak ayarlamak, Dovecot'un onsuz yükseltilebileceği anlamına gelir
# Mevcut müşteri bağlantılarını kapmaya zorlamak (bu da olabilir
# Yükseltme, örn. bir güvenlik düzeltmesi nedeniyle).
# shutdown_clients = evet
# Sıfır değilse, bu birçok bağlantı aracılığıyla posta komutlarını Doveadm sunucusuna çalıştırın,
# bunları doğrudan aynı süreçte çalıştırmak yerine.
# Doveadm_worker_count = 0
# Unix Socket veya Ana Bilgisayar: Doveadm Server'a bağlanmak için kullanılan bağlantı noktası
# doveadm_socket_path = doveadm-server
# Dovecot'ta korunan ortam değişkenlerinin uzaydan ayrılmış listesi
# başlangıç ​​ve tüm çocuk süreçlerine geçti. Ayrıca verebilirsin
# Key = Her zaman belirli ayarları ayarlamak için değer çiftleri.
# Import_environment = TZ
## 
## Sözlük Sunucu Ayarları
## 
# Sözlük, anahtar = değer listelerini depolamak için kullanılabilir. Bu birkaç kişi tarafından kullanılır
# Eklentiler. Sözlüğe doğrudan veya bir
# sözlük sunucusu. Aşağıdaki Dict Block Haritalar Sözlük Adları URIS
# Sunucu kullanıldığında. Bunlar daha sonra URI'ler kullanılarak formatta referans verilebilir
# "Proxy :: <nam>".
  # kota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Gerçek yapılandırmanın çoğu aşağıda dahil edilir. Dosya adları
# İlk olarak ASCII değerine göre sıralanır ve bu sırayla ayrıştırılır. 00-PREFIXES
# Dosya adlarında, siparişi anlamayı kolaylaştırmayı amaçlamaktadır.
# Bir yapılandırma dosyası, hata vermeden de dahil edilmeye çalışabilir.
# bulunamadı:
# Dovecot'un tüm giriş bağlantılarını dinlemesine izin verir (IPv4 / IPv6)

Dovecot kullanıcısı için bir şifre ekleyin:

nano config/etc_dovecot_passwd

Dosyanın ilk kısmı, kolondan önceki kullanıcı adıdır. "YourPsword" son bölümü, posta sunucunuza vermek istediğiniz şifreyi belirtir.

team:{plain}yourpassword

Sonra, OpendKim Config

nano config/etc_opendkim.conf

Ve şu satırları ekleyin:

# Bu, imzalama ve doğrulama için temel bir yapılandırmadır. Kolayca olabilir
# temel bir kuruluma uyacak şekilde uyarlanmıştır. Bkz. OpendKim.conf (5) ve
# /usr/share/doc/opendkim/examples/opendkim.conf.sample için
# Mevcut yapılandırma parametrelerinin dokümantasyonu.
# Yok
# Ortak İmzalama ve Doğrulama Parametreleri. Debian'da "from" başlık
# Söz konusu, çünkü genellikle itibar sistemleri tarafından kullanılan kimlik anahtarıdır
# Ve böylece biraz güvenliğe duyarlı.
# Etki alanı, seçici ve anahtar imzalama (gerekli). Örneğin, imzalama yapın
# "2020" seçicisi ile "örnek.com" alan adı için (2020._domainkey.example.com),
# /etc/dkiimkeys/example.private içinde depolanan özel anahtarı kullanarak. Daha ayrıntılı
# Kurulum seçenekleri /usr/share/doc/opendkim/readme.opendkim adresinde bulunabilir.
# Domain Örnek.com
# Seçici 2020
# Keyfile /etc/dkiimkeys/example.prive
# Debian'da Opendkim kullanıcı "opendkim" olarak çalışır. Ne zaman
# Sokete ayrıcalıksız olarak erişen MTA'larla yerel bir soket kullanmak
# kullanıcı (örneğin, postfix). Grup için kullanıcı "postfix" eklemeniz gerekebilir
# "Opendkim" bu durumda.
# MTA bağlantısı için soket (gerekli). MTA bir chroot hapishanesinin içindeyse,
# Soketin erişilebilir olması sağlanmalıdır. Debian'da Postfix
# /var/makara/postfix'te bir chroot, bu nedenle bir UNIX soketinin olması gerekir
# Aşağıdaki son satırda gösterildiği gibi yapılandırılmıştır.
# Socket Yerel: /run/opendkim/opendkim.sock
# Soket inet: 8891@localhost
# Soket Inet: 8891
# Doğrulamak yerine imzalayacak olan ana bilgisayarlar, varsayılan 127.0.0.1'dir. Gör
# Daha fazla bilgi için OpendKim (8) Operasyon Bölümü.
# Dahili Dövme 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Güven çapası DNSSEC'i etkinleştirir. Debian'da, Trust Anchor dosyası sağlanır
# DNS-Root-Data paketi ile.
# Nameerers 127.0.0.1
# Harita Alanlarını Adreslerden Mesajlara İmzalamak İçin Kullanılan Anahtarlara Makin
# Postası imzalanması gereken bir dizi dahili ana bilgisayar
nano config/etc_default_opendkim

Ve bu çizgileri ekle

# Not: Bu, eski bir yapılandırma dosyasıdır. Opendkim tarafından kullanılmıyor
# Systemd hizmeti. Lütfen ilgili yapılandırma parametrelerini kullanın
# bunun yerine /etc/opendkim.conf.
# 
# Daha önce, burada varsayılan ayarları düzenler ve ardından yürütür
# /lib/opendkim/opendkim.service.Genera, SystemD'yi geçersiz kılma dosyalarını oluşturmak için
# /etc/systemd/system/opendkim.service.d/override.conf ve
# /etc/tmpfiles.d/opendkim.conf. Bu hala mümkün olsa da, şimdi
# Ayarları doğrudan /etc/opendkim.conf adresinde ayarlamanız önerilir.
# 
# Daemon_opts = ""
# /Var/makara/postfix/run/opendKim olarak değiştirin,
# Postfix bir chroot:
# RunDir =/var/makar/postfix/run/opendKim
# 
# Alternatif bir soket belirlemek için
# Bunu ayarlamanın opendkim.conf'daki herhangi bir soket değerini geçersiz kılacağını unutmayın.
# varsayılan:
# 54321 bağlantı noktasındaki tüm arayüzleri dinleyin:
# Soket = inet: 54321
# 12345 numaralı bağlantı noktasında döngü dinleyin:
# Soket = inet: 12345@localhost
# Port 12345'te 192.0.2.1'de dinleyin:
# Soket = inet: 12345@192.0.2.1

Postfix sunucumuzu kurmaya hazır olduğumuzda, uygun alan adı gömülü olan aşağıdaki kodu çalıştıracağız. Bir senaryo oluşturarak başlayın

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

Şimdi, Nano'da metin düzenleyicisi, bu dosyayı femmebabe.com yerine alan adınızı içerecek şekilde düzenleyin.

# !/Bin/Bash
# Kurulum Postfix

Şimdi, Postfix, OpendKim ve Dovecot'u yapılandırmak için tamamlanmış komut dosyasını çalıştırın.

./scripts/postfixsetup

Bu komut dosyası çalıştırıldıktan sonra, yazdırdığı son satırı kopyalayın ve sendonly._domainkey değeri olarak DNS yapılandırmanıza yapıştırın. Bu, güvenli posta gönderirken etki alanınızı tanımlamak için kullanılan OpendKim anahtarıdır.

Mükemmel! Birkaç gün içinde, her şeyin doğru yapılandırılması koşuluyla sunucudan posta gönderebilmeniz gerekir.

DNS'yi posta sunucunuz için yapılandırdıysanız, kayıtların güncellenmesi 72 saatten az sürmelidir. Genellikle çok daha hızlıdır. Sunucunuzun bu komutu kullanarak çalışıp çalışmadığını, e -postanızı sağlayarak kontrol edebilirsiniz:

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

Her şey doğru çalışıyor gibi görünüyorsa, sunucunuzla e -posta gönderebilmelisiniz. Çalışmıyorsa, hatanın ne olabileceğini görmek için günlüklere bakmayı deneyin.

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

Bu, sunucu tarafından gönderilen posta hakkında ve düzgün çalışıp çalışmadığı hakkında ayrıntılı bilgi sunacaktır. Gelen kutunuzdaki e -postayı da görebilmelisiniz, eğer orada değilse, spam klasörünüzü kontrol edin.

Ayrıca, e -posta sunucunuzun Django uygulamanızla projeyle konuşabilmesi için ayarlarınızı settings.py'de yapılandırmanız gerekecektir. Ayarlarınızda bu satırları ekleyin veya değiştirin

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

Parolayı almak için bir yapılandırma dosyası kullandığımıza dikkat edin. Bu dosyayı, dosyanın en başında böyle ayarlara yükleyelim.:

# Yapılandırmayı açın ve yükleyin

Bu dosyayı oluşturalım ve posta parolasının yanı sıra gizli bir anahtar ekleyelim. Gizli bir anahtar oluşturmak için, sonunda istediğiniz uzunlukta bu komutu kullanın:

openssl rand -base64 64

Şimdi, OpenSSL'nin oluşturulduğu metni kopyalayın ve /etc/config.json'u düzenleyin

sudo nano /etc/config.json

OpenSSL'nin gizli anahtar olarak oluşturulduğu anahtarla dosyanıza aşağıdaki satırları ekleyin.

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

JSON Formatı basit ve kullanımı kolaydır, projemizde kullanmak istediğimiz diğer anahtarları da bu şekilde bildirebilir ve bunları proje dizinimizden ayrı tutabiliriz, böylece diğer kullanıcıların onlara yazamaması ve böylece proje dizinimizden okunamamaları için onları ayrı tutabiliriz. Bu, burada birkaç taneden daha fazlasını kullanacağımız API Keys için önerilen uygulama.

Ayrıca, her şeyin kaydedildiğinden emin olmak için projenizi yedeklemek isteyeceksiniz ve artık bir sunucu kiralamak istemeseniz bile işinizi daha sonra kurtarabileceksiniz.

sudo backup

Şimdi, komut satırından bir tane göndermenin sağladığı Web sunucusundan bir HTML e -postası göndermeyi deneyin. Kabuktaki kullanıcı örneğinizi sorgulayın ve Django aracılığıyla o kullanıcıya bir HTML e -postası gönderin. Koddaki adımı Charlotte, kullanıcı adınıza değiştirin.

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

İlk komut çalışmıyorsa, kullandığınızdan emin olun

source venv/bin/activate

Her şey doğru ayarlanmış olması koşuluyla, şimdi web uygulamanız tarafından gönderilen posta kutunuza hoş geldiniz e -postası alacaksınız. Aferin! Uzun bir yol kat ettin.

Eklemek istedim, eğer böyle bir proje üzerinde çalışırken herhangi bir hata ile hiç mücadele ediyorsanız, cevap aramak ve yardım istemekten çekinmeyin. Google, diğer arama motorlarının yanı sıra, programlama yardımı aramak için harika kaynaklardır. Aldığınız hatayı arayın ve diğer insanların sorunu nasıl çözdüğünü görebilirsiniz. Ayrıca, benimle, eğitimcileriniz (öğretmenler, profesörler, öğretmenler), internette programlama yardımı için mevcut olan akranlarınızla iletişime geçebilir veya yaşadığınız sorunlara çözüm bulmak için bu kitaba tekrar veya diğer kaynaklara başvurabilirsiniz. Bunun kolay olmadığını anlıyorum, ancak bu kadar okuduğunuzda ve herhangi bir kod yazmasanız bile, bir web uygulaması oluşturma hakkında çok şey öğreniyorsunuz. Kendinizi arkaya yatırın, harika bir iş çıkarıyorsun.

Bu üçüncü baskı web geliştirme kılavuzunu okumak için zaman ayırdığınız için teşekkür ederiz. Gelecek baskılarda, belgenin başlangıcında tartışılan önemli örneklerden daha fazlasını ekleyeceğim ve yazılım ve donanım geliştirme dünyasına çok daha derinlemesine dalacağız. Gelecekler için bizi izlemeye devam edin ve size inanılmaz bir yazılım oluşturmayı öğretmeyi dört gözle bekliyorum. Bir sonraki baskıda görüşürüz!






Kapalı
Sayfa 1
Zıplamak
Makalenin tamamını görün
Okumaya devam et

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın



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

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


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

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


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

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do i find customers for my web development small business?


Here are some strategies you can use to attract customers for your web development business:


1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.


2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.


3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.


4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.


5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.


6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.


7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.


8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.


9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.


10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


what's the best way to boil eggs?


here is a simple method to boil eggs:


1. Place the eggs in a saucepan and cover her with cold water.

2. Bring the water to a boil over high heat.

3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>

4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.

5. Once cooled, you can peel and enjoy your perfectly boiled eggs.


.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


i just started taking birth control. What are the most common side effects?


the most common side effects of birth control pills include:


1. Nausea

2. Breast tenderness

3. Headaches

4. Weight gain

5. Mood changes

6. Spotting or breakthrough bleeding

7. Changes in libido 

8. Acne 

9. Bloating 


it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.

.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do I host a web server from my home?


Hosting a web server from your home can be done by following these steps:


1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.


2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.


3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.


4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.


5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.


6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.


7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.


8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.


Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do I write a professional blog post?


Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:

1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.

2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.

3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.

4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.

5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.

6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.

7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.

8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media

By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın



How do I get publicity and organic traffic for a website?


1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.


2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.


3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.


4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.


5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.


6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.


7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.


8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.


9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.


10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


What are the benefits to having a security camera?


1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.


2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.


3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.


4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.


5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


why is it safer to wear a mask in public?


wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.


.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


is sugar really unhealthy?


excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.


.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do i build a full stack web app with django?


Building a full stack web app with Django involves several steps. Here is a general outline of the process:


1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.


2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.


3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.


4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.


5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.


6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.


7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.


8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.


9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.


10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.


These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do I write a good book?


1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.


2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.


3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.


4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.


5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.


6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.


7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.


8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


What causes migraine and how are they treated?


Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.


Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:


1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen

2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines

3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes

4. Practicing relaxation techniques such as deep breathing or meditation

5. Applying hot or cold packs to the head or neck

6. Getting regular exercise and maintaining a healthy diet


It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do I build a mail server with postfix?


To build a mail server with Postfix, follow these steps:


1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.


2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.


3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.


4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.


5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.


6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.


Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın



why should i use an apple l out at the l word?


using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.


additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.


overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.

.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do i wear deadlock?


1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.


2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.


3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.


4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.


5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.


6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.


7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.


8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How do I send email with a compliant email list and unsubscribe links?


To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:


1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.


2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.


3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.


4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.


5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.


By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


Why do people implant nfc implants in their hands?


There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:


1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.


2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.


3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.


4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.


5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.


Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.


Satuz Almak

ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın


How is the crypto market growing so quickly?


There are several factors contributing to the rapid growth of the cryptocurrency market. 


1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.


2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.


3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.


4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.


5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.


Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.


ile Daisy / Görüş | Satın almak | Kripto para birimi ile satın alın




https://glamgirlx.com -


(Resmi indirmek için tıklayın veya dokunun)
Profesyonel eğlence, fotoğraflar, videolar, ses, canlı yayın ve gündelik oyunun yanı sıra kimlik taraması, web geliştirme ve taşıyıcılık hizmetleri.

Bu adresi kullanarak Bitcoin'de bana bir ipucu bırakın: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Hizmet Şartları