خبر - از سایت بازدید کنید
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 ...
یادگیری عمیق و امنیت مبتنی بر وب به عنوان مثال

یادگیری عمیق و امنیت مبتنی بر وب به عنوان مثال چاپ سوم شارلوت هارپر 3 ژوئیه 2024 3 ژوئن 2025 به روز شده/تبدیل شده

پیشگفتار:

ملاحظات امنیتی در ساخت و ساز نرم افزار برای وب بخش مهمی از برنامه و اجرای هر توسعه دهنده وب در حالی که مهندسی نمونه اولیه قابل اعتماد ، پایدار و برای اهداف عملی است. DOM (نشانه گذاری شیء اسناد) ، با اجرای آن HTML ، JavaScript و CSS و همچنین نرم افزارهای با پس زمینه اجرای Python ، C/C ++ ، Java و Bash ، به توسعه دهندگان وب می دهد تا آزادی و قدرت را برای ایجاد طیف گسترده ای از پروژه ها ایجاد کند که باعث ایجاد خلاقیت می شود ، به راحتی و استفاده از همه و شخصیت های جذاب و جذابیت را به تصویر می کشند و از آن استفاده می کنند. برای از بین بردن زمان یا انجام کاری در اینترنت ، معمولاً در یک دستگاه تلفن هوشمند صفحه لمسی. اکثر مردم حتی نمی دانند از کجا می خواهند از ابتدا یک وب سایت بسازند ، آنها تمایل دارند که در وب سایت شخص دیگری شروع کنند و چیزی محدود در قابلیت ، قابلیت اطمینان ، سهولت استفاده و به ویژه خلاقیت ایجاد کنند ، وقتی می توانستند آخرین ابزارهای قدرتمند را در اختیار داشته باشند تا بتوانند چیزی مفید را بسازند بدون هدر رفتن دکمه های فشار ، و به خصوص تلف کردن پول با استفاده از هزینه های گران قیمت که به هر حال با استفاده از این نرم افزار استفاده می کند ، به هر اندازه که از آنها استفاده می کند. اگر چند دقیقه فرصت دارید که این کتاب را بخوانید و آنچه را که می خواهم به شما بیاموزم یاد بگیرید ، یا حتی در مورد اهداف خود با من صحبت کنید و در جهت درست راهنمایی کنید ، و انگیزه دارید که یاد بگیرید که کدگذاری و نوشتن نرم افزار خود را بنویسید ، این کتاب را به خانه ببرید و یک وقت را تنظیم کنید تا یاد بگیرید که برنامه های بعدی تأثیرگذار ، روان و مهم را در وب ایجاد کنید ، یک وب سایت شما که همه شما را می خواهید و دقیقاً آنچه را که شما می خواهید و می خواهید.

درباره من: من یک توسعه دهنده نرم افزار با طیف گسترده ای از تجربه در C/C ++ ، Java ، Python ، HTML ، CSS و JavaScript هستم. من وب سایت هایی را می سازم که مردم می خواهند از آنها استفاده کنند ، می خواهند بازدید کنند و حتی به استفاده از فقط برای یادگیری ، بازآفرینی و کشتن زمان معتاد می شوند و از همه مهمتر ، من نرم افزار می فروشم. اگر ایده ای داشتید که دقیقاً چگونه می خواهید یک وب سایت به نظر برسد و عملکردی داشته باشد ، حاضرید از من حمایت کنید تا بتوانم نیازهای خودم را در حالی که من با شما ملاقات می کنم برآورده کنم ، و شما مایل به پرداخت هزینه های اجرای یک وب سایت خودتان هستید ، من شما می توانم YouTube بعدی ، Tiktok ، Twitter ، Google یا حتی یک برنامه امنیتی با تکنولوژی پیشرفته را برای شما بسازم. من به جای اینکه سعی کنم وقت خود را به شما بفروشم ، سعی می کنم مال خود را بخرم: من می خواهم با اطلاعاتی که از قبل وجود دارد ، خود را در ساخت یک برنامه (وب سایت) صحبت کنم و به شما یاد بدهم که برای یک توسعه دهنده نرم افزار مستقل ، کارآفرین ، کارآفرین را به شما آموزش می دهد. و بگذارید واضح باشم ، آموزش و پرورش که به شما می دهم غیررسمی خواهد بود. شما می توانید به مدرسه بروید و همه اینها را با یک آموزش رسمی یاد بگیرید ، یا حتی این کتاب را در مدرسه بخوانید ، تکالیف خود را تکمیل کنید و از تحصیلات خود چیزهای زیادی را از بین ببرید ، اما من به طور رسمی شما را در صندلی گرم قرار نمی دهم و از شما می خواهم که تکالیف را تکمیل کنید. من استاد شما نیستم ، شما می توانید مانند دوستی که می خواهد شما را به سمت شغلی که با موفقیت شخصی خود هدایت می شود ، به من فکر کنید. و من هم موفقیت شما را نمی فروشم ، شما باید آن را با وقت خود بخرید. یادگیری کد منحنی یادگیری شیب دار دارد و هرگز آسان نبود ، یا حتی تصور می شد. شما باید تا آنجا که ممکن است سخت کار کنید و همچنان سعی کنید و شکست بخورید و دوباره امتحان کنید حتی وقتی ناامید شده اید تا خود را یاد بگیرید و خود را بسازید. این در طبیعت کد است. کد توسط یک کامپایلر اجرا می شود که برای ارائه پیام های خطای برنامه نویس طراحی شده است ، و اینها به شما می آموزد که چگونه کدگذاری کنید ، حتی اگر به سادگی در حال کپی کردن خطا در موتور جستجوی خود و خواندن نمونه های افراد دیگر باشید. و باید بگویم ، شما لازم نیست که برای ساختن یک برنامه بسیار غنی ، باهوش ، موفق یا حتی جزئیات گرا یا سازماندهی شده باشید. رایانه از آن سازمان برای شما مراقبت می کند. شما فقط باید از طریق آزمایش و خطا ادامه دهید ، تمرکز خود را حفظ کنید و در کاری که انجام می دهید سخت کار کنید و در کل آنچه انجام می دهید حرفه ای بسیار موفقی خواهید داشت.

من کی هستم: من می دانم که بخش آخر بیشتر در مورد یادگیری بود و شما از این کتاب راه های خود را می گیرید. من دقیقاً کی هستم؟ این یک سوال پیچیده است. من خودم از این موضوع نامشخص نیستم ، زیرا من از شرایط پزشکی رنج می برم که می تواند حتی در بعضی مواقع کد یا نوشتن این کتاب را برای من دشوار کند ، ضمن ارائه چالش هایی در مورد جامعه پذیری و هویت که زندگی من را هنگام معرفی خودم دشوارتر می کند. به طور خلاصه ، اگر این کتاب را می خوانید ، آن را به خانه آورده اید زیرا از طریق آن می چرخیدید و فکر می کنید مفید است ، یا حتی اگر این موضوع را بسیار دور خوانده اید ، برای شما من یک فرد مانند ذهن هستم که می خواهد شما را در هر کاری که می کنید موفق کنید. من خودم یک مهندس ، یک توسعه دهنده نرم افزار و یک دانش آموز هستم و این کتاب را برای سایر دانش آموزانی که می خواهند زندگی خود را با داشتن یک کتابچه نرم افزاری که نیاز به زندگی آنها را آسانتر می کند ، آسانتر می کند ، با ارائه نمونه هایی از آنها برای کپی کردن مانند یک معمای بزرگ در یک برنامه کارگری ، مفید ، کاربردی ، منسجم و درگیر کردن که می تواند موفقیت را مهم نکند ، مهم نیست. تا حد زیادی ، این همان کاری است که من انجام می دهم: من برنامه هایی را برای کمک به خودم و افراد دیگر می سازم. من هم نویسنده هستم ، اگرچه این اولین انتشار من است که قصد دارم به منظور قرار دادن نمونه کارها خود در یک سند مفید ، تکمیل کنم و من یک هنرمند نیز هستم. من این را به شما اعتراف می کنم ، من یک شخص عجیب و غریب هستم. من کامل نیستم ، من با این قانون حتی باعث شده ام که دانشکده ها و دانشگاه ها را ترک کنم و ایالت ها را ترک کنم تا سعی کنم با موفقیت بیشتر نام خود را بسازم. من از بدو تولد یک زن هستم ، آرایش می پوشم ، از خودم عکس می گیرم ، لباس می پوشم و لباس های زنان دیگر می پوشم و از نظر طبیعت از خودم به عنوان یک زن آگاه می شوم. من در گذشته با افراد دیگر مشکلاتی داشتم که منجر به مبارزات با نوشتن و ساخت WebApps می شود و عذرخواهی می کنم که من نتوانسته ام این کتاب را زودتر در دستان خود بگیرم: شما به این نیاز دارید. شما می خواهید کدی را بخوانید و بنویسید که مانند من باشد و مانند من کار کند و همین کار را انجام می دهد اما حتی بهتر ، زیرا اگر می توانید به جای اینکه صفحه کلید خود را مانند من انجام دهم فقط برای ایجاد یک کتاب خودتان که خودتان از آن درخواست پول می کنید ، بخواهید ، این کتاب را خریداری کنید ، منابع لازم را برای موفقیت در زندگی خود دارید. من انواع و اقسام مسائل مربوط به رشد خانواده ، شرایط بهداشتی ، پزشکان ، رسانه ها و قانون را داشتم و کد من عمیقاً منعکس کننده مبارزه ای است که فمینیسم و ​​طبیعت زن در دنیای تقسیم شده و ناامید کننده است. با این حال ، این کتاب چیزی است که من عمیقاً به آن اهمیت می دهم ، کودک من ، نمونه کارها و معیشت من ، بنابراین من وقتی متن را به خانه می گیرید و با دقت از آن استفاده می کنید ، از توجه شما قدردانی می کنم تا از من یاد بگیرید. لطفاً به خاطر داشته باشید که من کامل نیستم ، این کتاب خطایی ، تجدید نظر و نسخه های جدید خواهد داشت و برای داشتن یک تجربه موفق در نوشتن من ، باید با مغز منطقی خود به بهترین شکل ممکن فکر کنید. همچنین ، درک کنید که منظورم برای شما خوب است حتی وقتی هنگام نوشتن با چالش هایی روبرو هستید. در مورد این فکر کنید مانند این: وقتی فقط می توانید یک سیستم رایانه ای را اجاره کنید تا هر کاری را که احتمالاً می توانید در فضای دیجیتال تصور کنید ، تمام اطلاعاتی را که با آنها روبرو می شوید ، تجزیه و تحلیل و سازماندهی کنید و به درک آن بپردازید ، به ناچار با اطلاعاتی که می خواهید و حتی منتشر می کنید با مشکلات روبرو خواهید شد. من این را به شما می گویم زیرا با همان مشکلات روبرو می شوم. از این کتاب در معرض خطر خود استفاده کنید ، با جامعه و جوامع خود در دسترس شما باشید تا بتوانید نرم افزاری را در یک محیط ایمن بسازید ، و وقتی شخصاً شکست می خورید و یا حتی به شکلی اشتباه موفق می شوید ، چیزهایی را به شخصه تبدیل نکنید: به این ترتیب من این متن را به دست آورده ام ، و چرا می توانم این متن را به شما بیاورم و به شما کمک کنم بدون اینکه در مسیری از جنون قرار بگیرید که من را خراب کرده ، پاره شده و در مقیاس جهانی که همه من را از دست می دهم ، در حالی که من در مقیاس نظم و رونق می گیرم ، در حالی که من از آن استفاده می کنم. کار خواهد کرد ، اینترنت. ممکن است شما فقط با چند کلمه با کسی که هستم خیلی آشنا نباشید ، اما من شما را تشویق می کنم که در ادامه بخوانید ، وقتی در هنگام ساخت پروژه های خود برای تکمیل کار خود ، من را می خوانید و می فهمید ، مرا می شناسید. تا زمانی که اساتید یا معلمان شما به شما اختصاص ندهند ، هیچ مشق شب با این کتاب وجود نخواهد داشت ، اما من شما را بسیار تشویق می کنم که خودتان را به عنوان خوانده شده ، و همچنین یک پروژه سنگفرش به نمایش بگذارید که چگونه می توانید آنچه را که آموخته اید استفاده کنید. پروژه Capstone من مبنای بیشتر آنچه را که شما در این کتاب خواهید خواند ، است ، زیرا کد پروژه های قبلی من را شامل می شود ، کدی که من ایجاد کرده ام و یاد گرفته ام که به صورت متدکی بنویسم ، و طیف گسترده ای از ایده ها و نکات را که به من کمک کرده است تا جایی که می توانم یک برنامه ساده را بچرخانم و به نظر می رسد مانند یک برنامه محبوب ، شما ممکن است دوست یا خانواده خود را با استفاده از آن استفاده کنید ، در اینترنت ، تبلیغات و تبلیغات خود را انجام دهید.

این کتاب چیست: این کتاب به عنوان مثال یک آموزش است. شما می توانید کد را در اینجا بیابید ، دستورالعمل هایی برای یادگیری کد ، اطلاعات مربوط به کد اشکال زدایی و خطاهای رفع ، مراحل عیب یابی ، دستورالعمل های مربوط به تهیه نسخه پشتیبان و ذخیره کد خود ، مجدداً با استفاده از کد شما ، اگر کسی کد شما را می شکند ، کد خود را تأمین کند ، به همین ترتیب وب سایت های تعاملی را که سرگرم کننده و اعتیاد آور هستند ، بسازید ، شما را به دست می آورید ، می توانید از نظر شما چه کسی مهم است ، شما در بهترین نور مطلق ایجاد می کنید تا تا حد ممکن جذاب ترین برای کاربران نهایی خود ، بازدید کنندگان وب سایت شما باشد. در این کتاب ، من چندین نمونه از طراحی نرم افزار را با تمرکز روی وب به عنوان یک پلتفرم و همچنین امنیت نشان خواهم داد. ما با ساختن یک پروژه اساسی با استفاده از پوسته یونیکس ، با ویژگی های پشتیبان و برنامه نویسی ، تجربه یادگیری را آغاز خواهیم کرد. سپس ، ما یک وب سایت اصلی وبلاگ را بررسی خواهیم کرد ، وبلاگ خود را با ویژگی های عکس و تصویری ارتقا خواهیم داد و همچنین از این ویژگی ها برای استفاده از راه حل های امنیتی با استفاده از نرم افزار رایگان استفاده می کنیم و سرور خود را با استفاده از ماژول تأیید اعتبار قابل استفاده (PAM) ایمن می کنیم. سپس از جمله مفاهیم دیگر ، ما کار و پردازش پرونده را بررسی خواهیم کرد ، کاوش در ویرایش ویدیو ، اهدای صدا ، اسکن بارکد و تشخیص شخصیت نوری را بررسی خواهیم کرد. در طول راه ما API ها را بررسی خواهیم کرد که به ما کمک می کند تا نرم افزار خود را با گزینه های رایگان و پرداخت شده مفیدتر و ایمن تر کنیم. در طول راه ، ما به بررسی امنیت فیزیکی و ابزارهای شبه نظامی مانند سلاح گرم و طراحی و ساخت مهمات از جمله طراحی بشکه و تکرار ، طراحی برجک و هواپیماهای بدون سرنشین و سایر اصولگرایان خواهیم پرداخت تا بتوانیم از نرم افزار خود در شبکه موجود استفاده کنیم و از نرم افزار خود محافظت کنیم و دفاع و دفاع از خود را نشان دهیم. ما در طول راه برای ساخت بازی ها ، موتورهای رندر 2D و سه بعدی استراحت خواهیم کرد و در مطالعه موردی به ترتیب با استفاده از سخت افزار تعبیه شده در نمونه هایی از نرم افزار اصلی ارائه دهنده بعدی و یک ماساژور ارتعاش الکترونیکی به ترتیب در لاستیک سیلیکون کار خواهیم کرد. در طول راه ، ما همچنین از راه حل های یادگیری ماشین استفاده خواهیم کرد تا بتوانیم نرم افزار خود را بهتر ایمن کنیم. ما همچنین از ابزارهای سهام موجود برای وب استفاده خواهیم کرد تا بتوانیم روند کار را ساده تر و تأمین کنیم. این کتاب راهنمایی برای موفقیت شما در ساخت یک برنامه وب و ادغام آن با یک شبکه حرفه ای از رایانه و سیستم های مکانیکی تعبیه شده و به طور کلی راهنمای ساخت نرم افزار و سخت افزار تعبیه شده بدون دانش پس زمینه یا تجربه قبلی است.

آنچه این کتاب نیست: اگر واقعاً می خواهید یک وب سایت داشته باشید ، می توانید یک فروشگاه ساده را راه اندازی کرده و آنچه را که لازم دارید بفروشید ، یک وبلاگ ارسال کنید ، عکس یا فیلم ارسال کنید یا در غیر این صورت بدون نوشتن یک خط کد واحد. این کتاب همین نیست. این کتاب به شما می آموزد که چگونه می توانید نرم افزاری را که می توانید در حال حاضر پیدا کنید ، نرم افزاری مفیدتر ، کاملاً برجسته تر ، کاربردی و ایمن داشته باشید ، زیرا آخرین نرم افزاری را که هنوز نمونه های اولیه است ، مستقر می کند ، ممکن است گران باشد که در مقیاس شرکت های قدیمی تر در آن کار کنند ، و به عقب جذاب نیستند ، شرکت های مجزا که برای افرادی که واقعاً کاری انجام نمی دهند ، می توانند درآمد کسب کنند. اگر این کتاب را از نزدیک دنبال کنید ، می خواهید کد ، کد تحقیق بنویسید ، برنامه های خود را بسازید و از آنچه انجام می دهید درآمد کسب می کنید. من حتی در مراحل اولیه از این کتاب درآمد کسب می کنم ، زیرا حاوی اطلاعاتی است که افراد به آن نیاز دارند و می خواهند بخوانند ، و هنگام خرید یا استفاده از برنامه های من در حال خرید هستند. این کتاب برای شما برنامه ای ایجاد نمی کند ، اما شما را در جهت درست قرار می دهد و شما را با ابزارهای مورد نیاز و مهارت ها و نکاتی که موفقیت شما در ساخت نرم افزار برای وب را تسهیل می کند ، به شما کمک می کند ، با هر خطی که باید به عنوان نمونه بنویسید ، آماده برای جمع آوری در نرم افزار شما و حامیان خود ، مشتری ها ، دوستان ، خانواده ، بازدید کنندگان ، پیمانکاران ، پیمانکاران و استفاده از اینترنت است.

آنچه یاد خواهید گرفت: این کتاب به شما می آموزد که چگونه می توانید نرم افزار را بسازید و بفروشید ، واقعاً کاربردی ، نرم افزاری مفید ، ضبط رسانه ها ، ویژگی های امنیتی مانند تشخیص چهره ، اسکن بارکد منطقه قابل خواندن دستگاه ، API های وب برای تأیید ، ضبط و ارائه فیلم و عکس ، و پیام های تبادل مانند بلوتوث و نزدیک زمینه (NFC) ارتباط برقرار می کنید. این کتاب به شما یاد می دهد که چگونه از یک رایانه شبکه ای استفاده کنید ، با تمرکز بر روی Debian Linux ، نحوه ساخت کد Bash برای نصب و تهیه نسخه پشتیبان از نرم افزار خود یک نسیم یکپارچه و خودکار ، نحوه ساخت کد پایتون به عنوان یک پس زمینه برای ارائه پیام های پویا ، سبک های سبک با استفاده از سبک های CSS ، امکان ورود به سیستم های دیگر از طریق شبکه های امنیتی و تعامل با شبکه های تعاملی و شبکه های تعاملی را ایجاد کنید. اهداف ، اسکن شناسه ، تعدیل تصویر و فیلم ، ریزگردها داده ها برای ایمن نگه داشتن نرم افزار ، پردازش پرداخت ، تجارت رمزنگاری ، کارهای ناهمزمان و موارد دیگر. شما یاد می گیرید که چگونه دستگاه های بلوتوث خود را با باتری ، شارژر ، میکروکنترلرها ، مدارها ، موتورها و سنسورها بسازید و با استفاده از لحیم ، سیم و چاپ سه بعدی و همچنین مواد ریخته گری. من اصول طراحی سه بعدی را که برای تولید و ابزار افزودنی اعمال می شود و می میرند ، نشان می دهم ، بنابراین شما قادر به ساخت دستگاه های سخت افزاری تعبیه شده و سخت افزاری خود با باتری های یکپارچه ، شارژرها ، مدارهای الکترونیکی و خروجی های کاربردی هستید. و آنها را با بلوتوث و وب شبکه کنید. به طور خاص ، ما دو مطالعه موردی ، یک ماساژور ارتعاش و یک سلاح گرم خانگی را که هر دو در OpenScad برنامه ریزی شده اند ، بررسی خواهیم کرد ، که به عنوان یک رابط گرافیکی یا ابزار خط فرمان در دسترس است و برای نتایج سریعتر می تواند در یک وب ادغام شود. شما یاد می گیرید که چگونه یک وب سایت را از زمین و بدون تجربه قبلی بسازید و به کار بگیرید ، آن را کاربردی ، ایمن ، زیبا ، مفید و از همه مهمتر عملی کنید. شما یاد می گیرید که چگونه از یادگیری ماشین و چشم انداز رایانه استفاده کنید تا یک سایت ایمن و کاربردی تر شود ، فیلم و صوتی را از وب سایت خود ضبط کنید ، صدای خود را اهدا کنید ، موسیقی کنید و صدا را تعدیل کنید تا نمونه های مفیدی را ایجاد کنید ، و چگونه می توانید با استفاده از وب سایت های دیگر با استفاده از بهترین شبکه های ممکن برای ایجاد ارتباط مستقیم به شما پیوند دهید تا بتوانید به طور مستقیم به شما پیوند دهید تا تمام اطلاعات مفیدی را که ارائه می دهید ارائه دهید ، و حتی بیشتر از نرم افزار خود را به دست می آورید ، و حتی بیشتر از نرم افزار خود را به دست می آورید. این کتاب به شدت روی رسانه ها ، امنیت و یادگیری ماشین متمرکز خواهد شد ، که سه مؤلفه اصلی هستند که به شما در ایجاد نرم افزار مفید برای وب با درگیر کردن کاربران مناسب و جدا کردن افراد اشتباه به روشی که واقع بینانه ، کاربردی ، دست و درگیر در عین حال اتوماتیک و محکم باشد ، کمک می کند. این کتاب به یونیکس ، به طور خاص Debian (Ubuntu) ، Bash Shell ، Python ، HTML ، CSS ، JavaScript و تعدادی از بسته های نرم افزاری مفید برای Python مانند درخواست ها و همچنین نرم افزارهای مفید Bash مانند GIT و FFMPEG آموزش می دهد. من همچنین به شما می آموزم که چگونه Cryptocurrency را به صورت خودکار تجارت کنید ، و در صورت انتخاب این کار ، حتی در صورت انتخاب این کار ، به بازدید کنندگان خود نیز به بازدید کنندگان خود پرداخت کنید. من به شما می آموزم که چگونه از طریق تبلیغات از وب سایت خود درآمد کسب کنید ، چگونه می توانید برنامه خود را برای موتورهای جستجو آماده کنید و آن را سریع کنید ، در رتبه اول برای آنچه مشتریان خود برای یافتن شما جستجو می کنند ، رتبه بندی کنید و در هر چه بیشتر جستجوهای مشترک رتبه بندی کنید. من به شما یاد می دهم که چگونه نرم افزار خود را بفروشید ، آن را تبلیغ کنید ، به مشتریانی که به دنبال خدمات شما هستند ، درخواست کنید و از طریق راه هایی که از قبل وجود دارند ، برای خود در اینترنت نامگذاری کنید ، ارزان هستند و خوب کار می کنند. من به شما یاد می دهم که چگونه می توانید داده های خود را در رایانه های ابری که برای شما کار می کنند ذخیره کنید و داده های خود را ارزان ذخیره کنید ، نحوه برنامه ریزی و ساخت وب سایتی را انجام دهید که کاربران شما را می خواهد و آنچه را که می خواهید انجام می دهد ، و چگونه می توانید کاربران خود را با قرار دادن سایت خود با استفاده از تلفن های خود با اعلان ها ، ایمیل ، پیام های متنی و موهای بیشتر به شما بازگردانید تا فقط کاربران خود را به وب سایت خود بازگردانید و دکمه را در اختیار شما قرار می دهد و دکمه را در اختیار شما قرار می دهد تا در حال پاک کردن است. این کتاب به عملی انتشار و توزیع رسانه ها به مقدار زیادی ، از متن گرفته تا عکس گرفته تا فیلم ها تا صوتی ، ایجاد تأثیر خوب بر کاربران نهایی (مشتری های شما) و فروش خود به هر روشی که برای ایجاد یک وب سایت ، برنامه ای که نماینده شما باشد و شما فقط می پردازید ، می پردازد ، و شما را به نظر می رسد ، نرم افزار و شرکت شما در بهترین راه ممکن است. شما همچنین می توانید چند نکته و ترفند از من یاد بگیرید ، از نکات مربوط به برنامه نویسی ، غرور عملی مانند آرایش و عکاسی ، مدل سازی و بازیگری و موارد دیگر ، که برای به تصویر کشیدن خود و شرکت خود با استفاده از بهترین نور ممکن با استفاده از همه ابزارهای موجود در دسترس شما مهم خواهد بود در حالی که توزیع به همان اندازه محتوای شما در یک تعادل سالم سیستم عامل برای ایجاد نرم افزار خود با عدم تلاش بیشتر ، هزینه بیشتر از آن ، کار و یا هزینه ای را انجام می دهد. این کتاب "عملی" نامیده می شودیادگیری عمیق و امنیت مبتنی بر وب به عنوان مثال "به یک دلیل: این به یادگیری کد ، به طور خاص برای وب ، به طور خاص با تمرکز بر امنیت ، از دیدگاه عملی ، با نمونه هایی از کد کار که در خدمت اهداف عملی ذکر شده در متن است ، می پردازد. مؤلفه یادگیری این متن ، شامل یادگیری دستگاه است ، کد من به شما نشان می دهد که چگونه می توان از آن استفاده کرد. پیشرفت ، زیرنویس تصویر و سایر کارها مانند معیارهای پیش بینی شده از تصاویر ، مانند ماهیت تصویر به عنوان یک تصویر معتبر ، رایانه ای یا یک کپی نوری (یک عکس از یک تصویر یا عکس چاپی) بسیار مهم است. صورت. شما می توانید یک کامپیوتر سرور را ایجاد کنید ، رایانه ای که به طور معمول از شما یک نام کاربری و رمز عبور می خواهد و شما را وارد می کند ، شاید با یک نشانه تأیید برای هر ورود به سیستم جدید یا آدرس IP جدید ، اما اگر شما در حال ساخت در مقیاس بزرگ ، آسان برای هر کسی باشید ، این ممکن است نرم افزار شما را خیلی نزدیک به شما باشد. هرکسی که نرم افزاری را ایجاد کند که بی عیب و نقص باشد ، از آنچه این دلالت دارد ، دارد. نرم افزار ذاتاً ناامن است زیرا دستگاه ها و حساب هایی که ما برای دسترسی به آن استفاده می کنیم همیشه در اختیار ما نیستند ، می توانند در دست هر کسی باشند که قصد بدی برای نرم افزار داشته باشد و بنابراین ممکن است خطر خود نرم افزار را ایجاد کند. این مورد مورد توجه این کتاب است. یک کامپیوتر شبکه ای به طور پیش فرض با یک نشانه کلید بلند ، به نام و SSH یا Secure Shell Key ایمن است و در غیر این صورت با یک سرور وب بهترین امنیت است ، زیرا سرور وب دسترسی آزاد و همچنین وضعیت ابزارهای امنیتی هنری را که روی خود سرور اجرا می شود ، فراهم می کند. سرور وب به مرورگر وب کاربر دسترسی دارد ، که مسلماً قدرتمندترین قسمت دستگاه کاربر است ، زیرا مکانی است که کاربر می تواند به نرم افزار شبکه ای دسترسی پیدا کند. این ابزار ابزار می تواند متن ، صفحات وب را که می بینید ، ارائه دهد ، و همچنین می تواند تصاویر ، صوتی و تصویری (مانند یک عکس از چهره یا شناسه حالت) را ضبط کند ، می تواند به دستگاه های رادیویی بلوتوث بخواند و بنویسد ، و می تواند به برچسب های Transponder در نزدیکی ، کارتهای کلیدی ارزان قیمت ، فوب ها ، حلقه ها ، حلقه ها و حتی تراشه ها را با استفاده از سرور با استفاده از داده های منحصر به فرد با شماره های سریال که می تواند با شماره های سریالی خوانده شود ، بخوانید و بنویسید. با استفاده از تمام ابزارهای موجود در اختیار شما ، با این کتاب شما خود را به دانش برای ساختن یک وب سایت ایمن مجهز خواهید کرد ، و به طور کلی یک سیستم رایانه ای ایمن شبکه ای که برای شما کار می کند ، پیشنهاد خود را انجام می دهد و به نظر می رسد و به نظر می رسد و احساس می کند

از کجا شروع کنیم: شما خوشحال می شوید که از بخش من این کتاب یا هر بخش را به کد دقیق مورد نیاز خود بپردازید ، به خصوص اگر قبلاً تجربه برنامه نویسی را داشته باشید یا هر یک از ابزارهای فوق الذکر که من در این کتاب به تفصیل شرح خواهم داد و همچنین مستندات موارد استفاده و نمونه های عملی آن را انجام می دهم. اگر در نوشتن کد تجربه ندارید ، من اکیداً توصیه می کنم همه این کتاب را بخوانید ، و به خصوص توصیه می کنید بخش های قبلی را بخوانید تا مطمئن شوید که این کتاب برای شما مناسب است. اگر این کتاب برای شما مناسب نیست ، در نظر بگیرید که آن را به یک دوست یا خویشاوندی که ممکن است علاقه مند به یادگیری خود در مورد توسعه وب باشد ، در نظر بگیرید و حتی وام گرفتن آن را در نظر بگیرید و از آنها یاد بگیرید تا شکاف هایی را که من شما را به عنوان معلم شکست خورده ام ، یا سایر معلمان قبل از من انجام دهند ، در نظر بگیرید. از آنجا که می خواهید شروع کنید ، اگر قصد ایجاد یک برنامه مفید را دارید ، هر قسمت از این کتاب مفید خواهد بود و در نظر بگیرید که بهترین برنامه ها با استفاده از کاربر نهایی در ذهن ساخته شده اند: مشتری خود را بشناسید. اکنون شما من را می شناسید ، این کتاب را می شناسید و آماده شروع آن هستید. برای شروع ، یک کامپیوتر (حتی ارزانترین لپ تاپ از یک فروشگاه جعبه ، آمازون یا یک دسک تاپ قدیمی کار می کند و آن را به روشی تنظیم می کند که برای شما مفید باشد.

نحوه خواندن این کتاب: متن برجسته ، بیانگر این است که متن متعلق به یک فرمان است ، جایی که کدی را که اجرا می کنید می نویسید. فرمان سریع به شدت صفحه کلید متمرکز است و نیاز به کلیک کمی دارد ، سرعت کار شما را سرعت می بخشد و کارها را برای شما آسان تر می کند.

شروع کار: بیایید شیرجه بزنیم. ما با ساخت کد روی یک دستگاه محلی شروع می کنیم و بدون ساختن وب سایت متصل به اینترنت شروع می کنیم. این برای شروع ایمن تر است ، هیچ هزینه ای ندارد و برای شما آسان است. بسته به سیستم عامل شما ، ورود به پوسته Bash کمی متفاوت خواهد بود. برای سیستم عامل Mac ، من توصیه می کنم در این مرحله یک ماشین مجازی نصب کنید ، زیرا بیشترین سازگاری را با یک ماشین مجازی دریافت خواهید کرد. ارائه دهندگان مختلفی مانند Virtualbox و Paralells می توانند یک ماشین مجازی را برای شما اجرا کنند ، اگرچه می توانید اوبونتو را مستقیماً روی دستگاه نصب کنید ، اگر ترجیح می دهید از یک محیط بومی استفاده کنید که به منظور ایجاد یک تجربه سریع و ساده توصیه می شود. اگر از Linux یا Windows استفاده می کنید ، که من توصیه می کنم ، ایجاد یک پروژه بسیار آسان است. ترمینال خود را باز کنید ، اندازه را همانطور که می بینید مناسب تنظیم کنید ، و مرحله 2 را شروع کنید. اگر از ویندوز استفاده می کنید ، لطفاً مرحله 1 را دنبال کنید.

مرحله 1: - فقط کاربران ویندوز در ویندوز ، فرمان را به عنوان مدیر باز کنید و تایپ کنید WSL - در نصب

مرحله 2: - اگر از ویندوز استفاده نمی کنید ، اینجا را ادامه دهید ، یا از مرحله 1 به اینجا بروید در یک ترمینال باز (بسته به سیستم عامل شما ، به نام اوبونتو در ویندوز ، ترمینال در مک یا لینوکس یا نام مشابه) با ایجاد یک پروژه شروع می شود. ما این کار را با دستور MKDIR انجام می دهیم ، که یک دایرکتوری ایجاد می کند. اگر برای ذخیره پروژه خود نیاز به ایجاد دایرکتوری دارید ، که توصیه می شود از دستور CD برای تغییر به فهرست و و

CD/PATH/TO/DIRECTORY - مسیر پوشه ها (پرونده ها) است که پیش از فهرست مقصد شما هستند ، مسیر پیش فرض شما ~ یا//نام کاربری (جایی که نام کاربری نام کاربری شماست) است. برای تغییر به فهرست پیش فرض ، CD یا CD را تایپ کنید مثال mkdir - "مثال" را با نام دایرکتوری جایگزین کنید

اکنون شما یک دایرکتوری کار برای پروژه خود دارید. در صورت نیاز به جابجایی به دستگاه دیگری یا استقرار کدی که می نویسید ، بنابراین برای وب آماده است ، ما بسیار مهم است که این فهرست را ذخیره کنید ، بنابراین برای وب آماده است ، ما یک اسکریپت را برای تهیه نسخه پشتیبان از فهرست شما در چند مرحله بعدی می سازیم. اما ساخت یک اسکریپت کمی کد را می گیرد و کد باید به صورت خودکار انجام شود تا در حد ممکن مفید باشد. بنابراین بیایید ابتدا یک اسکریپت بسازیم تا ابتدا اسکریپت بسازیم. بیایید با ایجاد اسکریپت و اجرای آن شروع کنیم. ما برای این کار از sudo ، chmod و لمس استفاده خواهیم کرد و اسکریپت را "ascript" می نامیم.

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

اکنون ما فیلمنامه را ایجاد کرده ایم ، آن را اجرا کرده ایم و آماده ویرایش آن هستیم. Nano یک ویرایشگر متن است که به شما امکان ویرایش متن را بدون کلیک می کند ، که بسیار ساده تر از استفاده از یک رابط کاربری گرافیکی است. برای ویرایش پرونده با Nano ، از Nano و سپس مسیر پرونده استفاده کنید. برای ساخت اسکریپتی که یک فیلمنامه را ایجاد می کند ، تقریباً شبیه به ساخت فیلمنامه ما در وهله اول است. ما از همان کد فوق استفاده خواهیم کرد و نام اسکریپت "Asscript" را با یک پارامتر آرگومان ، 1 دلار جایگزین می کنیم. این به ما امکان می دهد تا با تایپ کردن Newscript Suply Sudo Ascript ، اسکریپت را صدا کنیم ، در این مرحله می توانیم با جایگزینی "Newscript" با نام اسکریپت خود ، هر اسکریپت جدیدی را ایجاد کنیم. کد موجود در نانو باید به نظر برسد:

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

و برای بستن نانو ، می توانیم کلید کنترل را نگه داریم و X را فشار دهیم ، سپس y را مشخص کنیم تا ما پرونده را ذخیره کنیم و به بازگشت برگردیم. اکنون به جای تایپ کردن این سه دستور برای ویرایش یک اسکریپت ، ما قادر خواهیم بود برای ویرایش دوباره اسکریپت ، Asscript Sudo Ascript را تایپ کنیم. این کار می کند! و هر اسکریپت جدیدی را می توان با تماس با آن در پوسته به راحتی اجرا کرد. بیایید اکنون کار خود را ذخیره کنیم: بیایید یک اسکریپت پشتیبان بنویسیم تا اسکریپت جدید خود را ذخیره کنیم و سپس آن را در فهرست پروژه ما پشتیبان تهیه کنیم ، در حالی که از اسکریپت پشتیبان نیز نسخه پشتیبان تهیه می کنیم.

sudo ascript backup

اکنون ، در نانو:

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

از کجا/مسیر/به/دایرکتوری مسیر پروژه ای است که شما با MKDIR ایجاد کرده اید. بعداً یاد خواهیم گرفت که چگونه می توانیم مسیرهای تکرار مانند این را با یک حلقه و یک لیست کپی کنیم ، که کد کمتری دارد ، اما در حال حاضر بیایید آن را ساده نگه داریم و چند خط داشته باشیم. برای اجرای این اسکریپت و پشتیبان گیری از کد خود ، پرونده را در Nano با Control+X ، Y ذخیره کنید و برگردید و موارد زیر را در پوسته خود تایپ کنید

backup

اگر در هنگام خواندن این کتاب و دنبال کردن در پوسته ، اصلاً از شما خواسته می شود ، لطفاً رمز عبور کاربر خود را به درستی وارد کنید ، قبل از نیاز به اجرای مجدد دستور ، سه بار خواهید داشت. در صورت نیاز به اجرای هر کاری دو بار ، می توانید از فلش های بالا و پایین برای استفاده مجدد از دستورات و ویرایش آنها استفاده کنید. قبل از ویرایش دستور با فلش های راست ، چپ و حذف کلید و همچنین صفحه کلید و اجرای آن با بازگشت ، به طور متناوب بالا و پایین را فشار دهید تا یک دستور را انتخاب کنید.

تبریک می گویم! شما موفق شده اید یک اسکریپت پشتیبان عالی ایجاد کنید که از دو اسکریپت مهم پوسته در فهرست کار خود حمایت می کند. ممکن است بعداً با بزرگتر شدن پروژه ، چیزها را جابجا کنیم ، اما این در حال حاضر کار می کند. بیایید به سمت پشتیبان گیری در ابر حرکت کنیم ، ما برای این کار از GitHub استفاده خواهیم کرد (اگرچه بسیاری از راه حل های GIT دیگر برای تهیه نسخه پشتیبان وجود دارد ، اما همه آنها یکسان هستند.) Git یک نرم افزار کنترل Verision است که به شما امکان می دهد تا از نرم افزار خود استفاده کنید زیرا آنها را به یک سرور تبدیل می کنید ، در حالی که شما را نیز قادر می سازد که نسخه های نرم افزار خود را در پشت رمز عبور یا کلید بارگیری کنید. این در صرفه جویی در نرم افزار شما مؤثر است ، به خصوص که ما به نمونه های امن لینوکس مهاجرت می کنیم که گاهی اوقات هنگام شکست یک خط کد ، شکسته می شوند ، در حالی که اگر فرصتی برای پشتیبان گیری از آن به طور خودکار ندارید ، ممکن است از کد شما پشتیبان گیری نشود.

اگر در این مرحله از یک ماشین مجازی اوبونتو استفاده نکرده اید ، من در این مرحله از یک ماشین مجازی اوبونتو استفاده می کنم زیرا زندگی شما را هنگام نصب تمام بسته های لازم به منظور ایجاد یک وب سایت کار و عملیات یادگیری عمیق در رایانه خود آسان تر می کند. ما در آینده نزدیک کد را به یک سرور وب منتقل خواهیم کرد ، اما می خواهیم اطمینان حاصل کنیم که حداقل چند لایه امنیتی در پشت سرور وب ما وجود دارد که در برابر فیشینگ مقاوم هستند و برای انجام این کار تعدادی از بسته های لینوکس را به کار می برند. اگر هنوز می خواهید از سیستم عامل Mac استفاده کنید ، از جستجوی و نصب بسته های لازم به صورت آنلاین استقبال می کنید ، اما ممکن است گزینه هایی برای هر بسته ای که این کتاب یا سری پوشش می دهد وجود نداشته باشد.

بیایید چند دستور را برای انجام کار خود با اسکریپت پشتیبان با اجرای دستور پشتیبان Sudo Ascript اضافه کنیم.

# …

یک بار دیگر ، X را برای ذخیره کنترل کنید.

اکنون باید برای این پروژه پیکربندی یک بار انجام دهیم. از آنجا که به زودی یک پروژه GIT خواهد بود ، ما نیازی به تایپ هر دستور هر بار که از یک مخزن GIT مستقر می شویم ، اما وقتی اسکریپت های استقرار خود را می نویسیم ، این موضوع را به دست می آوریم. برای شروع ، اطمینان حاصل کنیم که ما در دایرکتوری مناسب هستیم و مخزن GIT را آغاز می کنیم و کلیدهای SSH را تولید می کنیم.

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

پس از تایپ SSH-Keygen ، کلید جدید باید در پوشه خانه تحت پوشه ای به نام .ssh ذخیره شود. به آن id_rsa.pub گفته می شود. بیایید این کلید را پیدا کنیم و کپی کنیم. برای دیدن آن ،

cd ~
cat .ssh/id_rsa.pub

قبل از اضافه کردن کلید SSH به حساب خود ، متنی را که توسط آخرین دستور برگردانده شده و با ارائه دهنده GIT خود (در حالت ایده آل GitHub) ایجاد کنید ، کپی کنید. پس از داشتن یک حساب کاربری ، قبل از اضافه کردن کلید SSH خود در کلیدهای SSH و GPG در زیر منو ، روی منوی بالا سمت راست کلیک کرده و تنظیمات را وارد کنید. قبل از صرفه جویی و بازگشت به GitHub برای ایجاد یک مخزن جدید ، یک کلید SSH را اضافه کرده و با چسباندن آن و عنوان به آن اضافه کنید. این برای سایر ارائه دهندگان GIT مشابه است ، شما باید مستندات آنها را بخوانید. در پیکربندی مخزن جدید ، به مخزن خود یک نام توصیفی بدهید و تصمیم بگیرید که آیا می خواهید آن را منتشر کنید ، و مطمئن شوید که هنوز هیچ پرونده ای را برای ورود به سیستم پیکربندی نمی کنید. پس از ایجاد مخزن ، کلون را با URL SSH کپی کرده و آن را در دستور زیر قرار دهید.

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

اکنون می توانید با CD به مخزن خود برگردید ، با این موضوع آشنا خواهید شد. فیلمنامه پشتیبان خود را اکنون با نسخه پشتیبان تهیه کنید

عالی! اکنون ما واقعاً می توانیم کد نویسی کنیم. بیایید اکنون Django را نصب کنیم که درک خوبی از Bash و Git داشته باشیم. Django به ما اجازه می دهد تا به طور خودکار از نرم افزار خود نسخه پشتیبان تهیه کنیم ، Bash می تواند این کار را نیز انجام دهد اما Django باید یک اجرای ساده تر از آن داشته باشد (می تواند راحت تر از آن غیرفعال و پیکربندی شود).

برای نصب نرم افزار در اوبونتو ، از دستور sudo aptet get استفاده خواهیم کرد. ابتدا بیایید نرم افزاری را که قبلاً داشتیم به روز کنیم و به روز کنیم. این کار را می توان با بروزرسانی sudo apt-get و upgrade sudo apt-get -y انجام داد. بعد ، بیایید پایتون و محیط مجازی ما ، خانه کد ما را با دستور زیر نصب کنیم: sudo apt-get نصب python-is-python3 python3-env

این تنها چیزی است که شما باید از نظر نصب نرم افزار در نمونه اوبونتو با Django همراه شوید. برای ویندوز و لینوکس این باید نسبتاً ساده باشد ، اما برای MAC ممکن است بخواهید با استفاده از یک محیط مجازی رایگان یا پرداخت شده مانند Virtualbox یا دسک تاپ Paralells ، یک ماشین مجازی و لینوکس را روی آن نصب کنید و مراحل فوق را به منظور راه اندازی یک محیط اوبونتو بازآفرینی کنید. اوبونتو در این مورد بسیار مهم است زیرا این نرم افزاری است که وب سایت ها آن را اجرا می کنند و به آنها امکان می دهد تا وب سایت ها را با تمام نرم افزارهای فوق الذکر میزبانی کنند.

بیایید درون جنگو حفر کنیم.

دوباره در فهرست ما ، با CD:

python -m venv venv # محیط مجازی را در جایی که کد ذخیره می شود ایجاد می کند
source venv/bin/activate # محیط مجازی را فعال می کند
django-admin startproject mysite . # جایی که MySite پروژه ای است که من در فهرست فعلی خود شروع می کنم.

Django فقط ما را شروع می کند ، زیرا Django میزبان سرور وب است و همه کارهایی را انجام می دهد که ما برای دریافت یک وب سایت محلی اساسی در حال اجرا و در حال اجرا است. اکنون که Django را نصب کرده ایم ، بیایید تنظیمات را کمی ویرایش کنیم تا آن را به آنچه نیاز داریم کار کند. ابتدا بیایید یک برنامه جدید ایجاد کنیم

python manage.py startapp feed

متوجه خواهید شد که اولین برنامه FEED نام دارد. برنامه را باید هر آنچه را که دوست دارید خوانده شود ، و ما برنامه های جدیدی ایجاد خواهیم کرد ، اما نام هر برنامه باید هر بار که برنامه در کد ارجاع شود ، سازگار باشد. برای افزودن یک برنامه جدید ، ما همیشه تنظیمات را در فهرست دیگر برنامه ایجاد شده ، نامگذاری شده در StartProject ، برنامه از آخرت ویرایش خواهیم کرد. با استفاده از نانو ،

nano app/settings.py

در تنظیمات ، نصب شده را پیدا کرده و []] را به 3 خط جدا کنید. با استفاده از چهار فاصله در خط مرکز خالی ، "فید" یا نام برنامه خود را اضافه کنید. این بخش از تنظیمات .py باید شبیه این باشد:

INSTALLED_APPS = [
    'feed',
]

قبل از فراموش کردن ، بیایید آزمایش کنیم که جنگو در حال کار است. با استفاده از دستور python manage.py runserver 0.0.0.0:8000 ، می توانیم سرور را اجرا کنیم و سپس در یک مرورگر وب روی رایانه ای که کد را به http: // localhost: 8000 می رساند حرکت کنیم و یک صفحه وب نمونه را ببینید (کار می کند!) با کنترل C ، همانند هر دستور دیگری را ترک کنید.

حال ، بیایید در نوشتن برخی از کد های پایتون حفر کنیم. جنگو دارای سه مؤلفه اصلی است که همه آنها به طور کامل توسط کد اجرا می شوند. این مؤلفه ها مدل ، نمای و الگوی نامیده می شوند و هر یک به ترتیب در سطح بالاتر و پایین تر قبل از تحویل صفحه وب به کاربر است.

این مدل کدی است که اطلاعات را در پایگاه داده برای بازیابی ، مرتب سازی و ارائه ذخیره می کند.

این نمای تصمیم می گیرد که چگونه مدل ارائه ، دستکاری و اصلاح می شود ، تقریباً در هر نمای مستقیم از یک مدل استفاده می کند.

الگوی کد HTML با برخی از زنگ ها و سوت های اضافی به نام Template Language است. این الگوی توسط نمای در جایی که پر از کد پایتون و زمینه ای مانند مدل ها و اطلاعات (رشته ها و اطلاعات unsuall) از نمای باشد ، ارائه می شود.

جنگو اجزای دیگری نیز دارد ، از جمله اما محدود به این موارد نیست:

تنظیمات ، که برنامه را همانطور که بحث کردیم پیکربندی می کند.

URL ها ، که الگویی هستند که کاربر برای دستیابی به قسمت های خاص برنامه وب از آن استفاده می کند.

فرم ها ، که نحوه ارسال اطلاعاتی که به سرور ارسال می شود و به پایگاه داده و همچنین به کاربر ارائه می شود ، تعریف می کند. اینها پایه و اساس پردازش اطلاعات در سمت سرور است و می تواند هر نوع اطلاعاتی را که در رایانه ذخیره می کند ، بپذیرد ، مهمترین آنها رشته های متنی ، شماره ها و بول های واقعی/کاذب (معمولاً کادر انتخاب).

الگوهای ، که کد HTML و زبان الگو هستند و شکاف بین Python و HTML را به وجود می آورند ، به این معنی که اطلاعات پایتون را می توان به عنوان کد HTML ارائه داد که هر کسی می تواند به آن دسترسی پیدا کند و بتواند یک وب سایت را با دسترسی محدود تأمین کند ، در حالی که باعث می شود کد پایتون در دسترس به وب باشد و برای انواع مختلفی از دستگاه از راه دور که نیازی به نزدیکی سرور نیست ، مفید باشد.

پرونده های استاتیک ، که معمولاً JavaScript هستند و کتابخانه هایی هستند که سرور در آن سرو می کند و با این الگوی در ارتباط است.

فایلهای رسانه ای ، که سرور در آن سرو می کند یا میزبان خارجی است ، یا فقط قبل از پردازش و ارسال به سرور دیگر (یک سطل) برای میزبانی برای سرور نوشته شده است.

Middleware ، که قطعات کد است که همزمان با هر نمای اجرا می شود و در نمای "گنجانده شده" در نظر گرفته می شود.

پردازنده های زمینه ، که زمینه هر نمای را پردازش می کنند و برای اضافه کردن زمینه اضافی استفاده می شوند.

آزمایشات ، که تأیید می کنند که کاربر یا درخواست قبل از ارائه مشاهده ، الزامات خاصی را منتقل می کند.

مصرف کنندگان ، که نشان می دهند چگونه وب سایت ها به ارتباطات پاسخ می دهند و به آنها پاسخ می دهند.

مدیر ، که برای ثبت مدل ها استفاده می شود تا بتوانند با جزئیات در صفحه مدیر Django ، که در آن می توان پایگاه داده را از طریق یک رابط گرافیکی اداره کرد ، دستکاری کرد.

کرفس ، که بخش هایی از وظایف ناهمزمان را تعریف می کند ، می تواند قبل از شروع بلافاصله به کار بعدی یا خط کد ، شروع به کار کند.

جنگو می تواند بسیاری از مؤلفه های دیگر را داشته باشد ، که ما در اینجا به تفصیل در مورد آن خواهیم بود. روش های زیادی برای کاربرد بیشتر Django وجود دارد ، اضافه کردن وب سایت ها ، که کانال های ارتباطی سریع و ساده ، کرفس هستند ، که کارهای ناهمزمان را انجام می دهد و تعداد زیادی از نرم افزارهای دیگر برای گسترش Django ، به ویژه در توابع نمایش ، جایی که بیشتر کد اجرا می شود. توابع مشاهده مهم هستند زیرا آنها معمولاً هر قطعه ای از کد را که مخصوص یک الگوی URL خاص یا بخشی از سرور است ، اعلام می کنند.

ابتدا بیایید عملکردهای نمایش را کشف کنیم. توابع مشاهده با واردات با اشاره به کد که در نمای استفاده می شود ، شروع می شود و با استفاده از تعاریف یا کلاس های عملکرد معمولی تعریف می شوند. ساده ترین دیدگاه ها توسط تعریف عملکرد تعریف شده و HTTPRESPONSE را با یک الگوی اساسی باز می گردانند. بیایید با تعریف یک دیدگاه اساسی برای بازگشت متن "سلام جهان" شروع کنیم. به یاد داشته باشید که هر بار که پس از بیانیه ای مانند DEF ، کد را اضافه می کنید ، در حالی که ، در حالی که ، برای و غیره ، برای هر یک از تعاریف مقدماتی که می خواهید برای عملکرد خود اعمال کنید ، باید 4 فضای اضافه کنید. ما به زودی به معنای هر یک از اینها خواهیم رسید.

از فهرست سایت ما ، پرونده Feed/Views.py را با استفاده از Nano ویرایش کرده و خطوط زیر را به انتهای پرونده اضافه کنید.

from django.http import HttpResponse

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

HTTPRESPONSE DJANGO با یک رشته متنی پاسخ می دهد که با افتتاح و بسته شدن آن مشخص شده است. هر بار که اطلاعات را به یک عملکرد یا کلاس مانند درخواست یا رشته منتقل می کنید ، باید از پرانتز (، باز و بسته شدن) استفاده کنید.

این تنها چیزی نیست که ما باید دیدگاه خود را ببینیم. البته ، ما به سرور نگفتیم که نمای دقیقاً در کجا قرار دارد ، ما هنوز باید مسیری را تعریف کنیم که نمای آن باید ارائه شود. بیایید با تعریف یک مسیر اساسی در برنامه/urls.py شروع کنیم و بعداً به گروه های مسیر خواهیم رسید.

در App/urls.py ، پس از شروع واردات پس از شروع وارداتی که منظره ای را که اخیراً ایجاد کرده ایم ، یک خط اضافه کنید.

from feed import views as feed_views

حال بیایید الگوی نمایش را تعریف کنیم. View patterns have three components, the path component, which tells the server where the view exists within the server (the URL path that the user types into the navigation bar to enter the webpage), the view component where the view is specified, and a friendly name for the view so it's easy to retrieve it's pattern when working with a template, especially so it's name can be changed and updated if necessary to make space for another view or take on a more logical name. منطقی است که کارها را از این طریق انجام دهید و انعطاف پذیر باشید ، زیرا پایگاه کد شما محیطی همیشه در حال تغییر است که به انعطاف پذیری و بداهه نوازی نیاز دارد تا با ارزش و کار با آن آسان باشد. در اینجا نمای شما به نظر می رسد ، می توانید این را به urlpatterns = [بخش برنامه/urls.py اضافه کنید. الگوی نمایش با سه مؤلفه توضیح داده شده در بالا تعریف شده است ، و تابعی به نام PATH. الگوهای URL شما یک لیست است ، بنابراین حتماً همیشه هر مورد را در آنها با کاما به پایان برسانید ، زیرا این هر یک را از هم جدا می کند. هر مورد نیز باید یک بار دیگر با چهار فضای قبل از آن ، یک خط جدید را انجام دهد ، دقیقاً مانند برنامه در Settings.py. ما اولین مؤلفه نمای را با یک عملکرد رشته خالی تعریف خواهیم کرد ، تا منظره ای ایجاد کنیم که در فهرست اصلی سرور وب اجرا شود. urls.py شما اکنون باید اینگونه به نظر برسد:

from feed import views as feed_views

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

این پایه و اساس ایجاد یک وب سایت با Django است که کاملاً ایستا است. برای ایجاد یک وب سایت پویاتر که در آن می توانیم اطلاعات ذخیره سازی مانند تصاویر ، فیلم ها ، صوتی و موارد دیگر را شروع کنیم ، باید از مدل هایی استفاده کنیم که در مرحله بعدی آن را کشف خواهیم کرد. در حال حاضر ، بیایید کد خود را بررسی کرده و سرور را اجرا کنیم. برای بررسی کد خطاها ، اجرا کنید:

python manage.py check

اگر پیام های خطایی وجود دارد ، باید تغییراتی را که در برنامه خود ایجاد کرده اید با دقت مرور کنید و ببینید که آیا چیزی وجود دارد که باید برطرف شود ، مانند یک فضای بیرونی یا فاقد فضای ، یک شخصیت اضافی ، یک رشته غیرمجاز ، هر نوع تایپی ، هر شخصیت حذف شده به طور تصادفی یا هر چیز دیگری. خواندن از طریق پیام خطا (اگر یکی دارید) ، باید بتوانید مسیر پرونده ای را که ایجاد کرده اید یا ویرایش کرده اید به همراه یک شماره خط مشاهده کنید ، بنابراین به آن پرونده و خط نگاه کنید و ببینید آیا می توانید هر چیزی را که در آنجا وجود دارد ، برطرف کنید. اگر مسئله را برطرف کرده اید ، دستور فوق را دوباره اجرا کنید. هنگامی که نرم افزار شما آماده اجرا است و کار می کند ، خروجی "بررسی سیستم را مشخص نمی کند." حالا شما آماده رفتن هستید. سرور را با: اجرا کنید:

python manage.py runserver 0.0.0.0:8000

اکنون یک مرورگر وب را باز کرده و به http: // localhost: 8000 بروید. شما باید متن برگشتی را در پرانتز و نقل قول های عملکرد httpresponse از نظر خود مشاهده کنید. این فقط یک مثال اساسی است ، اما اگر آن را تا کنون درست کرده اید ، اصول اولیه نحوه کار لینوکس ، باش ، پایتون و جنگو را درک می کنید. بیایید عمیق تر در برخی از مدل سازی پایگاه داده ها حفر کنیم و قدرت یک کلاس پایتون را در ذخیره اطلاعات کشف کنیم. سپس ، ما قبل از اینکه سایت خود را با استفاده از JavaScript و Learning Machine کاملاً برجسته ، انعطاف پذیر و ایمن کنیم ، شروع به گرفتن HTML و CSS خواهیم کرد.

کلاس ها در Models.Py برنامه شما ذخیره می شوند. با استفاده از نانو ، ویرایش app/models.py و یک کلاس جدید اضافه کنید. یک کلاس با تعریف کلاس تعریف می شود و در این مورد مدل های فوق العاده ای که از آن به ارث می برد ، منتقل می شود. نام کلاس پس از تعریف کلاس ارائه می شود و پس از تعریف کلاس A: (روده بزرگ) استفاده می شود ، قبل از اینکه ویژگی ها و تعاریف عملکردی که به کلاس گره خورده اند در زیر مشخص شود. کلاس ما به یک شناسه نیاز دارد که می توانیم برای بازیابی آن و منحصر به فرد نگه داریم ، و همچنین برای ذخیره برخی از اطلاعات به یک قسمت متن نیاز دارد. بعداً می توانیم یک Timestamp ، Files ، Booleans را اضافه کنیم (تعاریف درست یا نادرست که می تواند به کد ما کمک کند تصمیم گیری در مورد آنچه باید با مدل انجام دهد ، و می تواند برای مرتب کردن آن استفاده شود) ، نمونه ای برای اتصال مدل با کاربر وارد شده به سرور و موارد دیگر. بیایید کد زیر را باز کنیم:

from django.db import models # وارداتی که برای تعریف کلاس ما استفاده می شود و ویژگی های آن است
class Post(models.Model): # تعریف خود کلاس ما
    id = models.AutoField(primary_key=True) # شناسه مدل ما ، یک کلید تولید شده به طور خودکار که به ما اجازه می دهد مدل را پرس و جو کنیم ، آن را منحصر به فرد نگه داریم و در صورت نیاز به تعامل با مدل پس از ایجاد ، مفید است.
    text = models.TextField(default='') # ویژگی فروشگاه های کلاس ما ، در این حالت ، برخی از متن ها ، به طور پیش فرض به یک رشته خالی.

پرونده را همانطور که قبلاً انجام دادیم ، ببندید و ذخیره کنید.

بسیاری از زمینه ها و گزینه های دیگر وجود دارد که وقتی این کلاس را به عنوان تکامل برنامه خود به روز می کنیم ، کشف خواهیم کرد ، اما این ضروریات اساسی ایجاد یک برنامه برای ارسال متن است. با این حال ، این مدل به تنهایی کار نخواهد کرد. همانطور که قبلاً توضیح داده شد ، برای کار کردن این مدل به یک نمای سفارشی و الگوی URL سفارشی نیاز خواهیم داشت و به همراه یک الگوی نیز به یک فرم نیاز خواهیم داشت. بیایید ابتدا فرم را کشف کنیم.

برای تعریف یک فرم ، ویرایش app/forms.py با nano و اضافه کردن خطوط زیر. ما به دو واردات ، کلاس فرم های ما و همچنین مدلی که ما ایجاد کردیم (feed.models.post) ، تعریف کلاس شبیه به مدل و یک زمینه به همراه یک زیر کلاس به نام متا نیاز خواهیم داشت که مدل را تعریف می کند. این فرم همچنین می تواند یک عملکرد اولیه سازی داشته باشد که آن را بر اساس اطلاعات موجود در درخواست ، مدل یا در غیر این صورت تنظیم می کند ، ما بعداً این مورد را بررسی خواهیم کرد.

فرم های مدل بسیار مفید هستند زیرا می توانند یک مدل ایجاد کنند یا یک مدل را ویرایش کنند ، بنابراین ما از آنها برای هر دو استفاده خواهیم کرد. بیایید یکی را در فرم های زیر تعریف کنیم.

from django import forms
from feed.models import Post

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

این اصول اولیه شکل و مدل است. این فرم مدل را می توان برای فوری یا ویرایش یک پست استفاده کرد و متن موجود در آن را تغییر داد. ما به دنبال ادغام این فرم در نمای بعدی خواهیم بود. ابتدا بیایید مهاجرت کنیم و پایگاه داده را مهاجرت کنیم تا کد ما بتواند هنگام اجرا با مدل ارتباط برقرار کند. برای انجام این کار ، دستورات زیر را اجرا کنید:

python manage.py makemigrations
python manage.py migrate

این کار یک دقیقه طول می کشد ، اما پس از انجام این کار ، به شما امکان می دهد تا به مدل در نمای ، میانی نرم افزار یا هر جای دیگر در نرم افزار دسترسی پیدا کنید. بیایید با ایجاد منظره ای که می توانیم مدل خود را ببینیم ادامه دهیم. همانطور که ذکر شد ، فید/بازدیدها را ویرایش کنید و کد زیر را اضافه کنید. نیازی به اضافه کردن چیزی پس از علامت # نیست ، که کد نظرات است که برای نشان دادن اطلاعات در مورد کد استفاده می شود. ما با وارد کردن مدل خود در نماها شروع خواهیم کرد و آن را به زمینه ای اضافه می کنیم که می توانیم آن را در یک الگوی به عنوان لیستی برای نمایش ارائه دهیم. در مرحله بعد ، ما یک الگوی اضافه خواهیم کرد که در آن می توانیم فرم و مدل را با یک دکمه ارائه دهیم تا یک شیء جدید بر اساس مدل ایجاد شود و آن را به سرور ارسال کنیم. این پیچیده به نظر می رسد ، بنابراین بیایید آن را قدم به قدم برداریم. قبل از اتمام نمای ، بیایید الگویی ایجاد کنیم که فقط مدل را ارائه دهد و با ایجاد یک پست جدید در پوسته ، اطمینان حاصل کنیم که می توانیم آن را ببینیم. در اینجا نحوه نگاه این دیدگاه آورده شده است:

    posts = Post.objects.all() # تاکنون تمام پست های موجود در پایگاه داده را پرس و جو کنید

این همه بسیار ساده به نظر می رسد تا اینکه به پایین برسیم. رندر ، مقدار برگشتی توسط عملکرد به جای پاسخ HTTP مانند مثال قبلی ، همیشه درخواست را به عنوان اولین ورودی خود می گیرد ، زمینه ای را می پذیرد (در این حالت پست ها در پایگاه داده) ، که اکنون می تواند در الگوی ارائه شود و الگوی تعریف شده در عملکرد را برمی گرداند. این الگوی یک سند HTML با کمی زبانی به نام Jinja2 خواهد بود که اطلاعات پایتون را به HTML منتقل می کند.

برای شروع ایجاد الگوها ، دو دایرکتوری را در خوراک تهیه کنید.

mkdir feed/templates
mkdir feed/templates/feed

در مرحله بعد ، یک الگوی را در دایرکتوری فوق ، خوراک/قالب ها/خوراک ویرایش کنید و کد را برای این مثال اضافه کنید. بیایید برای این مثال به الگوی نگاه کنیم.

این یک الگوی بسیار ساده است. این مجموعه باز و بسته شدن برچسب های HTML ، یک برچسب از نوع اسناد ، یک برچسب بدنه با عنوان افسانه ، یک برچسب شکست را تعریف می کند که یک خط کوچک را در صفحه نمایش اضافه می کند و برای حلقه ای که هر پست را در لیست پست ها به عنوان پاراگراف در الگوی ارائه می دهد. این تنها چیزی است که برای ارائه پست ها لازم است ، اما هنوز هیچکدام در پایگاه داده وجود ندارد. بیایید مقداری با پوسته ایجاد کنیم. ما می توانیم پوسته را با manage.py اجرا کنیم

python manage.py shell

حال ، بیایید مدل پست خود را وارد کنیم

from feed.models import Post

در مرحله بعد ، ما یک پست ساده با یک رشته ایجاد خواهیم کرد و از پوسته خارج می شویم. این رشته می تواند هر چیزی باشد ، تا زمانی که متن معتبر باشد.

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

در آخر ، ما باید یک الگوی URL را به خوراک خود اضافه کنیم. از آنجا که برنامه فید ما از چندین URL استفاده می کند و ما می خواهیم اندازه پرونده ها را کوچک نگه داریم ، بیایید یک urls.py محلی را در برنامه فید خود ایجاد کنیم که به نظر می رسد:

from django.urls import path
from . import views

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

ما همچنین باید urls.py را در برنامه پایه ویرایش کنیم ، هر آنچه را که تصمیم گرفتیم آن را بنامیم ، این اولین دایرکتوری بود که ما ایجاد کردیم. App/App.py را ویرایش کنید و موارد زیر را به الگوهای URL اضافه کنید

from django.urls import include # در بالا
    # ... کد قبلی اینجا

اکنون ، هنگامی که سرور را با Python Manage.Py Runserver اجرا می کنیم ، صفحه ای را که ایجاد کرده ایم خواهیم دید زیرا مدل ، مشاهده و الگوی و همچنین الگوی URL را به همراه موارد موجود در پایگاه داده داریم. در مرحله بعد ، اجازه دهید شکلی را که ایجاد کرده ایم پیاده سازی کنیم و شروع به ایجاد پست های خودمان کنیم. اما قبل از نوشتن کد بیش از حد ، بیایید با استفاده از فیلمنامه ای که قبلاً نوشتیم ، پشتیبان تهیه کنیم ، پشتیبان تهیه کنیم. این اسکریپت را در پوسته اجرا کنید ، چند لحظه صبر کنید و تمام کد ها از مخزن Git ما حمایت می شوند.

backup

اجرای فرم نسبتاً ساده است. ما فرم خود را وارد خواهیم کرد ، یک کنترل کننده درخواست پست را به نمای اضافه می کنیم و قبل از هدایت به همان دیدگاه ، پست را در پایگاه داده ذخیره می کنیم. ما می توانیم از عملکرد تغییر مسیر که قبلاً وارد کرده ایم استفاده کنیم و یک عملکرد دیگر به نام معکوس برای دریافت URL برای الگوی نمای. ما این کار را با رشته "خوراک: خوراک" پرس و جو خواهیم کرد زیرا فضای نام الگوی موجود خوراک است و نمای نیز به عنوان خوراک نامیده می شود.

    posts = Post.objects.all() # تاکنون تمام پست های موجود در پایگاه داده را پرس و جو کنید
    if request.method == 'POST': # درخواست پست را انجام دهید
        form = PostForm(request.POST) # نمونه ای از فرم ایجاد کرده و داده ها را در آن ذخیره کنید
        if form.is_valid(): # تأیید فرم
            form.save() # شیء جدید را ذخیره کنید
        return redirect(reverse('feed:feed')) # با درخواست دریافت به همان آدرس اینترنتی تغییر مسیر دهید
        'form': PostForm(), # حتماً فرم را به متن منتقل کنید تا بتوانیم آن را ارائه دهیم.

اکنون ، ما باید الگوی را به روز کنیم تا فرم جدید را به خود اختصاص دهیم. ما می توانیم این کار را با استفاده از

در HTML برچسب بزنید و فرم را در الگوی HTML با یک دکمه ارسال ارائه دهید. ما همچنین به یک توکن CSRF احتیاج داریم ، یک نشانه که مانع از ارسال سایت های خارجی بدون بارگیری اولین صفحه می شود.

بیایید این را تجزیه کنیم. یک کلاس فرم جدید ، یک نشانه ، خود فرم و دکمه ارسال وجود دارد. بسیار ساده است ، اما وقتی به آن نگاهی می اندازیم ، ممکن است بخواهیم آن را بهتر جلوه دهیم. این کار می کند ، ما می توانیم پست های جدیدی را با فرم ارسال کنیم و اکنون آنها در پایگاه داده ذخیره می شوند. در اینجا چند مورد در جریان است. ما از برچسب های HTML استفاده می کنیم تا اعلام کنیم که سند یک سند HTML است ، ما از یک برچسب الگوی ({٪… ٪}) برای ارائه نشانه برای فرم استفاده می کنیم ، و دیگری ، {{…}} برای ارائه فرم. ما همچنین یک حلقه برای ارائه متن با استفاده از برچسب های بلوک و یک برچسب الگو داریم. برچسب های بلوک واقعاً مهم هستند زیرا می توانیم تعریف کنیم که چگونه بخش هایی از الگو با آنها ارائه می شود ، و برچسب های الگو پایه و اساس نحوه قرار دادن متغیرها در کد خود هستند.

اکنون باید برنامه خود را بهتر جلوه دهیم ، زیرا در حال حاضر واقعاً اساسی به نظر می رسد. ما می توانیم این کار را با استفاده از CSS ، بصورت خطی یا در کلاسهای گره خورده به هر شیء در سند انجام دهیم. CSS واقعاً خوب است زیرا همه چیز را در صفحه می گوید که چگونه باید به نظر برسد ، و می تواند واقعاً خوب به نظر برسد. چند کتابخانه وجود دارد که می توانند این کار را انجام دهند ، اما شخصی من به راه انداز است.

bootstrap را می توان از وب سایت آنها بارگیری کرد ،getbootstrap.com/بشر پس از آنجا ، دکمه را فشار دهید تا اسناد نصب را بخوانید و کد را از بخش CDN از طریق CDN کپی کنید. شما به این کد در بالای سند HTML خود ، در برچسب به نام Head ، به این کد نیاز خواهید داشت. همچنین ، بیایید پیش برویم و یک الگوی پایه ایجاد کنیم تا نیازی به بازآفرینی این پیوندها در هر الگوی نباشیم.

یک دایرکتوری جدید به نام Templates با الگوهای MKDIR تهیه کنید ، و سپس Templates/Base.html را ویرایش کنید.

باید اینگونه به نظر برسد:

حتماً پرونده های CSS و JavaScript ، پرونده های .cs و .js را کپی کنید ، زیرا ما به JavaScript نیاز داریم تا سایت خود را در آینده عملکردی تر کند.

حال ، بیایید به پوسته Bash برگردیم و یک دستور سریع اجرا کنیم. به یاد داشته باشید ، اگر تا به حال نیاز به دسترسی به محیط مجازی دارید ، نوع منبع VenV/BIN/Activate را تایپ کنید. این به شما امکان می دهد بسته های پایتون را به صورت محلی به گونه ای نصب کنید که به Django اجازه دسترسی به آنها را می دهد. برای ارائه فرم های خود تولید شده توسط کلاس های Bootstrap Django ، از یک بسته پایتون به نام Crispy Forms استفاده خواهیم کرد. ما می توانیم این را با دستور زیر بارگیری کنیم

pip install django-crispy-forms

پس از نصب این کار ، آن را به تنظیمات اضافه کنید.

    # ... کد قبلی اینجا

اکنون ، در الگوی خوراک ما ، می توانیم مواردی را حذف کنیم. بیایید شروع و انتهای سند را حذف کنیم و آن را با وراثت از الگوی پایه خود جایگزین کنیم ، با استفاده از گسترش و تعریف بلوک. همچنین ، ما یک الگوی فیلتر را با بار و یک فیلتر الگوی به فرم اضافه خواهیم کرد. در آخر ، بیایید یک کلاس bootstrap را به دکمه روی فرم اضافه کنیم تا بیشتر شبیه یک دکمه باشد. باید اینگونه به نظر برسد:

زیبا! این در حال حاضر کاملاً کمی کد است. در مرحله بعد ، ما باید آن را آزمایش کنیم و مطمئن شویم که همه چیز زیبا به نظر می رسد ، و همچنین مطمئن باشید که همه چیز به درستی کار می کند. طبق دستورالعمل های قبلی سرور را اجرا کنید و مطمئن شوید که سایت خوب به نظر می رسد و کار می کند. کار عالی! شما آماده هستید تا به مرحله بعدی بروید ، که در آن ما با استفاده از URL ها ، فرم ها ، نمایش ها و الگوهای مشابه ، عملکرد ورود به سیستم کاربر را اضافه خواهیم کرد. الگوی پایه مهم است ، و ما همچنان به اصلاح آن و ایجاد تغییرات در صورت لزوم ادامه خواهیم داد ، اما در حال حاضر بیایید با ایمن تر کردن سایت خود ، با این امکان که کاربران بتوانند با یک نام کاربری و کد عبور وارد شوند ، و در نهایت حتی اطلاعات مهمتری که به شما کمک می کند تا برنامه شما و حساب شخصی شما فقط توسط شما قابل دسترسی باشد ، تمرکز کنیم.

برای انجام این کار ، ما باید از مدل کاربر ساخته شده در Django استفاده کنیم. مدل کاربر یک مدل پایگاه داده است ، مانند پست ما ، می تواند برای ورود کاربر به وب سایت ارائه شود. در آینده ، قبل از اعزام سایت به اینترنت ، این مدل را با سایر مدل های منتسب به آن گسترش خواهیم داد و اقدامات امنیتی دیگری را برای ورود به سیستم که در برابر فیشینگ مقاوم هستند ، می سازیم. ما با استفاده از برخی از فرم های ورود به سیستم که Django ارائه می دهد ، شروع خواهیم کرد. ابتدا بیایید یک برنامه جدید ایجاد کنیم که از آن برای ارائه الگوها و نماها برای صفحه اصلی ورود استفاده خواهیم کرد. ما همچنین برنامه های دیگری را برای نشان دادن ادامه چالش های ورود به سیستم به منظور تأمین امنیت برنامه ، از جمله یک Pincode ، تشخیص چهره ، ارتباطات میدانی نزدیک ، دستگاه های خارجی ، احراز هویت چند عامل و تشخیص اثر انگشت ایجاد خواهیم کرد.

ما قبلاً در مورد شروع یک برنامه صحبت کردیم. از فهرست ما ، در داخل محیط مجازی ، مدیریت این استدلال ها

python manage.py startapp users

اکنون ، ما باید یک دایرکتوری برای برنامه جدید داشته باشیم. بیایید با ایجاد نمای در آن فهرست که مطابق با ورود کاربر است ، شروع کنیم. Django برای ورود به سیستم کاربر در حال نمایش است ، اما این موارد برای ما مناسب نخواهد بود زیرا ما به یک نمای سفارشی احتیاج داریم ، که ترجیحاً با یک تعریف انجام می شود.

در این دیدگاه ، ما با بررسی درخواست پست ، Pass.post به یک loginform وارد شده از Django ، تأیید حساب کاربری و قبل از تغییر مسیر آنها به برنامه فید ما ، شروع خواهیم کرد.

در کاربران/بازدیدها ، کد زیر را اضافه کنید

        username = request.POST['username'] # نام کاربری و رمز عبور را از درخواست پست دریافت کنید
        password = request.POST['password'] # کاربر را تأیید کنید

این تنها چیزی است که شما برای نمای اصلی ورود به سیستم نیاز دارید. حال ، بیایید با گسترش الگوی پایه ، یک فرم برای نمای ایجاد کنیم. ما با ایجاد یک دایرکتوری جدید برای الگوهای موجود در پوشه کاربران شروع خواهیم کرد.

mkdir users/templates
mkdir users/templates/users

اکنون ، ما باید بتوانیم کاربران/قالب ها/کاربران/login.html را ویرایش کنیم. در حالی که ما در آن هستیم ، یک الگوی ایجاد خواهیم کرد تا به کاربر نیز اجازه ثبت نام کند.

nano users/templates/users/login.html

اکنون ، در الگوی ،

این اصول اولیه یک الگوی ورود است. این واقعاً دقیقاً مانند الگوی دیگر در ساختار است ، اما وقتی ارائه می شود کمی متفاوت به نظر می رسد. ما می توانیم این کد را کپی کنیم تا یک الگوی بسیار مشابه دیگر به نام Register.html بسازیم ، جایی که این متن را تغییر می دهیم و از فرم جدیدی که می سازیم استفاده می کنیم. بیایید ابتدا الگوی را بسازیم. کاربران/الگوها/کاربران/Register.html را ویرایش کنید و کد زیر را اضافه کنید:

حال ، بیایید قبل از به روزرسانی ورود کاربر خود با یک مدل ، یک فرم برای ثبت نام کاربر خود بسازیم و به نمودارها برگردیم. ما این فرم را برای شروع کار اساسی خواهیم کرد ، اما جزئیات بیشتر و ویژگی های امنیتی مانند توافق نامه ها و Captcha را در آینده گنجانده ایم. فرم ها را با کاربران/فرم های نانو ویرایش کنید و کد زیر را اضافه کنید.

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

بنابراین ما در اینجا شکل دیگری داریم که نسبتاً ساده کار می کند. این یک فرم ثبت کاربر با نام کاربری ، ایمیل و رمز عبور و همچنین یک قسمت رمز عبور تأیید است. توجه داشته باشید که این فرم فرم های معمولی را گسترش نمی دهد. کلاس فرم ، این یک فرم مدل است که به این معنی است که دارای متا است. یک قسمت دقیقاً یکسان تعریف شده است ، و کلاس متا مدل را تعریف می کند که فرم با بقیه اطلاعاتی که به فرم نوشته شده است مطابقت دارد. بیشتر این موارد قبلاً در Django ساخته شده در UserCreationForm وجود دارد ، بنابراین ما از آن به عنوان پایه ای برای کلاس استفاده خواهیم کرد (در پرانتز گذشت).

در مرحله بعد ، اکنون که یک فرم و یک الگوی داریم ، دیدگاه ثبت نام کاربر را بررسی خواهیم کرد. این یک modelform است ، دقیقاً مانند آنچه در نمایش جدید پست است. کاربران/بازدیدها را ویرایش کنید و کد زیر را اضافه کنید:

# … واردات

این تنها چیزی است که ما برای ثبت نام کاربر نیاز داریم ، اما باید اطلاعات بیشتری داشته باشیم. ما می خواهیم زمان ثبت نام کاربر را بدانیم ، چه ساعتی در سایت آخرین بار بوده است ، برخی از اطلاعات در مورد آنها ، مانند زندگی نامه ، منطقه زمانی و غیره. همچنین ، ما باید مدل فید ، پست خود را به روز کنیم تا مدل کاربر را حساب کنیم و پست های مربوط به هر کاربر را به خود اختصاص دهیم. برای انجام این کار ، ما در هر دو برنامه Models.py را به روز خواهیم کرد. بیایید با ویرایش مدل فید شروع کنیم. اکنون باید اینگونه به نظر برسد:

from django.db import models # … واردات
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # در این خط اضافه کنید

به خط دوم که به پرونده اضافه شده است توجه کنید. این یک کلید خارجی است ، که هر پست را به هر پست به یک کاربر واحد نسبت می دهد ، بنابراین می توانیم اطمینان حاصل کنیم که پست ها را بر اساس کاربر برای هر کاربر ذخیره می کنیم و بدون نسبت دادن آن به کاربر نمی توان پستی را انجام داد. ما این کلید خارجی را با کلاس که نشان می دهد تعریف می کنیم ، یک آرگومان حذف برای اطمینان از حذف پست ها با کاربران ، آرگومان های تهی و خالی برای اطمینان از اینکه می توانیم در صورت لزوم کاربر را حذف کنیم ، و برای عدم وجود کاربر در پست هایی که قبلاً ایجاد کرده ایم ، و یک نام مرتبط ، که می توانیم از آنها استفاده کنیم تا به اشیاء پستی که کاربر ایجاد می کند استفاده کنیم. این نام مرتبط ، برخلاف Post.Author ، نویسنده پست ، به ما کاربر می دهد که خود پست را ارسال کرده است. اکنون می توانیم پست هایی را که با اجرای user.posts.all () یا نویسنده .posts.all () ساخته شده است ، دریافت کنیم.

حال ، بیایید ورود به ما را انعطاف پذیر تر کنیم. ما در حال حاضر می توانیم سایت خود را با محدود کردن تعداد دفعاتی که اجازه ورود به سایت را فراهم می کنیم ، در برابر فیشینگ بسیار آسیب پذیر کنیم ، این کار بسیار آسان است. بیایید قبل از اینکه ما همچنان به توسعه برنامه خود بپردازیم ، اطلاعات مربوط به هر کاربر را نیز شروع کنیم. ویرایش کاربران/models.py ، کد زیر را اضافه کنید.

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')

توجه داشته باشید که این مدل نسبتاً شبیه به مدل پست است. ما یک واردات اضافی ، منطقه زمانی داریم که به ما امکان می دهد پیش فرض هایی را در زمینه های DateTime تنظیم کنیم ، و همچنین مانند پست یک شخصیت و فیلد را نیز داریم. استفاده از همه این زمان ها به ما کمک می کند تا سایت را تأمین کنیم و استفاده از آن را درک کنیم و قسمت های متن به ما اجازه می دهد تا اطلاعات مربوط به هر کاربر یا نویسنده را در وب سایت ارائه دهیم. Onetoonefield باید تنها مورد توجه جزئی باشد ، دقیقاً مانند یک پیش فرض رفتار می کند اما تنها با یک مدل بعدی با یک مورد. به این ترتیب ، کاربر فقط یک پروفایل دارد ، در حالی که ممکن است پست های زیادی داشته باشد.

حال ، بیایید ورود به سیستم و ثبت نام خود را بهبود بخشیم تا نمایه را حساب کنیم. ابتدا ، کاربران/بازدیدها را ویرایش کنید و روی نمای ثبت تمرکز کنید:

# … واردات
            Profile.objects.create(user=user) # حتماً این خط را اضافه کنید ، تا نمایه ای را برای کاربر ایجاد کنید

این به سادگی بدون پر کردن هیچ یک از اطلاعات ، نمایه ای را برای کاربر ایجاد می کند. اکنون ، ما می خواهیم اطمینان حاصل کنیم که حساب کاربری نمی تواند خیلی اوقات وارد سیستم شود ، یا حداقل رمزهای عبور را نمی توان خیلی اوقات امتحان کرد ، بنابراین بیایید نمای ورود را به روز کنیم.

# … واردات
        if user and user.profile.can_login < timezone.now(): # توجه داشته باشید که اکنون بررسی می کنیم که آیا کاربر می تواند وارد سیستم شود
        else: # اگر ورود موفقیت آمیز نبود ،
            user = User.objects.filter(username=username).first() # این بخشی است که ما نمایه کاربران را به روز می کنیم
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # بنابراین آنها نمی توانند برای چند ثانیه دوباره وارد سیستم شوند

این اساسی اساسی امنیت است. اطمینان حاصل کنید که سایت در برابر کسی آسیب پذیر نیست که به سادگی هر ترکیب رمز عبور ممکن را انجام دهد ، یا حتی چند مورد از آنها را همزمان. این برای کاربر معمولی که کد عبور خود را می شناسد ناامید کننده نخواهد بود و فقط در چند دستگاه وارد سیستم می شود ، اما تعداد زیادی از روبات های فیشینگ را از برنامه خارج می کند. توجه داشته باشید که ما یک عبارت IF را با یک متغیر ، can_login اضافه کردیم ، که باید در گذشته زمانی باشد و با استفاده از همان نام کاربری ، آن را با هر ورود ناموفق به روز کنیم. به این ترتیب ، یک کاربر مخرب قادر به حدس زدن رمز عبور در هر جایی نزدیک نیست. تعداد ثانیه های موجود در DateTime.Timedelta () نیز می تواند به روز شود ، و وب سایت با ثانیه های بیشتر انعطاف پذیر تر و در عین حال کمی کمتر قابل استفاده خواهد بود. من 15 را برای شروع توصیه می کنم.

به یاد داشته باشید ، ما یک اسکریپت پشتیبان ساختیم تا کار خود را نجات دهیم ، بنابراین بیایید پیش برویم و از آنچه که تاکنون داریم حمایت کنیم تا اطمینان حاصل کنیم که همه چیز را ذخیره کرده ایم. دستور را اجرا کنید:

sudo backup

یک بار دیگر ، این کار شما تاکنون کار شما را نجات می دهد. من توصیه می کنم برای ذخیره کار خود ، نسخه پشتیبان مکرر را اجرا کنید و حتی ممکن است بخواهید به طور خودکار یک کار پشتیبان را اجرا کنید. شما می توانید این کار را با استفاده از یک ابزار UNIX به نام Cron انجام دهید. برای فعال کردن این ابزار ، دستور زیر را اجرا کرده و رمز ورود خود را وارد کنید:

sudo crontab -e

اگر قبلاً گزینه 1 را برای Nano انتخاب نکرده اید ، ویرایشگر متن شما باید از قبل با آن آشنا باشید و با استفاده از کلیدهای فلش به پایین پرونده بروید. خط زیر را اضافه کنید:

0 * * * * sudo backup

کرون از دقیقه ، ساعت ، روز ، ماه ، ماه ، روز هفته استفاده می کند ، جایی که A * یا یک شماره نشان می دهد چه موقع دستور را اجرا می کند. با استفاده از 0 برای دقیقه و * برای بقیه گزینه ها ، می توانیم در دقیقه اول هر ساعت در شروع دقیقه یک فرمان را اجرا کنیم. این به ما امکان می دهد از کد به طور خودکار نسخه پشتیبان تهیه کنیم. تمام مشاغل Cron هنگام اجرای Sudo به عنوان Root ، بنابراین نیازی به تایپ رمز عبور هر ساعت نیست.

برای آسانتر کردن نسخه پشتیبان از کد ما بدون استفاده از رمز عبور ، بیایید رمز را برای دستور پشتیبان ما غیرفعال کنیم. ما این کار را با اجرای دستور زیر و وارد کردن رمز عبور انجام خواهیم داد:

sudo visudo

حال ، بیایید به پایین پرونده بروید و خط دیگری اضافه کنیم:

ALL ALL=NOPASSWD: /bin/backup

این به ما امکان می دهد دستور "پشتیبان گیری" را مانند هر کاربر ، بدون رمز عبور اجرا کنیم. فرمت این کار آسان است ، فقط خط را با "همه = nopasswd:/bin/" پیشوند کنید و با دستور پایان دهید ، به عنوان مثال/سطل/پشتیبان ، که در/usr/bin/وجود دارد.

حال ، بیایید کار با ایمیل را شروع کنیم. ایمیل برای وب سایت ها بسیار مهم است ، زیرا این راهی برای ایمن تر کردن یک وب سایت است ، تأیید کنید که کاربران افراد واقعی هستند و حتی محصولات یا خدمات بازار را به مشتریان می دهند. بسیاری از افرادی که اینترنت را مکرر می کنند ایمیل خود را بررسی می کنند و انواع ایمیل بازاریابی را در مورد محصولات و خدماتی که به آنها علاقه مند هستند دریافت می کنند. در هنگام امکان امکان ایمیل در وب سایت Django ، چند گزینه وجود دارد و شما خوشحال می شوید که هر کدام را انتخاب کنید که برای شما بهتر باشد.

ابتدا می توانید یک سرویس ایمیل را بپردازید که به شما امکان ارسال ایمیل از دامنه خود را می دهد و به حداقل کد نیاز دارد. خدمات بسیاری وجود دارد که این موضوع را ارائه می دهند ، مانند Google Workspace ، SendInblue ، MailGun و موارد دیگر.

در غیر این صورت ، شما به خوبی در حال ساختن سرویس ایمیل خود در سرور خود از ابتدا هستید. من این گزینه را توصیه می کنم ، حتی اگر کد بیشتری داشته باشد و ممکن است به میزبانی ویژه نیاز داشته باشد. شما نمی توانید به احتمال زیاد یک سرور پست الکترونیکی را از رایانه خانگی خود شروع کنید ، بنابراین بیایید پیش بروید و پیکربندی و کد را برای ارسال ایمیل قبل از شروع سرور در ابر و ایجاد سرور پست الکترونیکی خودمان در داخل بررسی کنید.

ابتدا ، تنظیمات را با دستور زیر ویرایش کنید:

nano app/settings.py

جایی که برنامه نام برنامه ای است که با StartApp ایجاد کرده اید.

خطوط زیر را اضافه کنید:

SITE_NAME = 'Django App'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = username@server.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)

اطمینان حاصل کنید که وقتی آماده استقرار برنامه خود هستید ، این موارد را تغییر دهید ، ما بعداً این موضوع را دوباره بررسی خواهیم کرد. تنظیمات email_address باید ایمیلی باشد که می خواهید از آن ارسال کنید ، و رمز عبور (email_host_password) باید روی رمز عبوری که برای سرور ایجاد می کنید تنظیم شود. من رمز عبور را از یک فایل پیکربندی بارگیری می کنم تا با استفاده از منطق زیر ، آن را از کد دور نگه دارم ، بالاتر از این خطوط در تنظیمات .py:

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

سپس ، من یک فایل JSON را با پیکربندی در /etc/config.json با استفاده از Nano به شرح زیر تنظیم کرده ام.

برای ویرایش پرونده:

sudo nano /etc/config.json

خطوط زیر را اضافه کنید:

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

ما به ویرایش فایل پیکربندی ادامه خواهیم داد و تمام رمزهای عبور و کلیدهایی را که در برنامه استفاده خواهیم کرد اضافه خواهیم کرد. در حال حاضر ، بیایید به سرعت نحوه ارسال ایمیل با استفاده از پایتون را بررسی کنیم. ابتدا بیایید یک الگوی برای یک ایمیل تأییدیه ای که می توانیم برای کاربران خود ارسال کنیم ، ایجاد کنیم و آن را در فهرست الگوهای کاربر قرار دهیم. این الگوی در HTML نوشته خواهد شد.

nano users/templates/users/verification_email.html

این ایمیل نسبتاً ساده است. این زمینه از یک کاربر ، URL پایه برای سایت و شناسه کاربری و نشانه ای که برای تأیید ایمیل کاربر استفاده می شود ، طول می کشد. قبل از نوشتن برخی از کد های پایتون برای ارائه الگوی ، حتماً URL پایه را در تنظیمات تعریف کنید. پیش بروید و خطوط زیر را به App/Settings.py اضافه کنید.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

سرانجام ، هنگامی که سایت شما برای اینترنت آماده است و شما آن را مستقر می کنید ، می خواهید دامنه خود را به عنوان نام دامنه ای که خریداری می کنید برای نمایندگی سایت تعریف کنید. این نامی است که برای دسترسی به سایت خود در NAVBAR تایپ خواهید کرد. در حال حاضر ، می توانید دامنه را خالی بگذارید یا از یک مکان نگهدارنده استفاده کنید. همچنین می خواهید سایت_name را به نامی که می خواهید سایت خود را انتخاب کنید تغییر دهید ، از انتخاب خود.

قبل از ارسال ایمیل ، بیایید یک ژنراتور توکن ایجاد کنیم تا بتوانیم یک نشانه فعال سازی حساب داشته باشیم که هرگز منقضی نشود. ما می توانیم این کار را با ساختن و وارد کردن یک نشانه فعال سازی حساب انجام دهیم که به نظر زیر می رسد. پرونده را ویرایش کنید:

nano users/tokens.py

کد زیر را اضافه کنید:

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

این ژنراتور اصلی توکن یک توکن ایجاد می کند که می توانیم کاربر را در یک URL ارسال کنیم و کاربر می تواند برای تأیید ایمیل و فعال کردن حساب خود از آن استفاده کند.

بعد ، بیایید نحوه ارسال ایمیل را ببینیم. با استفاده از نانو ، کاربران/email.py را ویرایش کنید.

nano users/email.py

ارسال ایمیل تأیید HTML به این شکل خواهد بود:

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

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

این نسبتاً ساده است. ما توابع مورد نیاز خود را برای ارسال ایمیل وارد می کنیم ، ایمیل را با الگوها و تنظیمات خود ارائه می دهیم و سپس ایمیل را از طریق نام الگوی تعریف می کنیم و با استفاده از یک عملکرد آن را برای کاربر ارسال می کنیم. متوجه خواهید شد که ما عملکرد ارسال نامه ، send_html_email را تعریف نکرده ایم ، بنابراین بیایید این را زیر کدی که قبلاً به کاربران/email.py اضافه کرده ایم ، بنویسیم

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

این کمی پیچیده تر است ، و ما هنوز آماده اجرای همه این کد نیستیم. توجه کنید که ما در حال تعریف یک Unsub_Link هستیم ، پیوندی که کاربر می تواند برای اشتراک از ایمیل های ما استفاده کند. این مهم است ، زیرا کاربران باید بتوانند از ایمیل های ما خودداری کنند ، مگر اینکه بخواهند آنها را در هر زمان ببینند. ما همچنین یک جایگزین متنی برای پیام خود اضافه می کنیم ، که پیام HTML است که از برچسب های HTML محروم شده است. در آخر ، ما بررسی می کنیم که ایمیل ارسال شده است یا خیر ، و اگر این کار را نکرد ، ما در نمایه کاربر علامت گذاری می کنیم که ایمیل آنها معتبر نیست.

بیایید به مدل های کاربر برگردیم تا بتوانیم این کار را انجام دهیم. ما باید یک تابع را برای ایجاد پیوندی به اشتراک گذاری تعریف کنیم و یک فیلد بولی را تعریف کنیم تا مشخص شود که ایمیل کاربر معتبر نیست.

ابتدا واردات زیر را به بالای کاربران/مدل ها اضافه کنید.

nano users/models.py
# …

در مرحله بعد ، بیایید توابع را به مدل کاربر اضافه کنیم تا نشانه را بسازید و نشانه ای را که برای فعال کردن ایمیل استفاده می شود ، و همچنین این زمینه را بررسی کنید تا آیا کاربر با موفقیت در دریافت نامه خود دریافت کرده است. در کاربران/models.py دوباره کد زیر را به انتهای مدل اضافه کنید (کد مخرب)

# …
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # به مدت 30 روز معتبر است

این نسبتاً ساده است ، ما از یک TimestampSigner ، که یک ابزار اصلی رمزنگاری است ، برای ایجاد یک نشانه که پس از مدت زمان مشخصی منقضی می شود ، استفاده می کنیم ، و ما همچنین از عملکرد دیگری برای بررسی معتبر استفاده می کنیم. ما دو بار از این نشانه ها استفاده می کنیم ، یک بار ، یک بار برای تأیید ایمیل و یک بار برای پیوند لغو اشتراک.

اکنون که این موارد را داریم ، آخرین کارهایی که باید انجام دهیم در دیدگاه ها است. در داخل کاربران/Views.py ، اجازه دهید برای تأیید آدرس ایمیل و اشتراک گذاری ، نمودارها را اضافه کنیم.

nano users/views.py

ابتدا واردات زیر را اضافه کنید. من چند مورد اضافی را پرتاب کردم تا بعداً دیگر نیازی به وارد کردن موارد بیشتر نداریم.

from .email import send_verification_email # حتماً عملکرد ارسال ایمیل تأیید را وارد کنید

شما ممکن است در حال حاضر برخی از این واردات را داشته باشید ، اما تکرار آنها ضرری ندارد. شما نیاز به وارد کردن عملکرد ارسال نامه الکترونیکی تأیید و همچنین Account_activation_token از کاربران. tokens ، از جمله سایر واردات.

اکنون ، در پایین پرونده ، کد زیر را اضافه کنید:

        # اشتراک آنها
    # در غیر این صورت به صفحه ورود به سیستم هدایت می شود
# SendWelcomeMail (درخواست ، کاربر)

این کد زیادی است. بیایید آن را تجزیه کنیم. اولین کارکرد ، تمیز و ساده ، کاربر را از لیست پستی اشتراک می کند. عملکرد دوم ایمیل آنها را فعال می کند ، و متوجه خواهید شد که من یک تابع نظر داده شده ، SendwelcomeAmail را اضافه کردم. شما از استفاده از یک الگوی ایمیل و تعریف عملکرد برای ارسال ایمیل خوش آمدید استقبال می کنید ، من هنوز هنوز. آخرین عملکردی که من به آن انداختم مهم است ، زیرا ایمیل های فعال سازی منقضی می شوند. بنابراین ، ما باید برخی از زمان ها ایمیل فعال سازی را دوباره ارسال کنیم. ما می توانیم از یک فرم اساسی برای این کار استفاده کنیم و برای ارسال ایمیل تأیید تماس بگیرید. قبل از انجام این کار ، با افزودن یک تماس عملکردی به نمای ثبت ، اطمینان حاصل کنیم که در وهله اول ارسال می شود. این خط را درست قبل از تغییر مسیر در نمای ثبت ، ثبت نام DEF ، در کاربران/بازدیدها اضافه کنید.

nano users/views.py
# … (بعد از) DEF Register (درخواست):
# … (قبل) تغییر مسیر (

نیازی به اضافه کردن اولین و آخرین خطوط موجود در آن قطعه کد نیست ، فقط مطمئن شوید که نمای ثبت ایمیل ایمیل تأیید را به کاربر ارسال می کند. باید اینگونه به نظر برسد:

# … واردات
            send_verification_email(user) # حتماً این خط را اضافه کنید!

اکنون ، برای ارسال مجدد ایمیل فعال سازی ، باید یک فرم اضافه کنیم. در کاربران/فرم ها ، فرم زیر را اضافه کنید:

# … (واردات)

ما همچنین به یک الگوی مربوط به این فرم فعال سازی ایمیل ارسال مجدد نیاز خواهیم داشت. بیایید این الگوی را اضافه کنیم. پرونده را ویرایش کنید:

nano users/templates/users/resend_activation.html

بعد ، کد زیر را به پرونده اضافه کنید.

وو ، خیلی زیاد است! اکنون ، هنگامی که ما کد را به سرور خود مستقر می کنیم ، می توانیم ایمیل HTML را ارسال کنیم و حساب کاربری را با کلیک در ایمیل فعال کنیم. ما همچنین ممکن است بخواهیم یک ایمیل خوش آمدید ارسال کنیم ، بنابراین بیایید ببینیم چگونه این کار را انجام دهیم. به کاربران/email.py برگردید ، کد زیر را اضافه کنید:

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

همچنین ، ما به یک الگوی نیاز خواهیم داشت تا تمام این اطلاعات را ارائه دهیم. در وب سایت من ، این الگوی زیر به نظر می رسد ، اما شما خوشحال هستید که هرچند دوست دارید آن را قالب بندی کنید.

توجه داشته باشید که ما برچسب های بسته یا HTML را نداریم ، زیرا وقتی پیوند نامشخص HTML را اضافه می کنیم ، این موارد را اضافه می کنیم. اینها مهم هستند ، اما ما نمی خواهیم آنها را دو بار تعریف کنیم.

خوب بعد چیست؟ ما مسیری طولانی را طی کرده ایم. واقعاً ، ما باید آماده استقرار سایت در یک سرور باشیم. ما می توانیم دکوراتور Login_Required را اضافه کنیم و نظرات خود را ایمن کنیم ، از ثبت نام کاربر ، ارسال ایمیل سازگار و اطلاعات حافظه پنهان استفاده کنیم ، این مبنای کاری است که یک وب سایت برای حفظ ارتباط باید انجام دهد. ما چند ویژگی مفید دیگر را اضافه خواهیم کرد ، و سپس پایه ای برای استقرار کد خود در یک سرور از راه دور ، تنظیم سرور پستی ، پیکربندی دامنه و فیلترها ایجاد خواهیم کرد تا سایت ما امن و مناسب شود.

ما همچنین به نمای تنظیم مجدد رمز عبور نیاز خواهیم داشت ، بنابراین بیایید آن را خیلی سریع اضافه کنیم. Django ساخته شده در بازنشانی گذرواژه در برخی از کارکردها شکسته شده است ، اما ما به بررسی نحوه نوشتن نمای خود ، الگوی ایمیل ، فرم ها و الگوهای URL خواهیم پرداخت. در اینجا نمایش به نظر می رسد ، در کاربران/نمایش ها

# ... واردات

این فرم به Django ساخته شده است ، اما ما به الگویی برای تأیید تنظیم مجدد رمز عبور ، کاربران/قالب ها/کاربران/رمز عبور_RESET_CONFIRM.HTML نیاز خواهیم داشت.

ما همچنین یک الگوی برای ارسال ایمیل بازنشانی رمز عبور ، با یک فرم ساده ، در کاربران/قالب ها/کاربران/رمزعبور_reset.html داریم

الگوی ایمیل به خودی خود ساده است ، این یک پرونده اساسی HTML است که پیوندی برای تنظیم مجدد رمز عبور ، در کاربران/قالب ها/کاربران/گذرواژه_RESET_EMAIL.html ارائه می دهد. Django به طور خودکار این پرونده را تفسیر می کند.

ما همچنین به دو الگوی دیگر احتیاج خواهیم داشت. اولین مورد تأیید ارسال ایمیل است. نماهای مربوط به اینها در حال حاضر در جنگو است ، بنابراین ما فقط باید در urls.py به آنها خطاب کنیم. این الگوی در کاربران/الگوها/کاربران/گذرواژه_RESET_DONE.html قرار دارد

و در آخر ، برای تأیید اینکه بازنشانی رمز عبور کامل است ، کاربران/الگوها/کاربران/گذرواژه_RESET_COMPLETE.html

اکنون ، ما برای این دیدگاه ها به الگوهای URL نیاز داریم. در کاربران/urls.py ، الگوهای URL زیر را اضافه کنید:

    # ... URL های قبلی اینجا

چهار الگوی ، خیلی زیاد است! اما اکنون می توانیم حتماً بتوانیم رمز عبور کاربر را هر زمان که بخواهیم ، همه از مرورگر وب مجدداً تنظیم کنیم.

من می دانم که این کد زیادی است. اگر کمی بالای سر شما به نظر برسد ، اشکالی ندارد. شما پیشرفت خواهید کرد ، درک شما بهبود می یابد و خیلی زود با کد بسیار صالح تر می شوید. اگر کاملاً گم شده اید ، توصیه می کنم بعداً پس از کار بر روی یک برنامه خود یادگیری برای کدگذاری آنلاین ، بعداً به این نرم افزار برگردید. اینها معمولاً برای شروع کار رایگان هستند و هنگام بازگشت به این پروژه ، هر آنچه را که برای موفقیت لازم دارید ، راهنمایی می کند. اگر احساس می کنید آماده ادامه ، خواندن هستید ، در مرحله بعد ، ما استفاده از کد شما را به یک سرور از راه دور و تنظیم سرور پستی و همچنین خودکار سازی استقرار خود با استفاده از Bash پوشش خواهیم داد تا همیشه بتوانید یک پروژه جدید را با چند دستور ساده تنظیم کنید.

آخرین کاری که ما باید قبل از استقرار در یک سرور از راه دور انجام دهیم این است که سایت ما کمی امن تر شود. متوجه خواهید شد که نمای ورود فقط نام کاربری و رمز عبور را به خود اختصاص می دهد ، و هیچ گونه احراز هویت چند عامل یا کد یک بار وجود ندارد. این یک رفع آسان است و با همان کد می توانیم سایت خود را ارسال کنیم پیام های متنی را ارسال کرده و حتی به پیام های متنی ارسال شده به سرور پاسخگو باشد. برای شروع ، ما به مدل های کاربر باز می گردیم و یک امضا کننده Timestamp را اضافه می کنیم که نشان دهنده هر ورود است. ما همچنین یک شناسه منحصر به فرد و چرخان را به مدل کاربر اضافه خواهیم کرد که برای اضافه کردن امنیت اضافی به ورود به سیستم ما استفاده می شود. ویرایش مدلهای کاربر ، کاربران/مدل ها. کد زیر را اضافه کنید:

# حتماً UUID ، Timestamp Signer و URL Generator (معکوس) را وارد کنید
    # این کد را اینجا اضافه کنید
    # و این عملکرد را اضافه کنید
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # برای 3 دقیقه معتبر است

علاوه بر نظرات (کد روی خطوط با #) ​​اطمینان حاصل کنید که کاربران/models.py به نظر می رسد. با شکستن این ، ساده است. ما چند واردات داریم ، یک TimeStampSigner که یک ابزار رمزنگاری است که می تواند یک کد ایمن ایجاد کند و آن را تأیید کند تا اطمینان حاصل شود که معتبر است ، فقط یک بار مورد استفاده قرار گرفته است و از تعداد مشخصی نیز پیرتر نیست. ما همچنین از UUID استفاده می کنیم ، که یک شناسه منحصر به فرد است که کاربر ما را در امضای توکن و در URL که نشانه به کاربر ارسال می شود ، شناسایی می کند. ما از این رمزنگاری اساسی برای ایجاد یک نمای احراز هویت دو عامل استفاده خواهیم کرد. قبل از انجام کار دیگری ، بیایید مهاجرت ها را اجرا کنیم تا مدل های کاربر ما به روز شوند. در دایرکتوری با Manage.py ، دستورات زیر را برای انجام و تکمیل مهاجرت ها اجرا کنید.

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

این مهم است زیرا هر بار که در مدل ها تغییراتی ایجاد می کنیم ، قبل از اینکه بتوانیم از مدل ها استفاده کنیم ، باید جداول را ایجاد کرده و پایگاه داده را با پیش فرض به روز کنیم.

در مرحله بعد ، اجازه دهید نمای ورود به سیستم خود را برای هدایت به یک نمای احراز هویت ثانویه بداهه ریزی کنیم. در کاربران/Views.py ، عملکرد ورود به سیستم را حذف کرده و به URL که فقط در مدل های کاربر ایجاد کرده ایم ، هدایت کنید.

# … واردات
        if user and user.profile.can_login < timezone.now(): # توجه داشته باشید که اکنون بررسی می کنیم که آیا کاربر می تواند وارد سیستم شود
            # عملکرد auth_login را که در اینجا بود حذف کنید
                return redirect(user.profile.create_auth_url()) # توجه داشته باشید که ما در اینجا به یک URL جدید هدایت می شویم
            else: # اگر کاربر از تأیید اعتبار چند عاملی استفاده نمی کند ، فقط آنها را وارد کنید.
        else: # اگر ورود موفقیت آمیز نبود ،
            user = User.objects.filter(username=username).first() # این بخشی است که ما نمایه کاربران را به روز می کنیم
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # بنابراین آنها نمی توانند برای چند ثانیه دوباره وارد سیستم شوند

بنابراین این بسیار ساده است ، ما اکنون راهی برای هدایت به نمای احراز هویت دو عامل هنگام ایجاد آن داریم. ما همچنین در صورت عدم اضافه کردن شماره تلفن ، یک برگشتی داریم. ما یک نمای اصلی را اضافه خواهیم کرد تا به زودی یک شماره تلفن اضافه کنیم و به زودی با یک پیام متنی وارد شوید.

اول ، ما به یک روش آسان برای ارسال پیام متنی از کد خود نیاز داریم. برای انجام این کار ، ما می توانیم تعدادی از API ها را انتخاب کنیم ، اما به نظر من ساده ترین مورد Twilio است. آنها همچنین قیمت های خوبی را برای پروژه های کوچکتر و همچنین تخفیف های فله ارائه می دهند. یک حساب کاربری در Twilio.com ایجاد کنید ، جزئیات مربوط به پروژه خود را پر کنید ، یک شماره تلفن بخرید و کلیدهای API خود را در Settings.py خود کپی کنید. سپس این کد را در زیر یک پرونده جدید ، کاربران/sms.py اضافه کنید.

nano users/sms.py
# تمام بسته های لازم را وارد کنید
# این کد متن را با Twilio ارسال می کند
# یک تابع یاور برای به دست آوردن شماره ای با این رقم های زیاد
# برای تأیید کاربر متن را ارسال کنید
# با این عملکرد متنی را به کاربر ارسال کنید
# با این عملکرد کد را تأیید کنید
# اعتبار را تأیید کنید

حتماً تنظیمات خود را به طور مناسب تغییر دهید و این خطوط را با کلیدهای خود اضافه کنید:

# حتماً این موارد را از داشبورد Twilio خود کپی کنید
AUTH_VALID_MINUTES = 3 # تعداد دقایقی که صفحه TFA یک بار فعال می شود

اول ، ما برای دو دیدگاه احراز هویت خود به فرم ها نیاز خواهیم داشت. ویرایش کاربران/forms.py ، کد زیر را اضافه کنید.

# … واردات
# فرم برای وارد کردن شماره تلفن ما
# فرم برای تأیید اعتبار

در مرحله بعد ، بیایید نماها را در کاربران/نمایش ها ایجاد کنیم.

# … واردات

ما همچنین برای هر دو دیدگاه به الگوهای نیاز خواهیم داشت. بیایید ابتدا الگوی MFA را اضافه کنیم.

nano users/templates/users/mfa.html

این کد HTML را به الگوی اضافه کنید

این کاملاً توضیحی است. فرم یا کد یا کد خالی را ارسال می کند ، و در صورت دریافت کد خالی ، کد را ارسال می کنیم. سپس ما فقط دو دکمه ارسال داریم و به این ترتیب می توانیم کد را با هر دکمه ارسال کنیم. در مرحله بعد ، یک فرم ساده برای اضافه کردن شماره تلفن اضافه خواهیم کرد.

nano users/templates/users/mfa_onboarding.html

HTML زیر را اضافه کنید:

این فرم بسیار ساده تر است ، فقط فرم شماره تلفن را که ما ایجاد کرده ایم ارائه می دهد و به کاربر اجازه می دهد شماره تلفن را اضافه کند.

این واقعا خوب به نظر می رسد! تا زمانی که همه چیز به درستی تنظیم شده باشد ، باید بتوانیم پیام ارسال کنیم و به محض اضافه کردن الگوهای URL ، کاربر را با شماره تلفن خود وارد کنیم. آخرین چیزی که ما باید تنظیم کنیم نمای پروفایل است ، بنابراین می توانیم اطمینان حاصل کنیم که کاربر می تواند شماره تلفن خود را بدون ورود به سیستم تغییر دهد. همچنین ، در نهایت ما می خواهیم گزینه "Stop to Down" را اضافه کنیم ، بنابراین کاربر می تواند متن را برای انتخاب پیام های متنی آینده "متوقف کند".

بیایید یک نمای نمایه را به کاربران/Views.py اضافه کنیم. این نمای بیوگرافی ، ایمیل ، نام کاربری و شماره تلفن کاربر را به روز می کند و همچنین به ما امکان می دهد تا احراز هویت چند عامل را فعال کنیم. اول ، ما به دو شکل دیگر در کاربران/فرم ها نیاز خواهیم داشت.

# ... واردات

در مرحله بعد ، ما می توانیم منظره ای برای استفاده از هر دو فرم ایجاد کنیم. کاربران/بازدیدها را ویرایش کنید و در نمای اضافه کنید.

# این واردات را اضافه کنید

برای این دیدگاه نیز به یک الگوی نیاز خواهیم داشت.

nano users/templates/users/profile.html

متوجه خواهید شد که این یک شکل نسبتاً ساده است ، اما برخی از جاوا اسکریپت در آن وجود دارد که به طور خودکار محتوای فرم را به روز می کند. داشتن این مفید است ، بنابراین شما قادر به ایجاد ویرایش هستید بدون اینکه هر بار ارسال کنید ارسال کنید.

در مرحله بعد ، ما به URL هایی نیاز داریم که همه این دیدگاه ها را در برنامه های URL USER به نمایندگی از آن نشان دهیم. کاربران/urls.py را ویرایش کنید و این کد را اضافه کنید:

# … کد قبلی ، واردات
# … الگوهای URL که قبلاً وارد آن شدیم ، سه خط بعدی را اضافه کنید

اکنون زمان خوبی برای آزمایش پروژه ما است. اما ابتدا ، بیایید نسخه پشتیبان دیگری را اجرا کنیم.

backup

و سرور را اجرا کنید. قبل از اعزام به سرور لینوکس ، ایده خوبی است که بتوانید احراز هویت دو عامل را در حساب فعال کنیم. ما این کار را به URL پروفایل ،/کاربران/نمایه/و بررسی کادر برای فعال کردن تأیید اعتبار پس از وارد کردن شماره تلفن و سپس ارسال فرم انجام خواهیم داد.

python manage.py runserver localhost:8000

با مراجعه به مرورگر وب خود به صفحه وب مراجعه کنید ، من در این مثال از Google Chrome استفاده می کنم و وارد URL https: // localhost: 8000/حساب/پروفایل/

در صورت لزوم قادر خواهید بود وارد سیستم شوید و دو عامل تأیید را فعال کنید.

این پروژه برای اجرای آن به سرور نیاز دارد تا واقعاً بتواند نامه ارسال کند. اما اول ، ما به راهی برای دیدن خطاها نیاز داریم. متوجه خواهید شد که اگر سرور را در حالت اشکال زدایی اجرا کنید ، با Settings.Debug برابر با True ، سرور به طور خودکار خطاها را نشان می دهد. برای نشان دادن خطاها بدون استفاده از حالت اشکال زدایی ، که در سرور تولید ناامن است ، باید برای آن نمای اضافه کنیم. مهمترین خطاهایی که ما باید بتوانیم برطرف کنیم عبارتند از:

خطا 500 - مشکلی در کد ما خطای 404 - صفحه ای که پیدا نشده است (URL شکسته) خطا 403 - یک مجوز از خطا رد شد

بیایید یک برنامه جدید برای رسیدگی به این خطاها به نام خطاها اضافه کنیم.

python manage.py startapp errors

همانطور که قبلاً انجام دادیم ، این کار را به تنظیمات اضافه کنید.

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

این تنها چیزی است که ما علاوه بر نماهای خطا ، الگوها و کمی میان افزار نیاز داریم. بیایید آنها را به این ترتیب تعریف کنیم:

# نظرات خود را در اینجا ایجاد کنید.

در مرحله بعد ، اجازه دهید میان افزار را برای رسیدگی به این خطاها تعریف کنیم. ما این کار را با اضافه کردن ابتدا به middleware_classes در تنظیمات.py ، با نام وسط ما انجام خواهیم داد.

    # ... میان افزار قبلی

در مرحله بعد ، اجازه دهید میان افزار را اضافه کنیم.

from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

class ExceptionVerboseMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        _error.value = traceback.format_exc()

def get_current_exception():
    try:
        return _error.value
    except AttributeError:
        return None

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')

ما یک تابع را برای به دست آوردن استثناء فعلی با استفاده از یک محلی محلی اضافه می کنیم ، که به ما کمک می کند هرگونه خطایی را در کد خود ردیابی کنیم. از نظر قالب ها ، ما فقط به یک مورد نیاز داریم ، زیرا ما به صورت پویا عنوان را در نمای تعریف می کنیم. این الگوی فقط باید عنوان و "ردیابی" را ارائه دهد ، ردیابی خطای ما از متن.

nano errors/templates/errors/error.html

این ساده ترین الگوی ما هنوز است ، اما دیدن خطاهای پروژه ما به این آسان است. بعد ، بیایید اشکال زدایی را در تنظیمات غیرفعال کنیم.

nano app/settings.py

این خط را در جایی پیدا کنید که روی آن تنظیم شده باشد ، و آن را به False تغییر دهید

DEBUG = False

پیش بروید و اکنون از برنامه پشتیبان تهیه کنید. ما آماده استقرار به یک سرور از راه دور لینوکس هستیم و ویژگی های آن را از آنجا اضافه می کنیم.

sudo backup

قبل از ارسال این کد به یک سرور ، باید در نظر بگیریم که ممکن است برخی از مشکلات مربوط به کد وجود داشته باشد. بسته به این مورد ، سایت هایی که اطلاعات ارسال شده برای آنها را می پذیرند ، در مورد ارسال هرزنامه و مشکل در حذف هرزنامه مشکل دارند. این نباید بلافاصله اتفاق بیفتد ، اما اگر این اتفاق بیفتد ، بعداً بررسی خواهیم کرد که چگونه به طور خودکار اسپم را در سایت تعدیل کنیم و دسترسی به روبات ها را به سایت سخت تر کنیم ، به همراه نحوه غیرفعال کردن حساب های کاربری و تأیید هویت کاربر با اسکن شناسه یا اسکن بیومتریک ، مانند اثر انگشت یا تشخیص چهره.

با نگاهی به مثال احراز هویت چند عامل ، که در تولید آن را بررسی کردیم ، همه چیز می تواند متفاوت باشد. توجه کنید که چگونه ما محدوده ورود به سیستم و نشانه های منقضی شده است. اگر روبات ها به یک سایت دسترسی پیدا کنند ، احراز هویت دو عامل می تواند دشوارتر باشد زیرا ممکن است همزمان کدها را وارد کنید. برای مقابله با این ، بیایید از یک مدل در مدل های کاربر استفاده کنیم و اعلام کنیم که چگونه با استفاده از احراز هویت چند عامل با شماره تلفن تأیید می کنیم. ما همچنین گزینه ای برای تأیید اعتبار با ایمیل اضافه خواهیم کرد. با ویرایش مدل های کاربر با نانو شروع کنید.

nano users/models.py

این همان چیزی است که مدلی که ما اضافه می کنیم باید به نظر برسد. ما به هیچ روش ، فقط متغیرهایی برای ذخیره شناسه ، کاربر ، زمان بندی ، انقضا ، طول و تلاش در برابر هرگونه احراز هویت چند عامل (کدی مانند 123456 ارسال شده به تلفن یا ایمیل) احتیاج نداریم.

# یک نشانه اساسی که برای ورود به وب سایت استفاده می شود

بیایید همچنین یک امتیاز به کاربر خود اضافه کنیم ، و ما هم اکنون آن را به صورت دستی تنظیم خواهیم کرد ، قبل از اینکه در نهایت به طور خودکار برای ثبت نام کاربران ممتاز مهاجرت کنیم. در مدل های کاربر ، این خط را در نمایه اضافه کنید:

    vendor = models.BooleanField(default=False)

مانند هرگونه تغییر در پایگاه داده ، ما باید هر زمان که یک فایل Model.py را در Django ویرایش کنیم ، مهاجرت کرده و به پایگاه داده مهاجرت کنیم. به یاد داشته باشید ، برای این کار ابتدا از منبع استفاده می کنیم (اگر از زمان باز شدن ترمینال استفاده نشده است) و سپس Python Manage.py برای انجام مهاجرت و مهاجرت.

cd project-directory-you-named # (در صورت لزوم)

در حال حاضر ، می توانید با استفاده از پوسته ، هر حساب را که به عنوان فروشندگان ایجاد کرده اید ، ثبت کنید.

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

حال ، بیایید دیدگاه احراز هویت چند عاملی خود را برای استفاده از این نشانه تکامل دهیم. اول ، ما باید آب و برق یاور MFA خود را اصلاح کنیم. با استفاده از نانو ،

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

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# کاربر را با استفاده از ایمیل یا شماره تلفن خود تأیید کنید
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # نشانه را بر اساس مقدار منتقل شده در URL فیلتر کنید (یک UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # اگر این جلسه ایجاد نشده است ، آن را ایجاد کنید
    user = User.objects.filter(id=token.user.id).first() # کاربر را از Token دریافت کنید
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # اگر قبلاً تأیید شده اند ، آنها را وارد کنید
    if not user: raise PermissionDenied() # اگر هیچ کاربر پیدا نشد ، انکار کنید
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # نشانه AUTH را بررسی کنید
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # اگر قبلاً وارد سیستم نشده اند وارد کاربر شوید
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # در مورد احراز هویت چند عامل خود انقضاء کنید
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # کاربر را به صفحه بعد هدایت کنید
    if not user.profile.mfa_enabled: # بررسی کنید که آیا MFA فعال است
        if not check_verification_time(user, token): # زمان را بررسی کنید
            user.profile.mfa_enabled = False # شماره تلفن را پاک کنید
            user.profile.enable_two_factor_authentication = True # MFA را فعال کنید
            user.profile.phone_number = '+1' # شماره تلفن را غیرفعال کنید
            user.profile.save() # نمایه را ذخیره کنید
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # اگر MFA آنها فعال نشده باشد ، کاربر را وارد کنید
    if request.method == 'POST' and not fraud_detect(request, True): # اگر درخواست درخواست پست است
        form = TfaForm(request.POST) # فرم را فوری کنید
        code = str(form.data.get('code', None)) # کد را دریافت کنید
        if code and code != '' and code != None: # مطمئن شوید که خالی نیست
            token_validated = user.profile.check_auth_token(usertoken) # نشانه AUTH را بررسی کنید
            is_verified = check_verification_code(user, token, code) # کد را بررسی کنید
            if token_validated: # اگر همه چیز
                if is_verified: # به ترتیب است
                    user.profile.mfa_enabled = True # MFA را فعال کنید (اگر قبلاً فعال نشده است)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # وارد کاربر شوید
                    for key, value in request.GET.items(): # ایجاد یک پرس و جو برای پارامتر بعدی (در صورت وجود)
                        return HttpResponseRedirect(next) # تغییر مسیر دادن
            elif not token_validated: # اگر نشانه نامعتبر بود
            if p.mfa_attempts > 3: # اگر تلاش های زیادی انجام شد
            if form.data.get('send_email', False): # ارسال ایمیل (یا متن)
    # فرم را ارائه دهید (برای درخواست دریافت)

هنگامی که ما در این کد اضافه می کنیم ، حتماً عملکرد را برای ارسال ایمیل وارد کنید. در بالای پرونده ، کاربر مشاهده می کند (با سایر واردات) ، اضافه کنید

from .mfa import send_verification_email as send_mfa_verification_email

حال ، ما باید قبل از این که هر یک از این کار را انجام دهد ، آن عملکرد را بنویسیم. این باید عملکرد ایمیل ارسال ما را گسترش دهد و به سادگی با کد تأیید یک ایمیل برای کاربر ارسال کند.

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

بنابراین این همه بسیار عالی است ، اکنون ما یک سیستم تأیید اعتبار چند عامل داریم که برای ورود به سیستم به شماره تلفن یا ایمیل بستگی دارد. اما ما همچنین به راهی برای حذف نیاز داریم یا حداقل کاربرانی را که با شرایط ما همکاری نمی کنند مخفی کنیم. اینها می توانند هرزنامه ، روبات یا هر کسی باشند که برای کار ما خوب نیست. نگاهی به نمای من برای نظارت بر کاربران در وب سایت خود بیندازید:

# وارد کردن
from .tests import is_superuser_or_vendor # ما باید این آزمون را ایجاد کنیم
    # لیست کاربران را دریافت کنید
    return render(request, 'users/users.html', { # کاربران را در یک الگوی برگردانید

توجه داشته باشید که این کد از یک آزمایش استفاده می کند ، ما باید این آزمایش را در یک پرونده tests.py اعلام کنیم و آن را وارد کنیم. ویرایش کاربران/tests.py ، بیایید آزمون را ایجاد کنیم.

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

این در رابطه با الگوی کاربران/کاربران است. html ، که چیزی شبیه به این است:

توجه داشته باشید که این الگوی شامل یک الگوی دیگر ، کاربران/user.html. هنگام استفاده از الگویی که دارای یک زیرنویس است و از آن استفاده نمی کند ، ایده خوبی برای اضافه کردن یک زیرکانه است () قبل از اینکه نام پرونده گسترش یابد ، به منظور تمایز الگوها.

توجه داشته باشید که این Jinja زیادی است ، شما ممکن است همه این متغیرها را تعریف نکنید. اما این همان چیزی است که کد من به نظر می رسد.

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

ما همچنین به یک زیرنویس دیگر ، toggle_active.html نیاز داریم. این الگوی باید شکلی باشد که به ما امکان می دهد که آیا کاربر فعال است یا خیر.

ما همچنین باید برای تغییر فعالیت کاربر و الگوهای URL مناسب ، منظره ای اضافه کنیم. در حالی که ما در آن هستیم ، در صورت نیاز به آن ، اجازه دهید یک کاربر را حذف کنیم.

# وارد کردن
    success_url = '/' # تغییر مسیر در URL موفقیت
    def test_func(self): # اگر کاربر Superuser است و اجازه حذف را دارد تست کنید

اگرچه این کار در صورت لزوم عملی است ، حذف کاربر نباید بیشتر اوقات لازم باشد ، ما فقط می توانیم دید کاربرانی را که از سایت بازدید می کنند در صورت نیاز به اخراج آنها ، تغییر دهیم.

الگوهای URL که ما اضافه کردیم به نظر می رسد. با نانو ، کاربران/urls.py را ویرایش کنید و این خطوط را اضافه کنید:

nano users/urls.py

خطوط باید قبل از پایان "]" "[" ["[" در لیست مسیرهای موجود در نمای کاربر قرار بگیرند.

# …
# …

اکنون ، مطمئن شوید که از سایت نسخه پشتیبان تهیه کنید تا بتوانید آن را در سرور وب که ما به کار خود ادامه خواهیم داد ، بارگیری کنید. از خط فرمان ،

sudo backup

اکنون از سایت ما پشتیبان گرفته شده است.

بنابراین اکنون ما چند ویژگی مفید دیگر داریم. اما در مورد تصویر بزرگ اینجا چطور؟ این کد هنوز از اینترنت در دسترس نیست ، ما هنوز سرور پستی نداریم ، و ما باید برنامه خود را گسترش دهیم تا شامل فرآیند تأیید جامع و همچنین طرح بندی های صاف برای کمک به ما در کشف سایت ، به همراه پروتکل های ایمن برای تأیید اعتبار کاربران ممتاز باشد.

ما به این همه خواهیم رسید. مهمترین چیز در حال حاضر فقط دریافت این کد به صورت آنلاین است که می توانیم فقط با چند خط Bash در سرور اوبونتو انجام دهیم. برای این کار باید سرور را اجاره کنید ، مگر اینکه سرور در خانه و اشتراک اینترنت تجاری داشته باشید که به شما امکان باز کردن پورت ها را می دهد. من شخصاً وب سایت خود را بر روی HP Z440 که در آپارتمان من نصب شده است ، اجرا می کنم ، اما معمولاً برای نیازهای اساسی برای اجاره یک سرور خصوصی مجازی (VPS) بسیار ارزان تر است.

به خاطر داشته باشید که کدی که اکنون در حال اجرا هستیم نسبتاً نازک است ، قبل از آماده شدن برای استفاده از آنچه برای ساخت یک محصول آماده هستیم ، باید حفظ و بهبود یابد. حتماً مراقب باشید که با اینترنت چه کاری انجام می دهید ، اطمینان حاصل کنید که آیا این سایت را به صورت عمومی به وب در سرور لینوکس مستقر می کنید ، برنامه ای برای جلوگیری از تعامل ناخواسته با وب سایت خود دارید. این احتمالاً در ابتدا مشکلی نخواهد بود ، اما ما به دنبال راه حل های مختلفی برای مقابله با این ، از جمله یادگیری ماشین ، هوش مصنوعی و دید رایانه خواهیم بود. هنگامی که این مسئله به یک مشکل تبدیل شد ، برای یک راه حل در این متن بیشتر جستجو کنید.

از نظر اجاره VPS ، مکان های زیادی وجود دارد که می توانید بروید. Google Cloud دارای سرورهای VPS ، Ionos ، Kamatera ، Amazon AWS و ارائه دهندگان بیشتر راه حل های سرور ابری ارائه می دهد که متناسب با نیازهای ما باشد.

شما باید از طریق فرم های آنها کلیک کنید و برنامه ای را برای شروع انتخاب کنید. شما می توانید با یک برنامه اصلی با هر ارائه دهنده بروید ، اما اطمینان حاصل کنید که ارائه دهنده به شما امکان می دهد درگاه های سرور پورت نامه را برای ارسال ایمیل باز کنید (این باید پورت 587 و پورت 25 باشد) ، برخی از ارائه دهندگان این پورت ها را مسدود می کنند. تاکنون بهترین تجربه را با Ionos و Kamatera داشته ام ، هر دو به من اجازه می دهند ایمیل نامحدودی ارسال کنم و قیمت گذاری آنها بسیار ارزان است.

شما می توانید از طریق پروتکل به نام SSH یا Secure Shell به سرور جدید خود متصل شوید ، که به شما امکان می دهد از طریق رایانه شخصی خود دقیقاً مانند رایانه شخصی خود با سرور ارتباط برقرار کنید. هنگامی که سرور را تنظیم می کنید ، ارائه دهنده میزبان احتمالاً از شما می خواهد یک کلید SSH اضافه کنید ، یا آنها نام کاربری و رمز عبور را به شما می دهند. کلید SSH نحوه ورود به سرور از خط فرمان برای ویرایش کد است. برای تولید یک کلید SSH از گزینه های زیر SSH-keygen استفاده کنید.

ssh-keygen

در صورت نیاز ، پرونده را ذخیره کرده و آن را بازنویسی کنید ، خوب است که اگر قبلاً این کار را نکرده اید ، کلیدهای SSH خود را بچرخانید. اکنون می توانید از دستور زیر برای دیدن کلید SSH خود استفاده کنید. شما می خواهید آن را در سرور از راه دور خود کپی کنید تا بتوانید از آن برای تأیید اعتبار استفاده کنید.

cat ~/.ssh/id_rsa.pub

اگر هنگام تایپ کردن آن دستور ، قادر به دیدن یک کلید SSH نبودید (یک رشته طولانی از رقم و حروف شروع شده از "SSH-RSA AAA") ، سعی کنید یک کلید RSA ایجاد کنید (آنها امن تر هستند ، بنابراین من توصیه می کنم از آنها استفاده کنید.) کد زیر یک کلید RSA SSH 4096 ایجاد می کند.

ssh-keygen -t rsa -b 4096

یک VPS در حال اجرا اوبونتو ایجاد کنید ، با این حال شما قصد انجام این کار را دارید. پس از ایجاد VPS با کلیک بر روی فرم های موجود در وب سایت ارائه دهندگان (kamatera.com ، ionos.com یا مشابه) ، می خواهید وارد شوید. برای انجام این کار ، از دستور SSH با آدرس IP خود استفاده کنید (آدرس که مانند xx.xx.xx.xx). همچنین باید به نام کاربری پیش فرض در سرور ایجاد شده ، به عنوان مثال اوبونتو حساس باشید.

ssh ubuntu@XX.XX.XX.XX

ممکن است از شما خواسته شده باشد ، اگر از شما خواسته شده است ، آن را وارد کنید ، آن را وارد کنید. ما از نام کاربری پیش فرض استفاده نمی کنیم ، بنابراین بیایید با ایجاد یک کاربر جدید و اضافه کردن یک کلید SSH به حساب آنها شروع کنیم.

بیایید با اضافه کردن یک فایل جدید SSHD_CONFIG شروع کنیم ، که به سرور می گوید چگونه از SSH استفاده کند.

nano sshd_config
# این پرونده پیکربندی گسترده سیستم سرور SSHD است.  دیدن
# SSHD_CONFIG (5) برای اطلاعات بیشتر.
# این SSHD با PATH =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games گردآوری شده است.
# استراتژی مورد استفاده برای گزینه ها در پیش فرض SSHD_CONFIG ارسال شده
# Openssh برای مشخص کردن گزینه ها با مقدار پیش فرض آنها در کجا است
# ممکن است ، اما آنها را اظهار نظر کنید.  گزینه های غیرقانونی غلبه بر
# مقدار پیش فرض
# بندر 22
# آدرس خانواده
# ListerAddress 0.0.0.0
# ListerAddress ::
# Hostkey/etc/SSH/SSH_HOST_RSA_KEY
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# رمزها و کلیدنگ
# rekeylimit پیش فرض
# ورود به سیستم
# syslogfacility auth
# اطلاعات ورود به سیستم
# احراز هویت:
# logingracetime 2m
# permitrootlogin ممنوع است
# strictmodes بله
# MaxAuthtries 6
# حداکثر 10
# انتظار داشته باشید .ssh/just_keys2 در آینده به طور پیش فرض نادیده گرفته شود.
# هیچ یک از آنها
# مجاز به keyscommand هیچ
# مجاز به Keyscommanduser هیچ کس
# برای این کار شما نیز به کلیدهای میزبان در/etc/ssh/ssh_known_hosts نیاز خواهید داشت
# میزبان میزبان نه
# اگر به ~/.ssh/ynows_hosts برای بله اعتماد نکنید ، به بله تغییر دهید
# میزبان
# نادیده گرفتن
# پرونده های ~/.rhosts و ~/.shosts کاربر را نخوانید
# نادانی بله
# برای غیرفعال کردن رمزهای عبور متن تونل شده ، به هیچ چیز در اینجا تغییر نکنید!
# promitemptypasswords خیر
# تغییر در بله برای فعال کردن رمزهای عبور چالش چالش
# برخی از ماژول ها و موضوعات PAM)
# گزینه های Kerberos
# kerberosauthentication نه
# kerberosorlocalpasswd بله
# KerberosticketCleanup بله
# kerberosgetafstoken no
# گزینه های GSSAPI
# gssapiauthentication خیر
# gssapicleanupcredentials بله
# gssapistrictacceptorcheck بله
# gssapikeyexchange no
# برای فعال کردن احراز هویت PAM ، پردازش حساب ، این را روی "بله" تنظیم کنید.
# و پردازش جلسه اگر این کار فعال شود ، احراز هویت PAM
# از طریق KBDinteractiveAuthentication مجاز است و
# رمز عبور.  بسته به پیکربندی PAM شما ،
# احراز هویت PAM از طریق KBDinteractiveAuthentication ممکن است دور بزند
# تنظیم "permitrootlogin بدون کلمه".
# اگر فقط می خواهید حساب PAM و چک جلسه بدون اجرا اجرا شود
# احراز هویت PAM ، سپس این کار را فعال کنید اما رمز عبور را تنظیم کنید
# و KBDinteractiveAuthentication به "نه".
# AllowAgentForwarding بله
# Allowtcpforwarding بله
# Gatewayports خیر
# x11displayoffset 10
# x11uselocalhost بله
# آنامیت بله
# printlastlog بله
# tcpkeepalive بله
# مجوز محیط
# فشرده سازی به تأخیر افتاد
# ClientAliveInterval 0
# ClientAliveCountMax 3
# استفاده نشده
# pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# permittunnel no
# chrootdirectory هیچکدام
# نسخه addendum هیچ
# بدون مسیر بنر پیش فرض
# به مشتری اجازه دهید متغیرهای محیط محلی را پشت سر بگذارد
# پیش فرض بدون زیر سیستم
# نمونه ای از تنظیمات اصلی بر اساس هر کاربر
# anoncvs کاربر را مطابقت دهید
# x11forwarding no
# Allowtcpforwarding no
# مجازات نه
# سرور CVS Forcecommand

به یاد داشته باشید ، ctrl+x و y برای ذخیره پرونده. در مرحله بعد ، بیایید یک اسکریپت اصلی به نام Initialize (All in Diretory Diretory Directory Of Home کاربر خود) بنویسیم.

nano initialize

این خطوط را به پرونده اضافه کنید ، جایگزین کنیدبا کلید SSH خود با استفاده از گربه پیدا کردید. (.ssh/id_rsa.pub)

# //سطل/bash

برای پیاده روی این پرونده ، بیایید خط به صورت خط شروع کنیم. خط اول به کامپایلر می گوید که این یک اسکریپت Bash است. سپس ما در حال نصب وابستگی ها ، کپی کردن SSHD_CONFIG در فهرست صحیح ، راه اندازی مجدد SSH ، تولید کلیدهای SSH برای ریشه ، اضافه کردن تیم کاربر (شما می توانید نامی را که دوست دارید برای این کار انتخاب کنید ، از دستور adduser با نام آنها و رمز عبور غیرفعال استفاده کنید). ما همچنین تیم را به گروه سودو اضافه می کنیم ، کلید SSH خود را تولید می کنیم ، کلید ما را به کلیدهای مجاز و آنها نیز اضافه می کنیم و کلید آنها را چاپ می کنیم. این کاربر جدید نحوه ورود به سایت خواهد بود.

در یک ترمینال جدید ، پیش بروید و دوباره سرور را باز کنید.

ssh team@XX.XX.XX.XX

شما این بار نیازی به رمز عبور ندارید ، زیرا یک کلید SSH دارید. ما همچنین برای ایمن تر نگه داشتن سایت ، ورود به سیستم را با گذرواژه غیرفعال کرده ایم.

اکنون ، این سرور کاملاً خالی و بدون اطلاعاتی در مورد آن شروع می شود. بیایید با کلون کردن پروژه خود از GIT شروع کنیم تا بتوانیم آن را در دستگاه از راه دور بارگیری و اجرا کنیم. روی سرور از راه دور متصل به SSH ، ابتدا کلید SSH خود را چاپ کنید:

cat ~/.ssh/id_rsa.pub

در مرحله بعد ، این کلید را در تنظیمات GIT مانند گذشته برای تنظیم مخزن GIT خود قرار دهید. اکنون ممکن است پروژه خود را مستقیماً به سرور کلون کنیم. اطمینان حاصل کنید که ابتدا از پروژه به صورت محلی نسخه پشتیبان تهیه کرده اید ، بنابراین در سرور GIT برای بارگیری است.

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

عالی اکنون همه پرونده ها در اینجا هستند. ما می توانیم آنها را با LS ببینیم

ls

حال ، بیایید شروع به تنظیم سرور کنیم. ابتدا دایرکتوری پروژه خود را در یک نام ساده و به یاد ماندنی که برای پروژه استفاده خواهیم کرد ، کپی کنید.

cp -r yourproject whatyoucalledit

جایی که "WhatyouCalledit" نام جدید پروژه شما است. در مرحله بعد ، ما برای تنظیم سرور باید یک ابزار اساسی بسازیم. ما این ابزار را ذخیره خواهیم کرد و در آینده از آن استفاده خواهیم کرد. برای ساختن این ابزار ، بیایید باینری کاربر ایجاد کنیم تا نحوه ویرایش یک اسکریپت را تعریف کنیم. با استفاده از BASH ، ویرایش/usr/bin/ascript

sudo nano /usr/bin/ascript

حتماً از Sudo در آنجا استفاده کنید تا مجوزهای ویرایش پرونده را داشته باشید. در پرونده ، این خطوط را اضافه کنید:

# //سطل/bash
    echo "# !/bin/bash ">>/usr/bin/1 $

به یاد داشته باشید این اسکریپت یک استدلال ، نام اسکریپت ، به عنوان 1 دلار می گیرد. ابتدا بررسی می کند که آیا پرونده وجود دارد یا در غیر این صورت آن را ایجاد می کند ، خط اول را برای اعلام اسکریپت اضافه می کند ، مجوزهای خود را تغییر می دهد ، آن را ویرایش می کند و نام خود را به /و غیره /نسخه هایی اضافه می کند که به ما امکان می دهد نام اسکریپت هایی را که در حال ایجاد هستیم ذخیره کنیم. اگر پرونده از قبل وجود دارد ، به سادگی مجوزها را تغییر داده و آن را ویرایش کنید. پرونده را ذخیره کنید و در مرحله بعد مجوزهای آن را تغییر خواهیم داد. تا زمانی که از این اسکریپت استفاده کنیم ، دیگر نیازی به انجام این کار نخواهیم داشت.

sudo chmod a+x /usr/bin/ascript

عالی حال بیایید یک اسکریپت به نام Setup ایجاد کنیم. اول ، نه اینکه شما را تحت الشعاع قرار ندهد ، بلکه نگاهی بیندازید که اسکریپت تنظیم من چگونه است. ما آنچه را که این اسکریپت باید در پروژه شما به نظر برسد ، طی خواهیم کرد ، شما برای شروع به همه چیز در اسکریپت من احتیاج نخواهید داشت.

# //سطل/bash
# sudo chmod a+x scripts/userEtup
# ./scripts/usersetup
# SSH-Keygen
# فهرست پروژه
# دستورات ورود به سیستم
# پیکربندی نانو
# پیکربندی گیت
# به روزرسانی و نصب
# آنتی ویروس Clamav را فعال کنید
# نام میزبان
# راه اندازی postgres
# تهیه نسخه پشتیبان از پایگاه داده
# iptables را غیرفعال کنید
# BitDefender را نصب کنید
# راه اندازی postfix
# DIRS ایجاد کنید
# تنظیم virtualenv
# وابستگی دریافت و ایجاد کنید
# قوانین فایروال را تنظیم کنید
# وابستگی های PYPI را نصب کنید
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# نصب پیپ OpenCv-Python == 4.5.5.64
# نصب پیپ OpenCV-Contrib-Python == 4.5.5.64
# Certbot را نصب کنید
# گواهی اجرا
# بارگیری مجدد سرور نامه
# کپی کردن گواهینامه ها
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# وصله
# تنظیمات کاربر را تنظیم کنید
# مجوزها را تنظیم کنید
# Sudo Chown -r Team: کاربران/var/run/
# root chown sudo: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: کاربران db.sqlite3
# پیکربندی را کپی کرده و مجوزها را تنظیم کنید
# پایگاه داده راه اندازی
# پیکربندی PAM را تزریق کنید و پیکربندی SSH را حذف کنید
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /پروفایل
# اسکریپت های سطل را کپی کرده و مجوزها را تنظیم کنید
# بارگیری مجدد و فعال کردن خدمات
# ماژول های آپاچی را فعال کنید
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# سایت پیش فرض را غیرفعال کنید
# سایت ما را فعال کنید
# Daemon را بارگیری کنید و Apache ، Postfix و OpenDkim را مجدداً راه اندازی کنید
# مجوزها را تنظیم کنید
# پیکربندی مبادله
# موتور زیرنویس
# راه اندازی git
# IPv6 و OpenDKIM را برای پیکربندی دامنه نشان دهید
# راه اندازی کامل شد

این تنظیمات زیادی است! به طور خلاصه ، این کد دستورات را به ثبت می رساند ، نانو و git را پیکربندی می کند ، کپی می کند ، نسخه های روی پرونده ها ، بارگیری و نصب بسته های ubuntu ، وابستگی های پایتون ، پیکربندی موانع postfix ، پیکربندی postgresql (سرور بانک اطلاعاتی) و بارگیری پایگاه داده ، پیکربندی UFW (یک فرکانس بدون مشخص) ، صدور گواهینامه های بدون استفاده سرور را تنظیم می کند ، پیکربندی را نصب می کند ، Sever را شروع می کند ، تعویض را تخصیص می دهد ، مجوزها را تنظیم می کند و IP ، آدرس IPv6 و کلید OPENDKIM را چاپ می کند. نسبتاً ساده ، اما به نظر می رسد کد زیادی است. ما به این موارد زیادی احتیاج نخواهیم داشت زیرا ما وابستگی نداریم ، ما از کرفس ، کرفس یا دافنه استفاده نمی کنیم ، اما به هر حال برخی از آنها را برای شروع نصب خواهیم کرد. توجه کنید که این کد دارای دامنه ای است که چندین بار اعلام شده است.

ما همچنین باید یک نام دامنه (که هزینه سالانه کمی است) خریداری کنیم. من Squarespace را برای خرید دامنه توصیه می کنم ، طرح آنها بصری و آسان برای استفاده است. شما می توانید هر دامنه مورد نظر خود را خریداری کنید ، اما من در این مثال از دامنه femmebabe.com استفاده می کنم. پس از خرید دامنه ، به پانل پیکربندی Squarespace DNS بروید و یک رکورد را اضافه کنید که دامنه خود را با آدرس IP به سرور نشان می دهد. باید اینگونه به نظر برسد:

@ a xx.xx.xx.xx

با استفاده از اپراتور @ به عنوان میزبان ، به معنای همه زیر دامنه های زیر این دامنه و دامنه ریشه همه به سرور هدایت می شوند. سوابق بیشتری برای اعلام وجود دارد ، اما ما می توانیم هنگامی که آماده ارسال نامه هستیم ، به این موارد برویم. به خاطر داشته باشید ، ممکن است چند روز طول بکشد تا بتوانید با موفقیت نامه از سرور ارسال کنید. سوابق DNS که ما در حال تنظیم آن هستیم برای تبلیغ زمان می برد.

به هر حال ، تنها رکوردی که باید شروع کنیم ، یک رکورد است. بنابراین اکنون می توانیم مطابق پروژه خود اسکریپت زیر را پر کنیم و آن را اجرا کنیم.

بیایید با یک اسکریپت تنظیم کوچکتر شروع کنیم تا فقط آنچه را که برای پیشرفت اساسی نیاز داریم نصب کنیم. ما هنوز از وابستگی های زیادی یا postgresql استفاده نخواهیم کرد ، ما فقط یک سرور اساسی HTTP را راه اندازی خواهیم کرد و در مورد تأیید آن در هنگام انجام این کار نگران هستیم. به یاد داشته باشید ، برای دریافت گواهینامه HTTPS و اجرای سرور به طور ایمن ، ما نیاز به خرید دامنه به همراه اجاره سرور داریم. در حال حاضر ، "Team" را در این پرونده با نام کاربر خود ، "DIR" با فهرست پروژه خود جایگزین کنید و ایمیل و دامنه خود را در برچسب های <> تهیه کنید.

علاوه بر این ، قبل از اجرای این کد ، باید تنظیمات را به فایروال تغییر دهیم که ارائه دهنده میزبان در صورت وجود پشتیبانی می کند. معمولاً این در برگه "شبکه" ارائه دهنده میزبان شما است ، یا اگر خود میزبان هستید ، در بخش "حمل و نقل پورت" روتر خود قرار دارد. اگر از خود میزبانی استفاده می کنید ، می خواهید یک IP استاتیک را از طریق روتر خود با آدرس دستگاه سرور خود تنظیم کنید. برای دسترسی به خواندن/نوشتن باید پورت های زیر را باز کنید.

22 (SSH) 25 (نامه) 587 (نامه) 110 (مشتری پست الکترونیکی) 80 (HTTP) 443 (HTTPS)

# //سطل/bash
# دستورات ورود به سیستم
# پیکربندی نانو
# پیکربندی گیت
# به روزرسانی و نصب
# آنتی ویروس Clamav را فعال کنید
# نام میزبان
# تهیه نسخه پشتیبان از پایگاه داده
# iptables را غیرفعال کنید
# تنظیم virtualenv
# Certbot را نصب کنید
# گواهی اجرا
# تنظیمات کاربر را تنظیم کنید
# مجوزها را تنظیم کنید
# Sudo Chown -r Team: کاربران/var/run/
# root chown sudo: root/run/sudo/ts -r
# بارگیری مجدد و فعال کردن خدمات
# ماژول های آپاچی را فعال کنید
# Daemon را بارگیری کنید و Apache ، Postfix و OpenDkim را مجدداً راه اندازی کنید
# IPv6 و OpenDKIM را برای پیکربندی دامنه نشان دهید

قبل از اجرای این کد ، اطمینان حاصل کنید که دامنه ای که خریداری کرده اید به سرور وصل شده است. برای انجام این کار ، یک ترمینال را روی دستگاه محلی خود باز کنید و این دستور را با دامنه خود اجرا کنید:

ping femmebabe.com # پس از پینگ ، دامنه خود را در اینجا وارد کنید

اگر همه خوب به نظر می رسد و سرور در حال ارسال پاسخ است ، ما آماده هستیم تا اسکریپت را اجرا کنیم و بسته ها را نصب کنیم و همچنین سرور Apache خود را شروع ، فعال و تأیید کنیم.

این تمام تنظیمات لازم برای پیکربندی Postfix نیست ، ما بعداً به آن تنظیم خواهیم پرداخت. در حال حاضر ، این کد تنظیم را اجرا کنید و برای نصب و تأیید سرور خود باید چند دقیقه طول بکشد. یک بار دیگر ، حتماً نام ، ایمیل و نام دامنه را در اسکریپت با توجه به نامی که خریداری کرده اید جایگزین کنید.

اکنون که سرور تهیه شده است ، می توانید در هر مرورگر وب به URL بروید و بررسی کنید تا مطمئن شوید سرور HTTPS را اجرا می کند. اگر اینگونه نیست ، سعی کنید کمی منتظر بمانید تا DNS Records به دست بیاید و سپس دستور زیر را برای آزمایش مجدد گواهینامه Certbot اجرا کنید:

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

تا زمانی که همه چیز را به درستی پیکربندی کرده اید ، باید بتوانید به صفحه پیش فرض Apache دسترسی پیدا کنید تا بدانید که کد شما در حال کار و نمایش یک صفحه وب زنده است. در مرحله بعد ، بیایید تنظیمات را ویرایش کنیم تا حالت اشکال زدایی پیش فرض خود را به تولید تغییر دهیم. ما همچنین دامنه را در تنظیمات و همچنین IP های داخلی پیکربندی خواهیم کرد.

nano yourproject/settings.py

در تنظیمات ، این خطوط را تغییر داده و اضافه کنید.

# پیکربندی سایت

اکنون ، ما نیاز به پیکربندی Apache2 داریم. بیایید فایل پیکربندی را که با این خط مستقر خواهیم کرد ویرایش کنیم:

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

این پرونده پیکربندی باید نام دامنه ما را در آن و نام کاربر و پروژه داشته باشد. من از نام دامنه femmebabe.com ، تیم نام کاربری و نام پروژه femmebabe استفاده می کنم.

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

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

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

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

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

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

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

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

	TimeOut 60000
	LimitRequestBody 0

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

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

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

هنگام پیکربندی سرور خود ، حتماً نام پروژه ، دایرکتوری ها و دامنه را در این کد مثال جایگزین کنید. اکنون ، ما باید سایت پیش فرض را غیرفعال کنیم. این کار را می توان با استفاده از Bash انجام داد.

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

در مرحله بعد ، ما می توانیم سایت پیش فرض را فعال کنیم و Apache2 را بارگیری کنیم ، همچنین با استفاده از Bash. به یاد داشته باشید که FEMMEBABE را با نام پرونده ای که هنگام ویرایش در/etc//apache2/سایت های موجود در دسترس شما اعلام کرده اید جایگزین کنید.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

به دامنه خود در Navbar برگردید. شما باید سایتی را که در مرورگر وب خود پیکربندی کرده اید مشاهده کنید. تبریک می گویم! اگر آن را نمی بینید ، ممکن است نیاز به ایجاد تغییراتی داشته باشید. تنظیمات موجود در پروژه خود ، پیکربندی Apache را با دقت مرور کنید و مطمئن شوید که هیچ خطایی ندارید و دستورات زیر را اجرا کنید تا پروژه را برای خطاها بررسی کنید.

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

اگر در پروژه Python خود خطایی دارید ، آنها را به جایی که هستند ردیابی کنید و آنها را برطرف کنید. ممکن است شما نتوانید تمام خطاهای خود را بسته به جایی که در آن قرار دارند ، ببینید ، بنابراین اگر خطایی دارید که به سادگی می گوید "جمعیت مجدداً" نیست ، پرونده زیر را در محیط مجازی ، registry.py ، ویرایش کنید تا خطا را نشان دهید.

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

به خط 83 بروید ، جایی که این خطای زمان اجرا مطرح شده است (RanueTimeError ("POLUTE ())))) و قبل از این خط نظر اضافه کنید ، سپس با همان تورفتگی اضافه کنید ، self.app_configs = {. این به نظر می رسد:

                # جلوگیری از تماس های reentrant برای جلوگیری از اجرای AppConfig.Ready ()
                # روش دو بار.
# Raise RuntimeError ("جمعیت () دوباره نیست")

سپس می توانید دوباره پروژه را بررسی کرده و خطا را در معرض دید قرار دهید.

python manage.py check

سپس می توانید خطا را مشاهده کرده و آن را برطرف کنید. هنگامی که آن را ثابت کرده اید و کد بدون هیچ خطایی کامپایل می کند ، حتماً پرونده را به عقب تغییر دهید تا به نظر برسد:

                # جلوگیری از تماس های reentrant برای جلوگیری از اجرای AppConfig.Ready ()
                # روش دو بار.
# self.app_configs = {}

به شرطی که سرور آنلاین باشد ، هنگامی که ما تغییر دیگری در آن ایجاد می کنیم ، برای بارگیری مجدد سرور باید از دستور زیر استفاده کنیم:

sudo systemctl reload apache2

عالی! اما در مورد ارسال نامه چیست؟ برای شروع ارسال ایمیل ، ابتدا باید پیکربندی دامنه را به روز کنیم. این باید در پانل DNS شما در Squarespace یا هر ثبت نام دامنه شما انتخاب کنید. ما همچنین نیاز به نصب و افزودن پیکربندی داریم و چند دستور را اجرا می کنیم.

ابتدا بیایید آدرس IPv6 سرور را دریافت کنیم. سپس DNS شما را باز می کنیم و سوابق را اضافه می کنیم.

برای به دست آوردن آدرس IPv6 سرور ، از این دستور استفاده کنید:

ip -6 addr

اکنون می توانیم سوابق زیر را به تنظیمات DNS اضافه کنیم. سوابق من اینگونه به نظر می رسد. با این حال ، برای سوابق خود ، باید آدرس IP را با IP خود جایگزین کنید (نه 75.147.182.214 ، این مال من است). همچنین دامنه خود را به جای femmebabe.com و همچنین آدرس IPv6 خود که با دستور قبلی یافت می شود اضافه کنید (شما نمی توانید از معدن استفاده کنید ، fe80 :: 725A: FFF: FE49: 3E02). در حال حاضر در مورد Domainkey نگران نباشید ، این هنگام تنظیم PostFix ، سرور نامه ، با OpenDkim ایجاد می شود و کلید را چاپ می کنیم. ما این آخرین را پیکربندی خواهیم کرد.

@ بوها n/a 75.147.182.214

@ MX 10 femmebabe.com

@ PTR n/a femmebabe.com

@ txt n/a txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ همه

پیش فرض ._BIMI txt n/a v = bimi1 ؛ l = https: //femmebabe.com/media/static/femmebabe.svg

_dmarc txt n/a v = dmarc1 ؛ P = هیچ

sendonly._domainkey txt n/a

حال ، ما باید پیکربندی مداوم برای Postfix اضافه کنیم. تمام کاری که ما باید انجام دهیم این است که اطمینان حاصل کنیم که نام دامنه ، femmebabe.com را با نام دامنه ای که استفاده می کنید جایگزین می کنیم. بیایید همه پرونده های پیکربندی را یک به یک بررسی کنیم و آنها را در دایرکتوری به نام پیکربندی در پروژه ما ، برای نصب به سیستم عامل نصب کنیم.

nano config/etc_postfix_main.cf

این متن را به پرونده اضافه کنید

# برای یک نسخه کامل تر ، کامل تر ، به/usr/share/postfix/main.cf.dist مراجعه کنید
# Debian خاص: مشخص کردن نام پرونده باعث اولی خواهد شد
# خط آن پرونده به عنوان نام استفاده می شود.  پیش فرض دبیان
# /و غیره /نام پستی.
# myorigin = /etc /نام پستی
# ضمیمه .domain کار MUA است.
# خط بعدی برای تولید هشدارهای "تأخیر در نامه"
# تأخیر_ warning_time = 4h
# به http://www.postfix.org/compatibility_readme.html مراجعه کنید - پیش فرض به 3.6
# نصب های تازه
# پارامترهای TLS
# پیکربندی میلتر

پیکربندی بعدی!

nano config/etc_postfix_master.cf

این خطوط را اضافه کنید:

# 
# فایل پیکربندی فرآیند Master Postfix.  برای جزئیات بیشتر در مورد قالب
# از پرونده ، به صفحه دستی Master (5) مراجعه کنید (دستور: "Man 5 Master" یا
# آنلاین: http://www.postfix.org/master.5.html).
# 
# پس از ویرایش این پرونده ، "بارگیری مجدد PostFix" را انجام دهید.
# 
# =========================================================================================================================================================================================================================.
# نوع سرویس خصوصی rriv rriv chroot wakeup maxproc + args
# (بله) (بله) (نه) (هرگز) (100)
# =========================================================================================================================================================================================================================.
# smtp inet n - y - 1 پس از صفحه نمایش
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# یکی را انتخاب کنید: ارسال فقط برای مشتری های Loopback یا برای هر مشتری را فعال کنید.
# 127.0.0.1:Submission Inet n - y - - SMTPD
# -o syslog_name = postfix/ارسال
# -O SMTPD_TLS_SECURARY_LEVEL = رمزگذاری
# -O SMTPD_SASL_AUTH_ENABLE = بله
# -o smtpd_tls_auth_only = بله
# -O Smtpd_reject_Unlisted_recipient = خیر
# -O SMTPD_CLIENT_RESTRICTIONS = $ mua_client_restrictions
# -O SMTPD_HELO_RESTRICTIONS = $ mua_helo_restrictions
# -O SMTPD_SENDER_RESTRICTIONS = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -O SMTPD_RELAY_RESTRICTIONS = PROLIT_SASL_AUTHENTICTIME ، رد کنید
# -o milter_macro_daemon_name = مبدا
# یکی را انتخاب کنید: SMTPS را فقط برای مشتری های Loopback یا برای هر مشتری فعال کنید.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -O SMTPD_TLS_WRAPPERMODE = بله
# -O SMTPD_SASL_AUTH_ENABLE = بله
# -O Smtpd_reject_Unlisted_recipient = خیر
# -O SMTPD_CLIENT_RESTRICTIONS = $ mua_client_restrictions
# -O SMTPD_HELO_RESTRICTIONS = $ mua_helo_restrictions
# -O SMTPD_SENDER_RESTRICTIONS = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -O SMTPD_RELAY_RESTRICTIONS = PROLIT_SASL_AUTHENTICTIME ، رد کنید
# -o milter_macro_daemon_name = مبدا
# 628 inet n - y - - qmqpd
# qmgr unix n - n 300 1 oqmgr
# -O SMTP_HELO_TIMEOUT = 5 -O SMTP_CONNECT_TIMEOUT = 5
# 
# ==================================================================================================================================================================--
# رابط به نرم افزار Non-Postfix. حتماً کتابچه راهنما را بررسی کنید
# صفحات نرم افزار Non-PostFix برای یافتن گزینه های خود می خواهد.
# 
# بسیاری از خدمات زیر از تحویل لوله Postfix (8) استفاده می کنند
# عامل  برای اطلاعات در مورد $ {گیرنده} به صفحه لوله (8) مرد مراجعه کنید
# و سایر گزینه های پاکت نامه پیام.
# ==================================================================================================================================================================--
# 
# maildrop برای جزئیات بیشتر به پرونده postfix maildrop_readme مراجعه کنید.
# همچنین در main.cf مشخص کنید: maildrop_destination_recipient_limit = 1
# 
# 
# ==================================================================================================================================================================--
# 
# نسخه های اخیر Cyrus می توانند از ورودی موجود "LMTP" Master.cf استفاده کنند.
# 
# در cyrus.conf مشخص کنید:
# lmtp cmd = "lmtpd -a" گوش دادن = "localhost: lmtp" proto = tcp4
# 
# در Main.cf یک یا چند مورد از موارد زیر مشخص کنید:
# Mailbox_Transport = LMTP: INET: localhost
# virtual_transport = lmtp: inet: localhost
# 
# ==================================================================================================================================================================--
# 
# سیروس 2.1.5 (Amos Gouaux)
# همچنین در main.cf مشخص کنید: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - لوله
# پرچم = کاربر drx = cyrus argv =/cyrus/bin/delive -e -r $ {فرستنده} -m $ {پسوند} $ {کاربر}
# 
# ==================================================================================================================================================================--
# نمونه قدیمی تحویل از طریق کوروش.
# 
# Old -Cyrus Unix - N N - - لوله
# پرچم = r کاربر = cyrus argv =/cyrus/bin/delive -e -m $ {پسوند} $ {کاربر}
# 
# ==================================================================================================================================================================--
# 
# برای جزئیات پیکربندی به پرونده Postfix UUCP_README مراجعه کنید.
# 
# 
# سایر روشهای تحویل خارجی.
# 

و پیکربندی OpenDkim. OpenDkim سرورهای ایمیل را با کلیدهای دامنه شناسایی می کند تا آنها را ایمن تر کند. بدون آن ، نامه امضا نمی شود و ممکن است آن را به صندوق ورودی تبدیل نکند.

nano config/etc_default_opendkim

این خطوط را اضافه کنید:

# توجه: این یک فایل پیکربندی میراث است. توسط opendkim استفاده نمی شود
# سرویس SystemD. لطفاً از پارامترهای پیکربندی مربوطه در
# /etc/opendkim.conf در عوض.
# 
# پیش از این ، تنظیمات پیش فرض را در اینجا ویرایش می کند ، و سپس اجرا می کند
# برا
# /etc/systemd/system/opendkim.service.d/override.conf و
# /etc/tmpfiles.d/opendkim.conf. در حالی که این هنوز هم ممکن است ، اکنون است
# توصیه می شود تنظیمات را مستقیماً در /etc/opendkim.conf تنظیم کنید.
# 
# daemon_opts = ""
# تغییر به/var/spool/postfix/run/opendkim برای استفاده از یک سوکت یونیکس با
# postfix در یک کروت:
# rundir =/var/spool/postfix/run/opendkim
# 
# عدم وجود یک سوکت جایگزین
# توجه داشته باشید که تنظیم این امر باعث غلبه بر هر مقدار سوکت در opendkim.conf می شود
# پیش فرض:
# به تمام رابط های بندر 54321 گوش دهید:
# سوکت = inet: 54321
# گوش در Loopback در بندر 12345:
# سوکت = inet: 12345@localhost
# در سال 192.0.2.1 در بندر 12345 گوش دهید:
# سوکت = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

این خطوط را اضافه کنید:

# Default_Process_limit = 100
# Default_client_limit = 1000
# حد پیش فرض VSZ (اندازه حافظه مجازی) برای فرآیندهای سرویس. این عمدتا است
# در نظر گرفته شده برای گرفتن و کشتن فرایندهایی که قبل از خوردن آنها حافظه نشت می کنند
# همه چیز
# Default_vsz_limit = 256m
# کاربر ورود به سیستم توسط فرآیندهای ورود به سیستم استفاده می شود. این بی اعتماد ترین است
# کاربر در سیستم DOVECOT. اصلاً نباید به چیزی دسترسی داشته باشد.
# default_login_user = dovenull
# کاربر داخلی توسط فرآیندهای غیرمجاز استفاده می شود. باید جدا از آن باشد
# کاربر را وارد کنید ، به طوری که فرآیندهای ورود به سیستم نمی توانند فرآیندهای دیگر را مختل کنند.
# default_internal_user = dovecot
    # بندر = 143
    # بندر = 993
    # SSL = بله
  # تعداد اتصالات برای رسیدگی قبل از شروع یک فرآیند جدید. به طور معمول
  # تنها مقادیر مفید 0 (نامحدود) یا 1. 1 ایمن تر است ، اما 0
  # سریعتر است <doc/wiki/loginprocess.txt>
  # service_count = 1
  # تعداد فرآیندها همیشه منتظر اتصالات بیشتر باشید.
  # process_min_avail = 0
  # اگر Service_Count = 0 را تنظیم کنید ، احتمالاً باید این موضوع را رشد دهید.
  # vsz_limit = $ default_vsz_limit
    # بندر = 110
    # بندر = 995
    # SSL = بله
    # بندر = 587
  # فقط در صورتی که نتوانید از سوکت UNIX فوق استفاده کنید ، شنونده INET را ایجاد کنید
  # inet_listener lmtp {
    # از دیدن LMTP برای کل اینترنت خودداری کنید
    # آدرس =
    # بندر =
  # }
  # بیشتر حافظه به پرونده های MMAP () می رود. ممکن است شما نیاز به افزایش این موضوع داشته باشید
  # اگر صندوق های پستی عظیمی دارید محدود کنید.
  # vsz_limit = $ default_vsz_limit
  # حداکثر تعداد فرآیندهای IMAP (اتصالات)
  # process_limit = 1024
  # حداکثر تعداد فرآیندهای POP3 (اتصالات)
  # process_limit = 1024
  # حداکثر تعداد فرآیندهای ارسال SMTP (اتصالات)
  # process_limit = 1024
  # auth_socket_path به طور پیش فرض به این سوکت userdb اشاره می کند. این به طور معمول است
  # استفاده شده توسط dovecot-lda ، doveadm ، احتمالاً فرآیند IMAP و غیره.
  # مجوزهای کامل به این سوکت قادر به دریافت لیستی از همه نام های کاربری و
  # نتایج جستجوهای UserDB همه را دریافت کنید.
  # 
  # حالت پیش فرض 0666 به هر کسی اجازه می دهد تا به سوکت وصل شود ، اما
  # UserDB Lookups تنها درصورتی که UserDB یک قسمت "UID" را برگرداند ، موفق خواهد شد
  # با UID فرآیند تماس گیرنده مطابقت دارد. همچنین اگر UID یا GID تماس گیرنده مطابقت داشته باشد
  # UID یا GID سوکت موفق می شود. هر چیز دیگری باعث شکست می شود.
  # 
  # برای ارائه مجوزهای کامل به تماس گیرنده برای جستجوی همه کاربران ، حالت را تنظیم کنید
  # چیز دیگری از 0666 و Dovecot اجازه می دهد تا هسته اجرا کند
  # مجوزها (به عنوان مثال 0777 به همه اجازه می دهد مجوزهای کامل).
  # فرآیند کارگر Auth به طور پیش فرض به صورت ریشه اجرا می شود ، تا بتواند به آن دسترسی پیدا کند
  # /و غیره/سایه. اگر این کار لازم نباشد ، کاربر باید به آن تغییر یابد
  # $ default_internal_user.
  # کاربر = ریشه
  # در صورت استفاده از پروکسی DICT ، فرآیندهای پستی باید به سوکت آن دسترسی داشته باشند.
  # به عنوان مثال: حالت = 0660 ، گروه = vmail و global mail_access_groups = vmail
    # حالت = 0600
    # کاربر =
    # گروه =

یک بار دیگر ، حتماً دامنه را در تمام این پرونده ها ، femmebabe.com ، با دامنه ای که انتخاب کرده اید جایگزین کنید. پرونده بعدی را ویرایش کنید ، پیکربندی Dovecot ،

nano config/etc_dovecot_dovecot

و این خطوط را اضافه کنید

## پرونده پیکربندی Dovecot
# اگر عجله دارید ، به http://wiki2.dovecot.org/quickconfiguration مراجعه کنید
# دستور "doveconf -n" خروجی تمیز از تنظیمات تغییر یافته را ارائه می دهد. از آن استفاده کنید
# به جای کپی کردن و چسباندن پرونده ها هنگام ارسال به لیست پستی Dovecot.
# '# شخصیت و همه چیز پس از آن به عنوان نظر رفتار می شود. فضاهای اضافی
# و زبانه ها نادیده گرفته می شوند. اگر می خواهید از هر یک از این موارد صریح استفاده کنید ،
# value inside quotes, eg.: key = "# فضای سفید و دنباله دار "
# بیشتر (اما نه همه) تنظیمات را می توان با پروتکل های مختلف و/یا نادیده گرفت
# IPS منبع/مقصد با قرار دادن تنظیمات در بخش ها ، به عنوان مثال:
# پروتکل IMAP {} ، محلی 127.0.0.1 {} ، از راه دور 10.0.0.0/8 {
# مقادیر پیش فرض برای هر تنظیم نشان داده شده است ، لازم نیست که از بین برود
# آن ها. این موارد استثنائی در این مورد است: هیچ بخش (به عنوان مثال فضای نام {})
# یا تنظیمات افزونه به طور پیش فرض اضافه می شوند ، آنها فقط به عنوان نمونه ذکر شده اند.
# مسیرها نیز فقط نمونه هایی هستند که پیش فرض های واقعی بر اساس پیکربندی است
# گزینه ها مسیرهای ذکر شده در اینجا برای پیکربندی -prefix =/usr است
# -sysconfdir =/etc-localstatedir =/var
# پروتکل های نصب شده را فعال کنید
# لیستی از کاما از IPS یا میزبان جدا شده که در آن می توانید برای اتصالات گوش دهید.
# "*" در تمام رابط های IPv4 گوش می دهد ، "::" در تمام رابط های IPv6 گوش می دهد.
# اگر می خواهید درگاه های غیر پیش فرض یا هر چیز پیچیده تری را مشخص کنید ،
# ویرایش conf.d/master.conf.
# گوش دادن = *، ::
# دایرکتوری پایه از کجا می توان داده های زمان اجرا را ذخیره کرد.
# base_dir =/var/run/dovecot/
# نام این نمونه در تنظیمات چند منظوره Doveadm و سایر دستورات
# می تواند از -i <sinstance_name> برای انتخاب کدام نمونه استفاده کند (یک جایگزین استفاده می شود
# به -c <config_path>). نام نمونه نیز به فرآیندهای Dovecot اضافه می شود
# در خروجی PS.
# sustance_name = dovecot
# پیام تبریک برای مشتریان.
# login_greeting = dovecot آماده.
# لیست جدا شده فضا از محدوده شبکه قابل اعتماد. اتصالات از اینها
# IP ها مجاز به غلبه بر آدرس ها و درگاه های IP خود هستند (برای ورود به سیستم و
# برای بررسی احراز هویت). Disable_Plaintext_auth نیز برای
# این شبکه ها به طور معمول سرورهای پروکسی IMAP خود را در اینجا مشخص می کنید.
# login_trusted_networks =
# لیست جدا شده فضا از سوکت های دسترسی به ورود به سیستم (به عنوان مثال TCPWRAP)
# login_access_sockets =
# با proxy_maybe = بله اگر مقصد پروکسی با هر یک از این IP ها مطابقت دارد ، این کار را نکنید
# مجاورت این به طور عادی لازم نیست ، اما در صورت مقصد ممکن است مفید باشد
# IP به عنوان مثال است IP متعادل کننده بار.
# auth_proxy_self =
# عناوین فرآیند کلامی (در PS) را نشان دهید. در حال حاضر نام کاربر را نشان می دهد و
# آدرس IP برای دیدن اینکه در واقع از فرآیندهای IMAP استفاده می کنند مفید است
# (به عنوان مثال صندوق های پستی مشترک یا اگر از UID برای چندین حساب استفاده می شود).
# Verbose_proctitle = نه
# در صورت خاموش شدن روند کارشناسی ارشد DOVECOT ، باید همه فرایندها کشته شوند.
# تنظیم این به "نه" به معنای این است که می توان Dovecot را بدون به روزرسانی کرد
# مجبور کردن اتصالات مشتری موجود برای بستن (اگرچه این نیز می تواند باشد
# اگر به روز رسانی باشد ، مشکلی است. به دلیل رفع امنیت).
# خاموش شدن_ کلین ها = بله
# در صورت عدم صفر ، دستورات پست الکترونیکی را از طریق این اتصالات بسیاری به سرور DoveAdm اجرا کنید ،
# به جای اجرای مستقیم آنها در همان فرآیند.
# doveadm_worker_count = 0
# سوکت یا میزبان یونیکس: پورت مورد استفاده برای اتصال به سرور DoveAdm
# doveadm_socket_path = doveadm-server
# لیست جدا شده فضا از متغیرهای محیطی که در Dovecot حفظ می شوند
# راه اندازی و به تمام مراحل کودک خود منتقل شد. شما همچنین می توانید بدهید
# key = جفت ارزش برای تنظیم همیشه تنظیمات خاص.
# Import_Envistry = TZ
## 
## تنظیمات سرور فرهنگ لغت
## 
# از فرهنگ لغت می توان برای ذخیره لیست های کلید = ارزش استفاده کرد. این توسط چندین مورد استفاده می شود
# افزونه ها به فرهنگ لغت می توان به طور مستقیم یا هرچند دسترسی پیدا کرد
# سرور فرهنگ لغت. موارد زیر نقشه های فرهنگ لغت نقشه های زیر را به URIS
# وقتی از سرور استفاده می شود. سپس این موارد را می توان با استفاده از URIS در قالب ارجاع داد
# "پروکسی :: <name>".
  # سهمیه = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# بیشتر پیکربندی های واقعی در زیر گنجانده شده است. نام پرونده ها هستند
# ابتدا با ارزش ASCII آنها مرتب شده و به این ترتیب تجزیه می شود. پیش فرض 00
# در نام پرونده ها در نظر گرفته شده است تا درک سفارش را آسان تر کند.
# یک پرونده پیکربندی همچنین می تواند بدون ایجاد خطایی در صورتی وارد شود
# پیدا نشده است:
# به Dovecot اجازه می دهد تا به همه اتصالات ورودی گوش دهد (IPv4 / IPv6)

برای کاربر DOVECOT یک رمز عبور اضافه کنید:

nano config/etc_dovecot_passwd

قسمت اول پرونده ، قبل از روده بزرگ ، نام کاربری است. قسمت آخر ، "yourspassword" ، رمز عبوری را که می خواهید سرور نامه خود را ارائه دهید ، نشان می دهد.

team:{plain}yourpassword

بعد ، پیکربندی opendkim

nano config/etc_opendkim.conf

و این خطوط را اضافه کنید:

# این یک پیکربندی اساسی برای امضای و تأیید است. به راحتی می تواند باشد
# متناسب با یک نصب اساسی سازگار است. به OpenDkim.conf (5) مراجعه کنید
# /usr/share/doc/opendkim/examples/opendkim.conf.sample برای کامل
# مستندات پارامترهای پیکربندی موجود.
# ورود به سیستم
# پارامترهای امضا و تأیید مشترک. در دبیان ، عنوان "از"
# بیش از حد طراحی شده است ، زیرا اغلب کلید هویت است که توسط سیستم های شهرت استفاده می شود
# و بنابراین تا حدودی امنیتی حساس است.
# امضای دامنه ، انتخاب کننده و کلید (لازم). به عنوان مثال ، امضا را انجام دهید
# برای دامنه "مثال. com" با انتخاب "2020" (2020._domainkey.example.com) ،
# با استفاده از کلید خصوصی ذخیره شده در /etc/dkimkeys/example.private. دانه دار
# گزینه های تنظیم را می توان در /usr/share/doc/opendkim/readme.opendkim یافت.
# دامنه مثال. com
# انتخاب 2020
# keyfile /etc/dkimkeys/example.private
# در دبیان ، OpenDkim به عنوان کاربر "opendkim" کار می کند. یک umask 007 در صورت نیاز است
# با استفاده از یک سوکت محلی با MTA که به عنوان یک غیرقانونی به سوکت دسترسی پیدا می کند
# کاربر (به عنوان مثال ، postfix). ممکن است لازم باشد کاربر "postfix" را به گروه اضافه کنید
# "opendkim" در این مورد.
# سوکت برای اتصال MTA (مورد نیاز). اگر MTA در زندان کروت باشد ،
# باید اطمینان حاصل شود که سوکت در دسترس است. در دبیان ، Postfix وارد می شود
# یک کروت در/var/spool/postfix ، بنابراین یک سوکت یونیکس باید باشد
# همانطور که در آخرین خط زیر نشان داده شده است.
# سوکت محلی: /run/opendkim/opendkim.sock
# سوکت اینت: 8891@localhost
# سوکت اینت: 8891
# میزبان هایی که به جای تأیید ، برای آنها امضا کنند ، پیش فرض 127.0.0.1 است. دیدن
# بخش عملکرد OpenDkim (8) برای اطلاعات بیشتر.
# داخلی Hosts 192.168.0.0/16 ، 10.0.0.0/8 ، 172.16.0.0/12
# لنگر اعتماد DNSSEC را قادر می سازد. در دبیان ، پرونده لنگر اعتماد ارائه شده است
# توسط بسته DNS-Root-Data.
# Nameservers 127.0.0.1
# دامنه نقشه از آدرس گرفته تا کلیدهای مورد استفاده برای امضای پیام ها
# مجموعه ای از میزبان های داخلی که نامه آنها باید امضا شود
nano config/etc_default_opendkim

و این خطوط را اضافه کنید

# توجه: این یک فایل پیکربندی میراث است. توسط opendkim استفاده نمی شود
# سرویس SystemD. لطفاً از پارامترهای پیکربندی مربوطه در
# /etc/opendkim.conf در عوض.
# 
# پیش از این ، تنظیمات پیش فرض را در اینجا ویرایش می کند ، و سپس اجرا می کند
# برا
# /etc/systemd/system/opendkim.service.d/override.conf و
# /etc/tmpfiles.d/opendkim.conf. در حالی که این هنوز هم ممکن است ، اکنون است
# توصیه می شود تنظیمات را مستقیماً در /etc/opendkim.conf تنظیم کنید.
# 
# daemon_opts = ""
# تغییر به/var/spool/postfix/run/opendkim برای استفاده از یک سوکت یونیکس با
# postfix در یک کروت:
# rundir =/var/spool/postfix/run/opendkim
# 
# عدم وجود یک سوکت جایگزین
# توجه داشته باشید که تنظیم این امر باعث غلبه بر هر مقدار سوکت در opendkim.conf می شود
# پیش فرض:
# به تمام رابط های بندر 54321 گوش دهید:
# سوکت = inet: 54321
# گوش در Loopback در بندر 12345:
# سوکت = inet: 12345@localhost
# در سال 192.0.2.1 در بندر 12345 گوش دهید:
# سوکت = inet: 12345@192.0.2.1

هنگامی که ما آماده تنظیم سرور PostFix خود هستیم ، کد زیر را با نام دامنه مناسب تعبیه می کنیم. با ایجاد یک فیلمنامه شروع کنید

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

اکنون ، در نانو ، ویرایشگر متن ، این پرونده را ویرایش کنید تا نام دامنه شما را به جای femmebabe.com شامل شود.

# //سطل/bash
# راه اندازی postfix

اکنون ، اسکریپت تکمیل شده را برای پیکربندی postfix ، opendkim و dovecot اجرا کنید.

./scripts/postfixsetup

پس از اجرای این اسکریپت ، آخرین خط چاپ شده را کپی کرده و آن را در پیکربندی DNS خود به عنوان مقدار SendOnly._domainkey چسبانده اید. این کلید OpenDkim است که برای شناسایی دامنه شما هنگام ارسال نامه ایمن استفاده می شود.

عالی! در طی چند روز ، شما باید بتوانید از طریق سرور نامه ارسال کنید و به شرط پیکربندی همه چیز به درستی پیکربندی شده است.

اگر فقط DNS را برای سرور پست الکترونیکی خود پیکربندی کرده اید ، باید به روزرسانی سوابق کمتر از 72 ساعت طول بکشد. معمولاً خیلی سریعتر است. می توانید بررسی کنید که آیا سرور شما با استفاده از این دستور کار می کند ، ایمیل خود را تهیه کنید:

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

اگر به نظر می رسد همه چیز به درستی کار می کند ، باید بتوانید با سرور خود ایمیل ارسال کنید. اگر کار نمی کند ، سعی کنید به سیاههها نگاه کنید تا ببینید این خطا چه می تواند باشد.

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

این اطلاعات کلامی در مورد نامه هایی که توسط سرور ارسال می شود و اینکه آیا به درستی کار می کند ارائه می دهد. شما باید بتوانید ایمیل را در صندوق ورودی خود مشاهده کنید ، اگر در آنجا نیست ، پوشه هرزنامه خود را بررسی کنید.

همچنین باید تنظیمات خود را در تنظیمات خود پیکربندی کنید. این خطوط را در تنظیمات خود اضافه یا جایگزین کنید

EMAIL_HOST_USER = 'team' # 'love@mamasheeen.com'

توجه کنید که ما برای دریافت رمز عبور از یک فایل پیکربندی استفاده می کنیم. بیایید این پرونده را در تنظیمات مانند ، در همان ابتدای پرونده بارگذاری کنیم .:

# پیکربندی را باز و بارگذاری کنید

بیایید این فایل را ایجاد کنیم و یک کلید مخفی به آن و همچنین رمز ورود نامه اضافه کنیم. برای تولید یک کلید مخفی ، از این دستور استفاده کنید ، با هر طول که دوست دارید در پایان:

openssl rand -base64 64

اکنون ، متنی را که OpenSSL تولید کرده و ویرایش /etc/config.json را کپی کنید

sudo nano /etc/config.json

خطوط زیر را به پرونده خود اضافه کنید ، با کلید که به عنوان کلید مخفی تولید می شود.

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

فرمت JSON ساده و آسان برای استفاده است ، ما می توانیم کلیدهای دیگری را که می خواهیم در پروژه خود از این روش استفاده کنیم ، اعلام کنیم و آنها را از فهرست پروژه خود جدا کنیم تا سایر کاربران نتوانند برای آنها بنویسند و بنابراین نمی توان آنها را به تنهایی از فهرست پروژه ما خواند. این تمرین برای کلیدهای API توصیه می شود ، که ما در اینجا بیش از چند مورد استفاده خواهیم کرد.

شما همچنین می خواهید از پروژه خود نسخه پشتیبان تهیه کنید تا مطمئن شوید همه چیز ذخیره شده است و حتی اگر دیگر مایل به اجاره سرور نیستید ، بعداً می توانید کار خود را بازیابی کنید.

sudo backup

اکنون ، سعی کنید یک ایمیل HTML را از سرور وب ارسال کنید ، مشروط بر اینکه ارسال یکی از خط فرمان کار می کند. نمونه کاربر خود را در پوسته پرس و جو کنید و یک ایمیل HTML را از طریق Django به آن کاربر ارسال کنید. نام من را در کد ، شارلوت ، به نام کاربری خود تغییر دهید.

python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()

اگر دستور اول کار نمی کند ، حتماً از آن استفاده کنید

source venv/bin/activate

مشروط بر اینکه همه چیز به درستی تنظیم شده باشد ، اکنون یک ایمیل خوشایند را در صندوق پستی خود که توسط برنامه وب خود ارسال شده است دریافت خواهید کرد. کار خوب! شما مسیری طولانی را طی کرده اید

من می خواستم اضافه کنم ، اگر شما همیشه در هنگام کار روی یک پروژه مانند این با هرگونه خطایی دست و پنجه نرم می کنید ، از جستجوی پاسخ ها دریغ نکنید و از آنها کمک بخواهید. Google ، از جمله سایر موتورهای جستجو ، منابع خوبی برای جستجوی کمک برنامه نویسی است. به سادگی خطایی را که می کنید جستجو کنید و می توانید ببینید که افراد دیگر چگونه مشکل را حل می کنند. همچنین ، شما خوشحال هستید که با من ، مربیان خود (معلمان ، اساتید ، معلمان) ، هر یک از همسالان در اینترنت که برای کمک به برنامه نویسی در دسترس هستند ، تماس بگیرید یا دوباره با این کتاب یا منابع دیگر مشورت کنید تا راه حل هایی را برای موضوعاتی که تجربه می کنید پیدا کنید. من می دانم که این کار ساده ای نیست ، اما حتی اگر در این زمینه خوانده اید و هیچ کدی را نمی نویسید ، در مورد ساخت یک برنامه وب از ابتدا چیزهای زیادی یاد می گیرید. خود را به پشت برسانید ، شما یک کار عالی انجام می دهید.

از اینکه وقت خود را برای خواندن این راهنمای توسعه وب ویرایش سوم وقت گذاشتید متشکریم. در نسخه های آینده ، بیشتر نمونه های مهم مورد بحث در ابتدای سند را درج خواهم کرد و ما بسیار عمیق تر به دنیای نرم افزار و توسعه سخت افزار شیر خواهیم داد. با ما در ارتباط باشید و من مشتاقانه منتظر آموزش نحوه ساخت نرم افزار باورنکردنی هستم. در نسخه بعدی می بینیم!






نزدیک
صفحه 1
پرش
به مقاله کامل مراجعه کنید
ادامه خواندن

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید



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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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


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


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


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


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


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


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


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


what's the best way to boil eggs?


here is a simple method to boil eggs:


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

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

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

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

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


.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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


the most common side effects of birth control pills include:


1. Nausea

2. Breast tenderness

3. Headaches

4. Weight gain

5. Mood changes

6. Spotting or breakthrough bleeding

7. Changes in libido 

8. Acne 

9. Bloating 


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

.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


How do I host a web server from my home?


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


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


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


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


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


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید



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


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


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


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


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


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


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


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


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


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


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


What are the benefits to having a security camera?


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


why is it safer to wear a mask in public?


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


.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


is sugar really unhealthy?


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


.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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


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


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


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


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


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


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


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


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


How do I write a good book?


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


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


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


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


What causes migraine and how are they treated?


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


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


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

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

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

4. Practicing relaxation techniques such as deep breathing or meditation

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

6. Getting regular exercise and maintaining a healthy diet


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید



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


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


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


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

.

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


How do i wear deadlock?


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


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


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


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


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


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


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


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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


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


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


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


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


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


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


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

از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


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.


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید


How is the crypto market growing so quickly?


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


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


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


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


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


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


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


از طرف Daisy / نمایش | خرید کردن | با cryptocurrency بخرید




https://glamgirlx.com -


(برای بارگیری تصویر کلیک کنید یا ضربه بزنید)
سرگرمی های حرفه ای ، عکس ها ، فیلم ها ، صوتی ، پخش مستقیم و گیم پلی گاه به گاه و همچنین اسکن شناسه ، توسعه وب و خدمات جانشینی.

با استفاده از این آدرس یک نکته در بیت کوین بگذارید: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

شرایط خدمات