Scéal - An láithreán cuairte
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 ...
Pembelajaran dan Keamanan Deep Berdasarkan Web Praktis

Pembelajaran dan Keamanan Deep Berdasarkan Web Praktis Edisi ketiga Charlotte Harper 3 Juli 2024 Diperbarui/dikonversi 3 Juni 2025

Kata pengantar:

Pertimbangan keamanan dalam membangun perangkat lunak untuk web adalah bagian penting dari rencana pengembang web dan eksekusi setiap saat merekayasa prototipe yang dapat diandalkan, stabil, dan berguna untuk tujuan praktis. DOM (Markup Objek Dokumen), dengan implementasi HTML, JavaScript, dan CSS serta perangkat lunak backend yang mengimplementasikan Python, C/C ++, Java dan Bash, memberi pengembang web kebebasan dan kekuatan untuk menciptakan berbagai proyek yang mengekspresikan kreativitas, memberikan banyak penggunaan dan fungsi yang menarik, dan merupakan kemudahan yang memanfaatkannya sebagai kemudahan yang baik, dan seperti yang dapat digunakan sebagai kemudahan yang dapat digunakan sebagai hal yang baik, dan karakter sebagai kemudahan yang memanfaatkan penggunaan, dan karakter sebagai kemudahan yang memanfaatkan dengan mudah, dan karakter sebagai kemudahan yang memanfaatkan penggunaan, dan memberikan banyak penggunaan. Bunuh waktu atau selesaikan sesuatu di internet, biasanya di perangkat smartphone layar sentuh. Kebanyakan orang bahkan tidak akan tahu dari mana harus memulai ketika mereka ingin membangun situs web dari awal, mereka akan cenderung memulai di situs web orang lain dan membangun sesuatu yang terbatas dalam fungsionalitas, ketergantungan, kemudahan penggunaan dan terutama kreativitas ketika mereka dapat memiliki semua alat kuat terbaru yang mereka miliki untuk membangun sesuatu yang berguna tanpa menggunakan tombol waktu, dan terutama dengan mudahnya membayar dengan mudah untuk menggunakan sih yang ingin digunakan oleh beberapa orang untuk menggunakan perangkat lunak yang ingin dimanfaatkan oleh beberapa orang. Jika Anda memiliki beberapa menit untuk membaca buku ini dan mempelajari apa yang ingin saya ajarkan kepada Anda, atau bahkan berbicara dengan saya secara pribadi tentang tujuan Anda dan mendapatkan beberapa panduan ke arah yang benar, dan termotivasi untuk belajar membuat kode dan menulis perangkat lunak Anda sendiri, bawa pulang buku ini dan sisihkan beberapa waktu untuk membangun apa yang Anda inginkan dan persis apa yang Anda inginkan.

Tentang saya: Saya seorang pengembang perangkat lunak dengan berbagai pengalaman dalam C/C ++, Java, Python, HTML, CSS dan JavaScript. Saya membangun situs web yang ingin digunakan orang, ingin berkunjung, dan bahkan kecanduan hanya menggunakan hanya untuk belajar, menciptakan kembali dan menghabiskan waktu, dan yang paling penting, saya menjual perangkat lunak. Jika Anda memiliki ide tentang bagaimana Anda ingin situs web terlihat dan berfungsi, Anda bersedia mendukung saya sehingga saya dapat memenuhi kebutuhan saya sendiri sementara saya bertemu dengan milik Anda, dan Anda bersedia menutupi biaya menjalankan situs web sendiri, saya akan membangun Anda di YouTube berikutnya, Tiktok, Twitter, Google, atau bahkan aplikasi keamanan teknologi tinggi yang hanya dapat Anda akses. Alih -alih mencoba menjual waktu saya kepada Anda, saya mencoba membeli milik Anda: Saya ingin membujuk Anda untuk membangun aplikasi (situs web) sendiri dengan informasi yang sudah ada, dan mengajari Anda apa yang Anda butuhkan untuk menjadi pengembang perangkat lunak independen, pengusaha, memimpin karier yang sukses di bidang apa pun yang Anda inginkan. Dan biarkan saya jelas, pendidikan yang saya berikan kepada Anda akan informal. Anda bisa pergi ke sekolah dan mempelajari semua ini dengan pendidikan formal, atau bahkan membaca buku ini di sekolah, menyelesaikan tugas Anda, dan mengambil banyak dari pendidikan Anda, tetapi saya tidak akan secara resmi menempatkan Anda di kursi panas dan meminta Anda untuk menyelesaikan tugas. Saya bukan profesor Anda, Anda dapat menganggap saya seperti teman yang ingin membimbing Anda menuju karier yang didorong oleh kesuksesan pribadi Anda. Dan saya juga tidak menjual kesuksesan Anda, Anda perlu membelinya dengan waktu Anda. Belajar kode memiliki kurva belajar yang curam dan tidak pernah mudah, atau bahkan seharusnya. Anda perlu bekerja sekeras mungkin dan terus mencoba dan gagal dan mencoba lagi bahkan ketika Anda frustrasi untuk belajar dan membangun aplikasi sendiri. Itu adalah sifat kode itu sendiri. Kode dijalankan oleh kompiler yang dirancang untuk memberikan pesan kesalahan programmer, dan ini akan mengajarkan Anda cara membuat kode, bahkan jika Anda hanya menyalin kesalahan ke mesin pencari Anda dan membaca contoh orang lain. Dan saya harus mengatakan, Anda tidak perlu menjadi sangat kaya, pintar, sukses, atau bahkan berorientasi pada detail atau terorganisir untuk membangun aplikasi. Komputer mengurus organisasi itu untuk Anda. Anda hanya perlu bertahan melalui coba -coba, mempertahankan fokus dan bekerja keras pada apa yang Anda lakukan, dan Anda akan memiliki karier yang sangat sukses secara keseluruhan dari apa yang Anda lakukan.

Siapa saya: Saya menyadari bahwa bagian terakhir lebih banyak tentang belajar dan Anda mengambil jalan dari buku ini. Siapa sebenarnya saya? Itu pertanyaan yang rumit. Saya tidak jelas pada diri saya sendiri, karena saya menderita kondisi medis yang dapat menyulitkan saya untuk bahkan membuat kode atau menulis buku ini di kali, sambil menghadirkan tantangan dengan sosialisasi dan masalah identitas yang membuat hidup saya lebih sulit ketika datang untuk memperkenalkan diri. Singkatnya, jika Anda membaca buku ini, Anda membawanya pulang karena Anda membalikkannya dan berpikir itu berguna, atau bahkan jika Anda hanya membaca sejauh ini, kepada Anda, saya adalah individu yang berpikiran seperti yang ingin melihat Anda berhasil dalam segala hal yang Anda lakukan. Saya seorang insinyur sendiri, pengembang perangkat lunak, dan seorang siswa, dan saya menulis buku ini untuk siswa lain yang ingin membuat hidup mereka lebih mudah dengan memiliki buku pegangan perangkat lunak yang mereka butuhkan membuat hidup mereka lebih mudah dengan memberikan contoh untuk menyalin yang cocok bersama seperti aplikasi besar ke dalam lini bisnis yang berfungsi, bermanfaat, fungsional, kohesif, dan menarik yang dapat mendorong keberhasilan apa pun lini bisnis. Sebagian besar, inilah yang saya lakukan: Saya membangun aplikasi untuk membantu diri saya dan orang lain berhasil. Saya juga seorang penulis, meskipun ini adalah publikasi pertama saya yang ingin saya selesaikan untuk menggabungkan portofolio saya menjadi dokumen yang berguna, dan saya juga seorang seniman. Saya akan mengakui ini untuk Anda, saya semacam orang yang aneh. Saya tidak sempurna, saya telah menjalankan Ins dengan hukum bahkan membuat saya meninggalkan perguruan tinggi dan universitas dan meninggalkan negara bagian untuk mencoba membuat nama untuk diri saya sendiri dengan lebih sukses. Saya seorang wanita sejak lahir, saya memakai riasan, mengambil foto diri saya, memakai gaun dan pakaian wanita lainnya, dan saya tetap sadar akan diri saya sebagai wanita secara alami. Saya memiliki masalah dengan orang lain di masa lalu yang mengarah pada perjuangan dengan menulis dan membangun aplikasi web, dan saya minta maaf bahwa saya belum bisa mendapatkan buku ini di tangan Anda lebih cepat: Anda membutuhkan ini. Anda akan ingin membaca dan menulis kode yang terlihat seperti milik saya dan bekerja seperti milik saya dan melakukan hal yang sama tetapi bahkan lebih baik, karena jika Anda mampu membeli buku ini alih -alih menumbuk keyboard Anda seperti yang saya lakukan hanya untuk membuat buku sendiri meminta uang untuk itu, Anda memiliki sumber daya yang Anda butuhkan untuk berhasil dalam hidup Anda. Saya memiliki segala macam masalah dengan keluarga yang tumbuh, kondisi kesehatan, dokter, media, dan hukum, dan kode saya sangat mencerminkan perjuangan yaitu feminisme dan sifat perempuan di dunia yang terpecah dan frustrasi. Namun, buku ini adalah sesuatu yang sangat saya pedulikan, bayi saya, portofolio saya, dan mata pencaharian saya, jadi saya menghargai pertimbangan Anda ketika Anda membawa pulang teks dan dengan hati -hati meneliti untuk belajar dari saya. Harap diingat bahwa saya tidak sempurna, buku ini akan memiliki kesalahan, revisi, dan edisi baru, dan Anda perlu berpikir dengan otak logis Anda sebaik mungkin untuk memiliki pengalaman yang sukses dengan tulisan saya. Juga, pahami bahwa saya bermaksud baik untuk Anda bahkan ketika Anda menghadapi tantangan saat menulis. Pikirkan seperti ini: Ketika Anda hanya dapat menyewa sistem komputer untuk melakukan apa pun yang dapat Anda bayangkan di ruang digital, menyimpan semua informasi yang Anda temui, menganalisis, dan mengaturnya, dan mulai memahaminya, Anda pasti akan menghadapi kesulitan dengan informasi yang Anda konsumsi dan bahkan menerbitkan. Saya memberi tahu Anda ini karena saya mengalami kesulitan yang sama. Gunakan buku ini dengan risiko Anda sendiri, bekerja dengan komunitas dan komunitas Anda yang tersedia untuk Anda untuk membangun perangkat lunak dalam lingkungan yang aman, dan jangan mengambil sesuatu untuk secara pribadi ketika Anda gagal atau bahkan berhasil dengan cara yang salah: Begitulah cara saya sampai sejauh ini, dan mengapa saya dapat membawa Anda ke dalam hal -hal yang akan terjadi pada semua hal yang terjadi pada semua hal yang membuat saya hancur dan terkena hal -hal global yang membuat saya hancur dan terkena dampak global. di mana kita akan bekerja, internet. Anda mungkin tidak terlalu akrab dengan siapa saya hanya dengan beberapa kata, tetapi saya mendorong Anda untuk membaca, Anda akan mengenal saya ketika Anda terus membaca dan memahami saya sambil membangun proyek Anda sendiri untuk menyelesaikan pekerjaan Anda. Tidak akan ada pekerjaan rumah dengan buku ini, selama profesor atau guru Anda tidak memberikan Anda apa pun, tetapi saya sangat mendorong Anda untuk membangun portofolio proyek sendiri saat Anda membaca, serta proyek batu penjuru yang menampilkan bagaimana Anda dapat menerapkan apa yang telah Anda pelajari. Proyek Capstone saya adalah dasar untuk sebagian besar dari apa yang akan Anda baca dalam buku ini, karena menggabungkan kode dari proyek saya sebelumnya, kode yang telah saya buat dan belajar untuk menulis secara metodis dengan tangan, dan berbagai ide dan tips yang telah membantu saya berhasil ke titik di mana saya dapat memutar aplikasi yang sepenuhnya ditampilkan dan terlihat dan berperilaku seperti aplikasi yang mungkin Anda lihat.

Apa buku ini: Buku ini adalah tutorial dengan contoh. Anda dapat menemukan kode di sini, instruksi untuk bagaimana belajar kode, informasi tentang kode debugging dan memperbaiki kesalahan, pemecahan masalah, instruksi tentang cara mencadangkan dan menyimpan kode Anda, menggunakan kembali jika ada yang memecahkan kode Anda, mengamankan kode Anda, menyebarkan kode Anda, seperti halnya Anda, seperti halnya Anda, seperti halnya Anda, dan membuat Anda tidak perlu melakukan apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun yang penting, dan membuat Anda tidak masuk akal. Perangkat lunak yang Anda bangun dengan cahaya terbaik mutlak untuk menjadi yang paling menarik bagi pengguna akhir Anda, pengunjung situs web Anda. Dalam buku ini, saya akan mendemonstrasikan sejumlah contoh desain perangkat lunak dengan fokus pada web sebagai platform serta keamanan. Kami akan memulai pengalaman belajar dengan membangun proyek dasar menggunakan unix shell, dengan fitur cadangan dan skrip. Kemudian, kami akan memeriksa situs web blog dasar, meningkatkan blog kami dengan fitur foto dan video serta menggunakan fitur ini untuk menggunakan solusi keamanan menggunakan perangkat lunak gratis, dan mengamankan server kami menggunakan Modul Otentikasi Pluggable (PAM). Kami kemudian akan meninjau penanganan dan pemrosesan file, mengeksplorasi pengeditan video, donasi suara, pemindaian barcode dan pengenalan karakter optik, di antara konsep -konsep lainnya. Sepanjang jalan kami akan memeriksa API yang akan membantu kami membuat perangkat lunak kami lebih berguna dan aman, dengan opsi gratis dan berbayar. Sepanjang jalan, kami akan menjelajahi keamanan fisik dan alat militan seperti senjata api dan desain amunisi dan manufaktur termasuk desain barel dan repeater, desain menara dan drone, dan kepala sekolah lainnya yang akan kami integrasikan dengan perangkat lunak kami di jaringan yang ada untuk melindungi perangkat lunak kami dan menunjukkan pertahanan diri dan resillience. Kami akan beristirahat di sepanjang jalan untuk membangun game, mesin rendering 2D dan 3D, dan bekerja dengan perangkat keras tertanam dalam contoh studi kasus perangkat lunak rendering dimensi dasar dan masing -masing pemijat yang bergetar elektronik dalam karet silikon. Sepanjang jalan, kami juga akan menggunakan solusi pembelajaran mesin yang sudah tersedia untuk lebih mengamankan perangkat lunak kami. Kami juga akan menggunakan alat stok yang tersedia untuk Web untuk merampingkan dan mengamankan proses. Buku ini adalah panduan untuk kesuksesan Anda dalam membangun aplikasi web dan mengintegrasikannya dengan jaringan komputer profesional dan sistem mekanik tertanam, dan secara keseluruhan panduan untuk membangun perangkat lunak dan perangkat keras tertanam tanpa pengetahuan latar belakang atau pengalaman sebelumnya.

Buku ini bukan: Jika Anda benar -benar ingin memiliki situs web, Anda bisa membuat toko sederhana dan menjual apa yang Anda butuhkan, memposting blog, memposting foto atau video, atau tanpa pernah menulis satu baris kode. Buku ini bukan itu. Buku ini akan mengajari Anda cara membangun perangkat lunak yang lebih berguna, sepenuhnya unggulan, fungsional dan aman daripada perangkat lunak apa pun yang sudah dapat Anda temukan, karena menggunakan perangkat lunak terbaru yang masih prototipe, mungkin mahal untuk dijalankan pada skala perusahaan yang lebih tua yang beroperasi, dan tidak menarik untuk mundur, perusahaan yang berbelit -belit didirikan untuk menghasilkan uang untuk orang -orang yang tidak benar -benar melakukan apa pun. Jika Anda mengikuti buku ini dengan cermat, Anda akan ingin menulis kode, kode penelitian, membangun aplikasi Anda sendiri, dan Anda akan menghasilkan uang dari apa yang Anda lakukan. Saya akan menghasilkan uang dari buku ini, bahkan pada tahap awal, karena berisi informasi yang dibutuhkan orang dan ingin membaca, dan sudah membeli ketika mereka membeli atau menggunakan aplikasi saya. This book won't build an app for you, but it will point you in the right direction and arm you with the tools you need and the skills and tips that will facilitate your own success in building software for the web, with every line of code you will need to write as an example, ready to be pieced together into software you and your supporters, guests, clientele, friends, family, visitors, contractors, and the people of the internet want to use and support.

Apa yang akan Anda pelajari: Buku ini akan mengajari Anda cara membangun dan menjual perangkat lunak, sangat fungsional, perangkat lunak yang berguna, perekaman media, fitur keamanan seperti pengenalan wajah, pemindaian kode batang zona yang dapat dibaca mesin, API Web untuk mengotentikasi, merekam dan membuat video dan foto, dan bertukar pesan seperti Bluetooth dan komunikasi Field Near Field (NFC). Buku ini akan mengajarkan Anda cara menggunakan komputer jaringan, dengan fokus pada Debian Linux, cara membangun kode bash untuk menjadikan pemasangan dan mencadangkan perangkat lunak Anda dengan angin yang mulus, otomatis, cara membangun kode python sebagai backend untuk melayani pesan dinamis, gaya -hal dengan baik menggunakan verifikasi lain dengan fitur -fitur yang berinteraksi dengan Bootstrap, memungkinkan login pengguna dan interaktivitas yang berinteraksi dengan baik, untuk melakukan verifikasi dengan versi dengan verifikasi dengan versi dengan versi dengan verifikasi dengan versi dengan versi dengan versi dengan versi dengan versi lain dengan website, mengaktifkan login pengguna dan interaktivitas interaktivitas, dengan gaya versi dengan baik, untuk verifikasi dengan verifikasi dengan versi lain dengan website dengan bootstrap, memungkinkan login pengguna dan interaktivitas interaktivitas, dengan gaya versi dengan baik dengan verifikasi dengan verifikasi dengan versi lain dengan webs. Tujuan, pemindaian ID, moderasi gambar dan video, transaksi data untuk menjaga perangkat lunak Anda aman, pemrosesan pembayaran, perdagangan cryptocurrency, tugas asinkron, dan banyak lagi. Anda akan belajar cara membangun perangkat Bluetooth Anda sendiri, dengan baterai, pengisi daya, mikrokontroler, sirkuit, motor dan sensor, menggunakan solder, kawat, dan dicetak 3D serta bahan cor. Saya akan mendemonstrasikan prinsip -prinsip desain 3D yang diterapkan pada manufaktur dan alat aditif dan pembuatan die, sehingga Anda dapat memproduksi perangkat perangkat keras tertanam Anda sendiri dengan baterai terintegrasi, pengisi daya, sirkuit elektronik, dan output fungsional. dan jaringan mereka dengan Bluetooth dan Web. Secara khusus, kami akan memeriksa dua studi kasus, pemijat yang bergetar dan senjata api buatan sendiri, keduanya diprogram di OpenScad, yang tersedia sebagai antarmuka grafis atau utilitas baris perintah dan dapat diintegrasikan ke dalam web untuk hasil yang lebih cepat. Anda akan belajar cara membangun dan menggunakan situs web dari bawah ke atas tanpa pengalaman sebelumnya, membuatnya fungsional, aman, indah, bermanfaat dan paling penting praktis. Anda akan belajar cara menggunakan pembelajaran mesin dan visi komputer untuk membuat situs aman dan lebih praktis, merekam video dan audio dari situs web Anda, menyumbangkan suara Anda, membuat musik dan memodulasi audio untuk membuat sampel yang bermanfaat, dan cara memecah kebisingan dengan memanfaatkan semua situs web lain untuk membangun jaringan terbaik yang Anda tautkan secara langsung ke Anda untuk berbagi semua informasi berguna yang Anda tawarkan, dan bahkan lebih penting lagi. Buku ini akan sangat terfokus pada media, keamanan, dan pembelajaran mesin, yang merupakan tiga komponen utama yang akan membantu Anda membangun perangkat lunak yang berguna untuk web dengan melibatkan pengguna yang tepat dan melepaskan yang salah dengan cara yang realistis, praktis, langsung dan menarik sementara juga otomatis, dan kokoh. Buku ini mengajarkan UNIX, khususnya Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript, dan sejumlah paket perangkat lunak yang berguna untuk permintaan seperti Python, serta perangkat lunak bash yang berguna seperti GIT dan FFMPEG. Saya juga akan mengajari Anda cara menukar cryptocurrency secara otomatis, dan mengambil pembayaran dalam cryptocurrency atau dari kartu debit biasa sambil bahkan membayar pengunjung Anda bagian dari pendapatan Anda jika Anda memilih untuk melakukannya. Saya akan mengajari Anda cara menghasilkan uang dari situs web Anda melalui iklan juga, cara menyiapkan aplikasi Anda untuk mesin pencari dan membuatnya cepat, peringkat peringkat pertama untuk apa yang akan dicari pelanggan Anda untuk menemukan Anda, dan peringkat dalam sebanyak mungkin pencarian umum. Saya akan mengajari Anda cara menjual perangkat lunak Anda, mengiklankannya, menarik bagi klien yang mencari layanan Anda, dan membuat nama untuk diri Anda sendiri di internet melalui jalan yang sudah ada, murah, dan bekerja dengan baik. Saya akan mengajari Anda cara menyimpan data Anda di komputer cloud yang cocok untuk Anda dan menyimpan data Anda dengan murah, cara merencanakan dan membangun situs web yang melakukan apa yang diinginkan pengguna Anda dan apa yang Anda inginkan, dan bagaimana membuat pengguna Anda tetap terlibat dengan meletakkan situs Anda ke ponsel mereka hanya dengan pemberitahuan, email, pesan teks, panggilan telepon, dan lebih banyak jalan untuk membawa pengguna Anda hanya untuk membawa kembali ke situs web Anda di situs Anda. Buku ini akan fokus pada kepraktisan menerbitkan dan mendistribusikan media dalam jumlah besar, dari teks ke foto hingga video hingga audio, membuat kesan yang baik pada pengguna akhir (klien Anda), dan menjual diri Anda dengan cara apa pun yang Anda lakukan untuk membuat situs web, aplikasi yang sebaik mungkin. Anda juga akan mempelajari beberapa tips dan trik dari saya, dari kiat pengkodean, kesombongan praktis seperti makeup dan fotografi, pemodelan dan akting, dan banyak lagi, yang akan penting untuk menggambarkan diri Anda dan perusahaan Anda dalam cahaya terbaik menggunakan semua alat yang tersedia untuk Anda sambil mendistribusikan lebih banyak konten seperti yang Anda butuhkan di seluruh keseimbangan yang sehat dari platform untuk membawa perangkat lunak Anda ke fruisi tanpa upaya lebih dari, atau lebih dari upaya, atau bekerja, atau bekerja, atau bekerja, atau bekerja, atau bekerja. Buku ini berjudul "PraktisWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Peningkatan, captioning gambar, dan tugas-tugas lain seperti metrik prediksi yang bersumber dari gambar, seperti sifat gambar sebagai gambar otentik, yang ditransfer komputer, atau salinan optik (foto yang dapat Anda lakukan, tetapi juga ada yang dikenakan pada Anda. dengan wajah Anda. menggunakan). Siapa pun yang membangun perangkat lunak yang sangat aman memiliki perasaan tentang apa yang disiratkan. Perangkat lunak secara inheren tidak aman karena perangkat dan akun yang kami gunakan untuk mengaksesnya tidak selalu siap membantu kami, mereka bisa berada di tangan siapa pun dengan niat buruk untuk perangkat lunak dan karenanya dapat menimbulkan risiko pada perangkat lunak itu sendiri. Ini adalah sesuatu dari fokus buku ini. Komputer jaringan secara default diamankan dengan token kunci yang panjang, dipanggil dan kunci shell SSH atau aman, dan sebaliknya diamankan dengan server web, karena server web menyediakan akses terbuka serta alat keamanan canggih yang berjalan di server itu sendiri. Server web memiliki akses ke browser web pengguna, yang bisa dibilang bagian paling kuat dari perangkat pengguna, karena itu adalah tempat di mana pengguna dapat mengakses perangkat lunak jaringan. Toolkit ini dapat memberikan teks, halaman web yang Anda lihat, dan juga dapat merekam gambar, audio dan video (seperti foto wajah atau ID negara), dapat membaca dan menulis ke perangkat radio Bluetooth, dan dapat membaca dan menulis ke dekat tag transponder lapangan, web yang dimasukkan ke dalam webse dan web yang dibaca dengan data yang dibaca dan dibaca dengan data, dan bahkan tag -nomor seri yang dapat dibaca. Menggunakan semua alat yang Anda miliki, dengan buku ini Anda akan melengkapi diri Anda dengan pengetahuan untuk membangun situs web yang aman, dan secara keseluruhan sistem komputer jaringan yang aman yang bekerja untuk Anda, melakukan penawaran Anda, dan terlihat dan terasa

Tempat Memulai: Anda dipersilakan untuk melewati bagian yang saya mulai buku ini, atau bagian apa pun, dengan kode tepat yang Anda butuhkan, terutama jika Anda memiliki pengalaman dengan pengkodean sebelum atau alat yang disebutkan di atas yang akan saya gambarkan secara rinci dalam buku ini serta mendokumentasikan kasus penggunaan dan contoh -contoh praktisnya. Jika Anda tidak memiliki pengalaman dalam menulis kode, saya sangat menyarankan Anda membaca semua buku ini, dan terutama merekomendasikan Anda membaca bagian sebelumnya, untuk memastikan buku ini tepat untuk Anda. Jika buku ini tidak tepat untuk Anda, pertimbangkan untuk memberi hadiah kepada teman atau kerabat yang mungkin tertarik untuk belajar tentang pengembangan web sendiri, dan bahkan mempertimbangkan untuk meminjamnya kembali dan belajar dari mereka untuk mengisi celah di mana saya gagal sebagai guru, atau guru lain yang dilakukan sebelum saya. Mulailah di mana Anda mau, setiap bagian dari buku ini akan berguna jika Anda berniat membangun aplikasi yang bermanfaat, dan menganggap bahwa aplikasi terbaik dibangun dengan mempertimbangkan pengguna akhir: Ketahui pelanggan Anda. Sekarang Anda mengenal saya, Anda tahu buku ini, dan Anda siap untuk memulai. Untuk memulai, ambil komputer (bahkan laptop termurah dari toko kotak, Amazon, atau desktop tua berfungsi, dan mengaturnya dengan cara yang cocok untuk Anda.

Cara membaca buku ini: Teks disorot, menunjukkan bahwa teks tersebut termasuk dalam prompt perintah, di mana Anda akan menulis kode yang Anda jalankan. Perintah prompt sangat terfokus ke keyboard dan membutuhkan sedikit atau tidak ada mengklik, mempercepat alur kerja Anda dan membuat segalanya lebih mudah pada Anda.

Memulai: Mari selami. Kita akan mulai dengan membangun kode di mesin lokal dan mulai tanpa membangun situs web yang terhubung ke internet. Ini lebih aman untuk memulai, tidak ada biaya, dan mudah bagi Anda. Bergantung pada sistem operasi Anda, masuk ke shell bash akan sedikit berbeda. Untuk Mac OS, saya sarankan menginstal mesin virtual pada saat ini, karena Anda akan mendapatkan kompatibilitas paling banyak dengan mesin virtual. Berbagai penyedia seperti VirtualBox dan Paralells dapat menjalankan mesin virtual untuk Anda, meskipun juga dimungkinkan untuk menginstal Ubuntu secara langsung di mesin, jika Anda lebih suka menggunakan lingkungan asli yang direkomendasikan untuk membuat pengalaman yang cepat dan ramping. Jika Anda menggunakan Linux atau Windows, yang saya rekomendasikan, harus sangat mudah untuk membuat proyek. Buka terminal Anda, sesuaikan ukuran sesuai keinginan Anda, dan mulailah mengikuti langkah 2. Jika Anda menggunakan Windows, silakan ikuti langkah 1.

Langkah 1: - Pengguna Windows saja Di Windows, buka command prompt sebagai administrator dan ketik WSL - instalasi

Langkah 2: - Lanjutkan di sini, atau lewati langkah 1 ke sini jika Anda tidak menggunakan Windows Di terminal terbuka, (tergantung pada OS Anda, yang disebut Ubuntu di Windows, Terminal di Mac atau Linux, atau nama serupa), mulailah dengan membuat proyek. Kami melakukan ini dengan perintah MKDIR, yang membuat direktori. Jika Anda perlu membuat direktori untuk menyimpan proyek Anda, yang disarankan, gunakan perintah CD untuk mengubah ke direktori dan dan dan

CD/PATH/TO/Direktori - Path adalah folder (file) yang mendahului direktori tujuan Anda, jalur default Anda adalah ~ atau/home/nama pengguna (di mana nama pengguna adalah nama pengguna Anda). Untuk mengubah ke direktori default, ketik CD atau CD ~ Contoh mkdir - ganti "contoh" dengan nama direktori

Sekarang Anda memiliki direktori yang berfungsi untuk proyek Anda. Karena sangat penting untuk disimpan direktori ini jika Anda perlu beralih ke mesin yang berbeda atau menggunakan kode yang Anda tulis sehingga siap untuk web, kami akan membangun skrip untuk mencadangkan direktori Anda dalam beberapa langkah berikutnya. Tetapi membangun skrip membutuhkan sedikit kode, dan kode harus diotomatisasi agar bermanfaat. Jadi mari kita bangun skrip untuk membuat skrip terlebih dahulu. Mari kita mulai dengan membuat skrip dan membuatnya dapat dieksekusi. Kami akan menggunakan sudo, chmod, dan menyentuh untuk ini, dan memanggil skrip "Ascript".

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

Sekarang kami telah membuat skrip, membuatnya dapat dieksekusi, dan siap mengeditnya. Nano adalah editor teks yang akan memungkinkan Anda mengedit teks tanpa mengklik, yang jauh lebih mudah daripada menggunakan antarmuka pengguna grafis. Untuk mengedit file dengan nano, gunakan nano dan kemudian jalur ke file. Untuk membuat skrip yang membuat skrip, itu cukup mirip dengan membuat skrip kami di tempat pertama. Kami akan menggunakan kode yang sama seperti di atas, mengganti nama skrip, "Ascript" dengan parameter argumen, $ 1. Ini memungkinkan kami memanggil skrip dengan mengetikkan nandript Sudo Ascript, pada titik mana kami dapat membuat skrip baru dengan mengganti "nawit" dengan nama skrip Anda. Kode di Nano seharusnya terlihat seperti:

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

Dan untuk menutup Nano, kita dapat menahan tombol kontrol dan menekan x, lalu y untuk menunjukkan bahwa kita sedang menyimpan file, dan tekan kembali. Sekarang alih -alih mengetik ketiga perintah ini untuk mengedit skrip, kita akan dapat mengetikkan sudo Ascript Ascript untuk mengedit skrip lagi. Ini berhasil! Dan skrip baru apa pun dapat dijalankan dengan mudah dengan menyebutnya di shell. Mari kita simpan pekerjaan kita sekarang: Mari kita tulis skrip cadangan untuk menyimpan skrip baru kita dan kemudian mendukungnya di direktori proyek kita, sementara juga mencadangkan skrip cadangan.

sudo ascript backup

Sekarang, di Nano:

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

Where/Path/To/Directory adalah jalur menuju proyek yang Anda buat dengan MKDIR. Kemudian kita akan belajar cara menyalin jalur berulang seperti ini dengan loop dan daftar, yang lebih sedikit kode, tetapi untuk sekarang mari kita tetap sederhana dan memiliki beberapa baris. Untuk menjalankan skrip ini dan cadangkan kode Anda, simpan file di nano dengan kontrol+x, y dan kembali, dan ketik di bawah ini ke dalam shell Anda

backup

Jika Anda diminta sama sekali untuk kata sandi saat membaca buku ini dan mengikuti di shell, silakan masukkan kata sandi pengguna Anda dengan benar, Anda akan memiliki tiga percobaan sebelum Anda perlu menjalankan kembali perintah. Anda dapat menggunakan panah atas dan bawah untuk menukar perintah dan mengeditnya, jika Anda perlu menjalankan apa pun dua kali. Sederhana tekan naik dan turun sebentar -sebentar untuk memilih perintah, sebelum mengedit perintah dengan kanan, panah kiri dan menghapus tombol serta keyboard, dan menjalankannya dengan kembali.

Selamat! Anda berhasil membuat skrip cadangan yang luar biasa yang mencadangkan dua skrip shell penting di direktori kerja Anda. Kita mungkin memindahkan barang -barang nanti karena proyek semakin besar, tetapi ini berhasil untuk saat ini. Mari kita beralih ke cadangan di cloud, kami akan menggunakan GitHub untuk ini (meskipun ada banyak solusi git lainnya untuk cadangan, semuanya hampir sama.) Git adalah perangkat lunak kontrol Verision yang memungkinkan Anda mendukung pengeditan ke perangkat lunak Anda saat Anda membuat mereka ke server, sementara juga memungkinkan Anda untuk mengunduh seluruh salinan perangkat lunak Anda di balik kata sandi atau kunci. Ini sangat berperan dalam menyimpan perangkat lunak Anda, terutama saat kami bermigrasi ke instance Linux yang mengamankan yang kadang -kadang pecah ketika satu baris kode gagal, membuat Anda terkunci sementara kode Anda mungkin tidak dicadangkan jika Anda tidak mendapatkan kesempatan untuk mendukungnya secara otomatis, yang akan kami liput.

Jika Anda belum menggunakan mesin virtual Ubuntu pada saat ini, saya merekomendasikan menggunakan mesin virtual Ubuntu pada saat ini karena itu akan membuat hidup Anda lebih mudah ketika menginstal semua paket yang diperlukan untuk membangun situs web yang berfungsi dan membentuk operasi pembelajaran mendalam di komputer Anda. Kami akan memindahkan kode ke server web dalam waktu dekat, tetapi kami ingin memastikan ada setidaknya beberapa lapisan keamanan di belakang server web kami yang tahan terhadap phishing, dan menggunakan sejumlah paket Linux untuk melakukan ini. Jika Anda masih ingin menggunakan Mac OS, Anda dipersilakan untuk mencari dan menginstal paket yang diperlukan secara online, tetapi mungkin tidak ada alternatif untuk setiap paket yang akan dicakup buku atau seri ini.

Mari kita tambahkan beberapa perintah untuk melakukan pekerjaan kita dengan skrip cadangan dengan menjalankan cadangan Cadangan Sudo Sudo.

# ...

Sekali lagi, kontrol x untuk menyimpan.

Sekarang kita perlu melakukan konfigurasi satu kali untuk proyek ini. Karena ini akan segera menjadi proyek git, kita tidak perlu mengetik setiap perintah setiap kali kita menggunakan dari repositori git, tetapi kita akan memahami ini ketika kita menulis skrip penyebaran kita. Untuk memulai, mari kita pastikan kita berada di direktori yang tepat dan menginisialisasi repositori git dan menghasilkan tombol SSH.

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

Setelah kami mengetik ssh-keygen, kunci baru harus disimpan di folder home di bawah folder yang disebut .ssh. Ini disebut id_rsa.pub. Mari kita temukan kunci ini dan salin. Untuk melihatnya,

cd ~
cat .ssh/id_rsa.pub

Salin teks yang dikembalikan oleh perintah terakhir, dan buat akun dengan penyedia git Anda (idealnya github), sebelum menambahkan kunci ssh ke akun Anda. Setelah Anda memiliki akun, klik menu kanan atas dan masukkan pengaturan, sebelum menambahkan tombol SSH Anda di tombol SSH dan GPG di bawah akses di menu. Pilih Tambahkan Kunci SSH dan tambahkan milik Anda dengan menempelkannya dan memberikannya judul, sebelum menyimpan dan kembali ke GitHub untuk membuat repositori baru. Ini serupa untuk penyedia git lainnya, Anda harus membaca dokumentasi mereka. Dalam konfigurasi repositori baru, berikan nama deskriptif repositori Anda dan putuskan apakah Anda ingin mempublikasikannya, dan pastikan untuk mengkonfigurasi belum ada file untuk dimasukkan. Setelah repositori dibuat, salin klon dengan URL SSH, dan tempel ke perintah berikut.

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

Sekarang Anda dapat kembali ke repositori Anda dengan CD, Anda akan terbiasa dengan ini. Coba skrip cadangan Anda sekarang dengan cadangan

Besar! Sekarang kita benar -benar bisa mendapatkan pengkodean. Mari kita pasang Django sekarang karena kita memiliki pemahaman yang baik tentang bash dan git. Django akan membiarkan kami secara otomatis mendukung perangkat lunak kami, Bash dapat melakukan ini juga tetapi Django harus memiliki implementasi yang lebih aman yang lebih aman (dapat dinonaktifkan dan dikonfigurasi dengan lebih mudah).

Untuk menginstal perangkat lunak di Ubuntu, kami akan menggunakan perintah sudo apt-get. Pertama, mari kita perbarui dan tingkatkan perangkat lunak yang sudah kami miliki. Ini dapat dilakukan dengan pembaruan sudo apt-get dan upgrade sudo apt-get -y. Selanjutnya, mari kita menginstal Python dan lingkungan virtual kami, rumah kode kami, dengan perintah berikut: sudo apt-get menginstal python-is-python3 python3-venv

Ini semua yang Anda butuhkan untuk pergi dengan Django dalam hal pemasangan perangkat lunak dalam contoh Ubuntu. Untuk Windows dan Linux ini harus cukup mudah, tetapi untuk Mac Anda mungkin ingin menginstal mesin virtual dan Linux di atasnya menggunakan lingkungan virtual gratis atau berbayar seperti VirtualBox atau Paralells Desktop dan menciptakan kembali langkah -langkah di atas untuk mengatur lingkungan Ubuntu. Ubuntu sangat penting dalam hal ini karena itu adalah perangkat lunak yang dijalankan situs web dan memungkinkan mereka untuk meng -host situs web dengan semua perangkat lunak yang disebutkan di atas.

Mari kita gali ke dalam Django.

Di direktori kami lagi, dengan CD:

python -m venv venv # Menciptakan lingkungan virtual di mana kode disimpan
source venv/bin/activate # Mengaktifkan lingkungan virtual
django-admin startproject mysite . # Di mana tempat saya adalah proyek yang saya mulai di direktori saya saat ini.

Django baru saja memulai, karena Django menjadi tuan rumah server web dan melakukan semua yang kita butuhkan untuk menjalankan dan menjalankan situs web lokal. Sekarang setelah kami menginstal Django, mari kita mengedit pengaturan sedikit untuk membuatnya berfungsi seperti yang kita butuhkan. Pertama, mari kita buat aplikasi baru

python manage.py startapp feed

Anda akan melihat aplikasi pertama disebut feed. Aplikasi harus dipanggil apa pun yang Anda suka, dan kami akan membuat aplikasi baru, tetapi nama setiap aplikasi harus konsisten setiap kali aplikasi dirujuk dalam kode. Untuk menambahkan aplikasi baru, kami akan selalu mengedit settings.py di direktori lain aplikasi yang dibuat, dinamai di startProject, selanjutnya aplikasi. Menggunakan nano,

nano app/settings.py

Di pengaturan, temukan installed_apps dan pisahkan [] menjadi 3 baris. Menggunakan empat spasi di garis tengah kosong, tambahkan 'feed', atau nama aplikasi Anda. Bagian dari pengaturan ini. PYPY akan terlihat seperti:

INSTALLED_APPS = [
    'feed',
]

Sebelum kita lupa, mari kita uji bahwa Django bekerja. Menggunakan perintah python kelola.py runserver 0.0.0.0:8000, kita dapat menjalankan server dan kemudian menavigasi di browser web di komputer yang menjalankan kode ke http: // localhost: 8000 dan melihat contoh halaman web (itu berfungsi!) Keluar dari server dengan kontrol c, sama seperti perintah lainnya.

Sekarang, mari kita gali menulis beberapa kode Python. Django memiliki tiga komponen utama, semuanya dijalankan dengan kode sepenuhnya. Komponen disebut model, tampilan dan templat, dan masing -masing berada pada level yang lebih tinggi dan lebih rendah masing -masing sebelum halaman web dikirimkan ke pengguna.

Model ini adalah kode yang menyimpan informasi dalam database untuk pengambilan, sortasi dan rendering.

Tampilan memutuskan bagaimana model ini diberikan, dimanipulasi, dan dimodifikasi, hampir setiap tampilan akan menggunakan model secara langsung.

Templat adalah kode HTML dengan beberapa lonceng dan peluit tambahan yang disebut bahasa template. Template diterjemahkan oleh pandangan di mana ia diisi dengan kode python dan konteks seperti model dan informasi (string dan bilangan bulat) dari tampilan.

Django juga memiliki komponen lain, termasuk tetapi tidak terbatas pada:

Pengaturan, yang mengkonfigurasi aplikasi seperti yang kita bahas.

URL, yang merupakan pola yang diikuti pengguna untuk mendapatkan akses ke bagian -bagian tertentu dari aplikasi web.

Formulir, yang menentukan bagaimana informasi yang dikirim ke server ditangani dan diterjemahkan ke database serta kepada pengguna. Ini adalah dasar dari pemrosesan informasi di sisi server, dan dapat menerima semua jenis informasi yang disimpan komputer, terutama string teks, angka, dan boolean benar/palsu (biasanya kotak centang).

Templat, yang merupakan kode HTML dan bahasa templat dan menjembatani kesenjangan antara Python dan HTML, yang berarti informasi Python dapat disajikan sebagai kode HTML yang dapat diakses siapa pun dan dapat mengamankan situs web dengan akses terbatas, sambil membuat kode Python dapat diakses ke web dan berguna untuk berbagai tujuan pada perangkat jarak jauh yang tidak perlu ada di dekat server.

File statis, yang biasanya merupakan javascript dan perpustakaan yang dilayani dan ditautkan oleh server dengan templat.

File media, yang disajikan server atau di -host secara eksternal, atau hanya ditulis ke server sebelum diproses dan diposting ke server lain (ember) untuk hosting.

Middleware, yang merupakan potongan kode yang dijalankan pada saat yang sama dengan setiap tampilan dan dianggap "termasuk" dalam tampilan.

Prosesor konteks, yang memproses konteks setiap tampilan dan digunakan untuk menambahkan konteks tambahan.

Tes, yang memvalidasi bahwa pengguna atau permintaan melewati persyaratan tertentu sebelum tampilan diberikan.

Konsumen, yang menentukan bagaimana websockets menangani dan menanggapi komunikasi.

Admin, yang digunakan untuk mendaftarkan model sehingga dapat dimanipulasi secara rinci dalam halaman admin Django, di mana basis data dapat dikelola melalui antarmuka grafis.

Celery, yang mendefinisikan tugas -bagian asinkron bagian -bagian dari kode Django dapat mulai berjalan sebelum segera melanjutkan ke tugas atau baris kode berikutnya.

Django dapat memiliki banyak komponen lain, yang akan kita bahas secara rinci di sini. Ada banyak cara untuk membuat Django lebih fungsional, menambahkan websockets, yang merupakan saluran komunikasi yang cepat dan ramping, seledri, yang mengeksekusi tugas asinkron, dan banyak perangkat lunak lainnya untuk memperluas Django, terutama dalam fungsi tampilan, di mana sebagian besar kode dieksekusi. Fungsi tampilan adalah kunci karena mereka biasanya mendeklarasikan setiap bagian kode yang khusus untuk pola URL tertentu, atau bagian dari server.

Pertama, mari kita jelajahi fungsi tampilan. Fungsi tampilan dimulai dengan impor yang menunjukkan kode yang akan digunakan dalam tampilan, dan didefinisikan menggunakan definisi atau kelas fungsi reguler. Tampilan paling sederhana didefinisikan oleh definisi definisi def, dan mengembalikan httprespons dengan templat dasar. Mari kita mulai dengan mendefinisikan pandangan dasar untuk mengembalikan teks "Hello World". Ingatlah bahwa setiap kali Anda menambahkan kode setelah pernyataan seperti DEF, jika, sementara, untuk, dll, Anda perlu menambahkan 4 ruang untuk setiap definisi sebelumnya yang ingin Anda terapkan pada fungsi Anda. Kami akan membahas apa artinya masing -masing segera.

Dari direktori situs kami, edit file feed/views.py menggunakan nano dan tambahkan baris berikut ke akhir file.

from django.http import HttpResponse

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

HTTPResponse Django merespons dengan string teks, dilambangkan dengan pembukaan dan penutupan '. Setiap kali Anda meneruskan informasi ke fungsi atau kelas, seperti permintaan atau string, Anda perlu menggunakan tanda kurung (, membuka dan menutup).

Ini belum semua yang kita butuhkan untuk melihat pandangan kita. Tentu saja, kami belum memberi tahu server di mana tampilan tepatnya, kami masih perlu mendefinisikan jalur yang harus diterjemahkan oleh tampilan. Mari kita mulai dengan mendefinisikan jalur dasar di aplikasi/urls.py, dan kita akan masuk ke grup jalur nanti.

Di App/Urls.py, tambahkan baris setelah pernyataan impor setelah awal mengimpor tampilan yang baru saja kami buat.

from feed import views as feed_views

Sekarang, mari kita tentukan pola tampilan. Pola tampilan memiliki tiga komponen, komponen jalur, yang memberi tahu server di mana tampilan ada di dalam server (jalur URL tempat pengguna mengetik ke bilah navigasi untuk memasukkan halaman web), komponen tampilan di mana tampilan ditentukan, dan nama yang ramah untuk diubah dan lebih mudah untuk diubah. Masuk akal untuk melakukan hal -hal seperti ini dan menjadi fleksibel, karena basis kode Anda akan menjadi lingkungan yang terus berubah yang membutuhkan fleksibilitas dan improvisasi agar berharga dan mudah dikerjakan. Inilah tampilan Anda nantinya, Anda dapat menambahkan ini ke urlpatterns = [bagian aplikasi/urls.py. Pola tampilan didefinisikan dengan tiga komponen yang dijelaskan di atas, dan fungsi yang disebut jalur. Pola URL Anda adalah daftar, jadi pastikan untuk selalu mengakhiri setiap item di dalamnya dengan koma, karena ini memisahkan masing -masing. Setiap item juga harus menggunakan baris baru, sekali lagi dengan empat spasi sebelumnya, seperti aplikasi di settings.py. Kami akan menentukan komponen pertama tampilan dengan fungsi string kosong, untuk membuat tampilan yang berjalan pada direktori root server web. Urls.py Anda sekarang harus terlihat seperti ini:

from feed import views as feed_views

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

Ini adalah dasar untuk membuat situs web dengan Django yang sepenuhnya statis. Untuk membuat situs web yang lebih dinamis di mana kita dapat memulai informasi caching, seperti gambar, video, audio dan banyak lagi, kita perlu menggunakan model, yang akan kita jelajahi selanjutnya. Untuk saat ini, mari kita periksa kode kami dan jalankan server. Untuk memeriksa kode untuk kesalahan, jalankan:

python manage.py check

Jika ada pesan kesalahan, Anda harus hati -hati meninjau perubahan yang Anda buat ke aplikasi Anda dan melihat apakah ada sesuatu yang perlu diperbaiki, seperti ruang asing atau kurang, karakter tambahan, string yang tidak tertutup, kesalahan ketik apa pun, karakter apa pun yang dihapus secara tidak sengaja, atau apa pun. Membaca pesan kesalahan (jika Anda memilikinya), Anda harus dapat melihat jalur ke file yang Anda buat atau edit bersama dengan nomor baris, jadi lihat ke dalam file dan baris itu dan lihat apakah Anda dapat memperbaiki apa pun yang ada di sana. Jika Anda telah memperbaiki masalah, jalankan perintah di atas lagi. Ketika perangkat lunak Anda siap berjalan dan berfungsi, Anda akan melihat output "Pemeriksaan sistem diidentifikasi tidak ada masalah." Sekarang Anda siap untuk pergi. Jalankan server dengan:

python manage.py runserver 0.0.0.0:8000

Sekarang buka browser web dan navigasikan ke http: // localhost: 8000. Anda harus melihat teks yang dikembalikan dalam tanda kurung dan kutipan fungsi HTTPRESPONSE dalam pandangan Anda. Ini hanya contoh dasar, tetapi jika Anda berhasil sejauh ini, Anda memahami dasar -dasar bagaimana Linux, Bash, Python, dan Django bekerja. Mari kita gali lebih dalam dalam beberapa pemodelan basis data, dan jelajahi kekuatan kelas Python dalam menyimpan informasi. Kemudian, kita akan mulai menguasai HTML dan CSS sebelum kita membuat situs kita sepenuhnya ditampilkan, fleksibel dan aman menggunakan JavaScript dan pembelajaran mesin.

Kelas disimpan di model.py aplikasi Anda. Menggunakan nano, edit aplikasi/model.py dan tambahkan kelas baru. Kelas didefinisikan dengan definisi kelas dan disahkan superclass yang diwarisi, dalam hal ini model.model. Nama kelas muncul setelah definisi kelas, dan setelah definisi kelas A: (usus besar) digunakan, sebelum atribut dan definisi fungsi yang terkait dengan kelas dilambangkan di bawah ini. Kelas kami membutuhkan ID yang dapat kami gunakan untuk mengambilnya dan membuatnya unik, dan juga membutuhkan bidang teks untuk menyimpan beberapa informasi. Kemudian kita dapat menambahkan cap waktu, file, boolean (definisi benar atau salah yang dapat membantu kode kita membuat keputusan tentang apa yang harus dilakukan dengan model, dan dapat digunakan untuk mengurutkannya), sebuah instance untuk mengikat model ke pengguna yang masuk ke server, dan banyak lagi. Mari kembangkan kode di bawah ini:

from django.db import models # Impor yang digunakan untuk mendefinisikan kelas kami dan atributnya
class Post(models.Model): # Definisi kelas kita sendiri
    id = models.AutoField(primary_key=True) # ID dari model kami, kunci yang dihasilkan secara otomatis yang akan memungkinkan kami menanyakan model, tetap unik, dan berguna ketika kami perlu berinteraksi dengan model setelah dibuat.
    text = models.TextField(default='') # Atribut toko kelas kami, dalam hal ini, beberapa teks, default ke string kosong.

Tutup dan simpan file seperti yang kami lakukan sebelumnya untuk menyelesaikannya.

Ada banyak bidang dan opsi lain yang akan kami jelajahi ketika kami memperbarui kelas ini seiring perkembangan aplikasi kami, tetapi ini adalah kebutuhan dasar untuk membuat aplikasi untuk memposting beberapa teks. Namun, model ini tidak akan bekerja sendiri. Seperti yang dijelaskan sebelumnya, kami akan membutuhkan tampilan khusus dan pola URL khusus untuk membuat model ini berfungsi, dan kami juga membutuhkan formulir bersama dengan templat. Mari kita jelajahi formulir terlebih dahulu.

Untuk mendefinisikan formulir, edit aplikasi/forms.py dengan nano dan tambahkan baris berikut. Kami akan membutuhkan dua impor, kelas formulir kami, serta model yang kami buat (feed.models.post), definisi kelas yang mirip dengan model, dan bidang bersama dengan subkelas yang disebut meta yang akan menentukan model yang berinteraksi dengan formulir. Formulir ini juga dapat memiliki fungsi inisialisasi yang mengaturnya berdasarkan informasi dalam permintaan, model atau sebaliknya, kami akan mengeksplorasi ini nanti.

Bentuk model sangat berguna karena mereka dapat membuat model atau juga mengedit model, jadi kami akan menggunakannya untuk keduanya. Mari kita tentukan satu di forms.py di bawah ini.

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

Ini adalah dasar dari seperti apa bentuk dan model itu. Bentuk model ini dapat digunakan untuk membuat instantiate atau mengedit posting, mengubah teks yang dikandungnya. Kami akan melihat mengintegrasikan formulir ini ke dalam tampilan berikutnya. Pertama, mari kita buat migrasi dan migrasi database sehingga kode kita dapat berinteraksi dengan model saat berjalan. Untuk melakukan ini, jalankan perintah berikut:

python manage.py makemigrations
python manage.py migrate

Ini akan memakan waktu satu menit untuk dieksekusi, tetapi begitu terjadi, itu akan memungkinkan Anda untuk mengakses model di tampilan, middleware, atau di mana pun di perangkat lunak. Mari kita lanjutkan dengan membuat tampilan di mana kita dapat melihat model kita. Edit feed/views.py dan tambahkan kode berikut, sebagaimana dicatat. Anda tidak perlu menambahkan apa pun setelah tanda #, kode itu adalah komentar yang digunakan untuk menunjukkan informasi tentang kode tersebut. Kami akan mulai dengan mengimpor model kami dalam tampilan, dan menambahkannya ke konteks di mana kami dapat menjadikannya dalam templat sebagai daftar untuk ditampilkan. Selanjutnya, kami akan menambahkan templat di mana kami dapat membuat formulir dan model dengan tombol untuk membuat objek baru berdasarkan model dan mempostingnya ke server. Ini kedengarannya rumit, jadi mari kita ambil langkah demi langkah. Sebelum kita menyelesaikan tampilan, mari kita buat templat yang hanya membuat model dan pastikan kita dapat melihatnya dengan membuat posting baru di shell. Beginilah tampilan itu seharusnya:

    posts = Post.objects.all() # Permintaan semua posting dalam database sejauh ini

Ini semua terlihat sangat sederhana sampai kita sampai ke bawah. Render, nilai yang dikembalikan oleh fungsi alih -alih dalam respons HTTP seperti contoh sebelumnya, selalu mengambil permintaan sebagai input pertama, menerima konteks (dalam hal ini posting dalam database), yang sekarang dapat diterjemahkan dalam templat, dan mengembalikan templat yang ditentukan dalam fungsi. Templat akan menjadi dokumen HTML dengan sedikit bahasa yang disebut Jinja2, yang menjadikan informasi Python ke dalam HTML.

Untuk mulai membuat template, buat dua direktori dalam feed.

mkdir feed/templates
mkdir feed/templates/feed

Selanjutnya, edit templat di direktori di atas, umpan/templat/pakan, dan tambahkan kode untuk contoh ini. Mari kita lihat templat untuk contoh ini.

Ini adalah templat yang sangat sederhana. Ini mendefinisikan pembukaan dan penutupan tag HTML, tag tipe dokumen, tag tubuh dengan judul legenda, tag break yang menambahkan garis kecil di layar, dan loop yang membuat setiap posting dalam daftar posting sebagai paragraf di templat. Hanya ini yang diperlukan untuk membuat posting, tetapi belum ada dalam database. Mari kita buat beberapa dengan shell. Kita bisa menjalankan shell dengan kelola.py

python manage.py shell

Sekarang, mari kita impor model posting kita

from feed.models import Post

Selanjutnya, kami akan membuat posting sederhana dengan string dan keluar dari shell. String bisa apa saja, selama itu teks yang valid.

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

Terakhir, kita perlu menambahkan pola URL ke pakan kita. Karena aplikasi umpan kami akan menggunakan beberapa URL dan kami ingin menjaga ukuran file kecil, mari kita buat URLS lokal di aplikasi feed kami yang terlihat seperti ini:

from django.urls import path
from . import views

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

Kami juga perlu mengedit urls.py di aplikasi dasar, apa pun yang kami putuskan untuk menyebutnya, ini adalah direktori pertama yang kami buat. Edit aplikasi/app.py dan tambahkan yang berikut ini ke pola URL

from django.urls import include # di atas
    # ... kode sebelumnya di sini

Sekarang, ketika kami menjalankan server dengan python manager.py runserver, kami akan melihat halaman yang kami buat karena kami memiliki model, tampilan dan templat serta pola URL, bersama dengan item dalam database. Selanjutnya, mari kita terapkan formulir yang kami buat dan mulai membuat posting kami sendiri. Tetapi sebelum kita menulis terlalu banyak kode, mari kita buat cadangan menggunakan skrip yang kita tulis sebelumnya, cadangan. Jalankan skrip ini di shell, tunggu beberapa saat, dan semua kode akan didukung ke repositori git kami.

backup

Menerapkan formulir relatif sederhana. Kami akan mengimpor formulir kami, menambahkan penangan permintaan pos ke tampilan, dan menyimpan pos di database sebelum mengarahkan ulang ke tampilan yang sama. Kita dapat menggunakan fungsi pengalihan yang sudah kita impor, dan fungsi lain yang disebut terbalik untuk mendapatkan URL untuk pola tampilan. Kami akan menanyakan ini dengan string 'feed: feed' karena namespace dari pola yang disertakan adalah umpan, dan pandangan juga disebut feed.

    posts = Post.objects.all() # Permintaan semua posting dalam database sejauh ini
    if request.method == 'POST': # Tangani Permintaan Posting
        form = PostForm(request.POST) # Buat instance formulir dan simpan data untuk itu
        if form.is_valid(): # Validasi formulir
            form.save() # Simpan objek baru
        return redirect(reverse('feed:feed')) # Redireksi ke URL yang sama dengan permintaan GET
        'form': PostForm(), # Pastikan untuk meneruskan formulir ke dalam konteks sehingga kita dapat membuatnya.

Sekarang, kita perlu memperbarui templat untuk memperhitungkan formulir baru. Kita bisa melakukan ini dengan menggunakan

Tag dalam html dan render formulir di template html dengan tombol kirim. Kami juga akan membutuhkan token CSRF, token yang mencegah situs eksternal dari posting ke formulir tanpa terlebih dahulu memuat halaman.

Mari kita hancurkan ini. Ada kelas bentuk baru, token, formulir itu sendiri, dan tombol kirim. Cukup sederhana, tetapi ketika kita melihatnya, kita mungkin ingin membuatnya terlihat lebih baik. Ini berfungsi, kami dapat memposting posting baru dengan formulir dan sekarang disimpan dalam database. Ada beberapa hal yang terjadi di sini. Kami menggunakan tag HTML untuk menyatakan bahwa dokumen tersebut adalah dokumen HTML, kami menggunakan tag template ({ % ... %}) untuk membuat token untuk formulir, dan yang lain, {{...}} untuk membuat formulir. Kami juga memiliki loop untuk membuat teks menggunakan tag blok dan tag template. Tag blok sangat penting karena kita dapat mendefinisikan bagaimana bagian dari template diterjemahkan dengan mereka, dan tag template adalah dasar dari bagaimana kita memasukkan variabel ke dalam kode kita.

Sekarang kita perlu membuat aplikasi kita terlihat lebih baik, karena untuk saat ini terlihat sangat mendasar. Kita dapat melakukan ini dengan menggunakan CSS, baik inline, atau di kelas yang terikat pada setiap objek dalam dokumen. CSS sangat bagus karena menceritakan semuanya di halaman bagaimana tampilannya, dan bisa membuatnya terlihat sangat bagus. Ada beberapa perpustakaan yang dapat melakukan ini, tetapi orang saya pergi adalah Bootstrap.

Bootstrap dapat diunduh dari situs web mereka,getbootstrap.com/. Sesampai di sana, tekan tombol untuk membaca dokumen instalasi, dan salin kode dari bagian include via CDN. Anda akan memerlukan kode ini di bagian atas dokumen HTML Anda, dalam tag yang disebut head. Juga, mari kita lanjutkan dan buat template dasar sehingga kita tidak perlu membuat ulang tautan ini di setiap templat.

Buat direktori baru yang disebut templat dengan template mkdir, dan kemudian edit templat/base.html.

Seharusnya terlihat seperti ini:

Pastikan untuk menyalin file CSS dan JavaScript, file .css dan .js, karena kami akan membutuhkan JavaScript untuk membuat situs kami lebih fungsional di masa mendatang.

Sekarang, mari kita kembali ke shell bash dan jalankan perintah cepat. Ingat, jika Anda perlu mengakses lingkungan virtual, ketik sumber venv/bin/aktifkan. Ini akan memungkinkan Anda menginstal paket Python secara lokal dengan cara yang memungkinkan Django mengaksesnya. Untuk memberikan formulir kami yang dihasilkan oleh kelas bootstrap Django, kami akan menggunakan paket Python yang disebut Formulir Crispy. Kami dapat mengunduh ini dengan perintah berikut

pip install django-crispy-forms

Setelah ini diinstal, tambahkan ke settings.py

    # … Kode sebelumnya di sini

Sekarang, kembali ke template umpan kami, kami dapat menghapus beberapa hal. Mari kita hapus awal dan akhir dokumen dan ganti dengan warisan dari templat dasar kita, menggunakan Extends dan definisi blok. Juga, kami akan menambahkan impor filter templat dengan beban dan filter templat ke formulir. Terakhir, mari kita tambahkan kelas bootstrap ke tombol pada formulir agar terlihat lebih seperti tombol. Itu seharusnya terlihat seperti ini:

Cantik! Itu sudah sedikit kode. Selanjutnya, kita harus mengujinya dan memastikan kita dapat melihat bahwa semuanya terlihat bagus, dan juga pastikan semuanya berfungsi dengan baik. Jalankan server sesuai instruksi sebelumnya dan pastikan situsnya terlihat dan berfungsi dengan baik. Kerja bagus! Anda siap untuk melanjutkan ke langkah berikutnya, di mana kami akan menambahkan fungsi login pengguna menggunakan URL, formulir, tampilan, dan templat yang serupa. Template dasar penting, dan kami akan terus memodifikasinya dan membuat perubahan sesuai kebutuhan, tetapi untuk saat ini mari kita fokus membuat situs kami lebih aman, dengan memungkinkan pengguna untuk masuk dengan nama pengguna dan kode sandi, dan pada akhirnya bahkan lebih banyak informasi penting yang akan membantu menjaga aplikasi Anda tetap aman dan akun Anda sendiri hanya dapat diakses oleh Anda.

Untuk melakukan ini, kita perlu menggunakan model pengguna yang dibangun ke dalam Django. Model pengguna adalah model database, seperti posting kami, yang dapat diterjemahkan untuk mencatat pengguna ke situs web. Di masa depan, sebelum kami menggunakan situs ke internet, kami akan memperluas model ini dengan model lain yang dikaitkan dengannya, dan membangun langkah -langkah keamanan tambahan untuk login yang resisten terhadap phishing. Kami akan mulai dengan menggunakan beberapa formulir login bawaan yang disediakan Django. Pertama, mari kita buat aplikasi baru yang akan kita gunakan untuk membuat templat dan tampilan untuk halaman login dasar. Kami juga akan membuat aplikasi lain untuk mewakili tantangan login yang berkelanjutan untuk mengamankan aplikasi, termasuk pincode, pengenalan wajah, komunikasi dekat lapangan, perangkat eksternal, otentikasi multi -faktor, dan pengenalan sidik jari.

Kami sudah berbicara tentang memulai aplikasi. Dari direktori kami, di dalam lingkungan virtual, lulus kelola.py argumen ini

python manage.py startapp users

Sekarang, kita harus memiliki direktori untuk aplikasi baru. Mari kita mulai dengan membuat tampilan di direktori yang sesuai dengan login pengguna. Django telah membangun tampilan untuk login pengguna, tetapi ini tidak akan cocok untuk kita karena kita membutuhkan tampilan khusus, yang lebih disukai dilakukan dengan definisi.

Dalam tampilan ini, kami akan mulai dengan memeriksa permintaan POST, lulus permintaan.

Di pengguna/views.py, tambahkan kode berikut

        username = request.POST['username'] # Dapatkan nama pengguna dan kata sandi dari permintaan posting
        password = request.POST['password'] # Mengotentikasi pengguna

Ini semua yang Anda butuhkan untuk tampilan login dasar. Sekarang, mari kita buat formulir untuk tampilan dengan memperluas template dasar. Kami akan mulai dengan membuat direktori baru untuk templat di folder pengguna.

mkdir users/templates
mkdir users/templates/users

Sekarang, kita harus dapat mengedit pengguna/templat/pengguna/login.html. Sementara kami melakukannya, kami akan membuat templat untuk memungkinkan pengguna juga mendaftar.

nano users/templates/users/login.html

Sekarang, di template,

Ini adalah dasar -dasar templat login. Ini benar -benar seperti templat lain dalam struktur, tetapi terlihat sedikit berbeda ketika diterjemahkan. Kami dapat menyalin kode ini untuk membangun templat lain yang sangat mirip yang disebut register.html, di mana kami akan mengubah kata -kata dan menggunakan formulir baru yang kami bangun. Mari kita buat template dulu. Edit pengguna/templat/pengguna/register.html dan tambahkan kode berikut:

Sekarang, mari kita bangun formulir untuk pendaftaran pengguna kami dan lingkari kembali ke tampilan sebelum kami meningkatkan login pengguna kami dengan model. Kami akan membuat formulir ini dasar untuk memulai, tetapi menggabungkan lebih banyak detail dan fitur keamanan seperti perjanjian dan captcha di masa depan. Edit formulir dengan pengguna nano/forms.py, dan tambahkan kode berikut.

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

Jadi kami memiliki formulir lain di sini, yang berfungsi cukup sederhana. Ini adalah formulir daftar pengguna dengan nama pengguna, email dan kata sandi, serta bidang kata sandi konfirmasi. Perhatikan bahwa formulir ini tidak memperpanjang formulir reguler. Kelas bentuk, ini adalah bentuk model yang berarti memiliki meta. Satu bidang didefinisikan sama, dan meta kelas mendefinisikan model formulir sesuai dengan sisa informasi yang akan ditulis ke formulir. Sebagian besar sudah ada di Django yang dibangun di UserCreationForm, jadi kami akan menggunakannya sebagai dasar untuk kelas (diteruskan dalam tanda kurung).

Selanjutnya, kami akan memeriksa tampilan untuk mendaftarkan pengguna, sekarang kami memiliki formulir dan templat. Ini adalah modelform, seperti yang ada di tampilan posting baru. Edit pengguna/views.py dan tambahkan kode berikut:

# … Impor

Hanya ini yang kita butuhkan untuk mendapatkan pengguna yang terdaftar, tetapi kita harus memiliki lebih banyak informasi. Kami ingin mengetahui waktu yang didaftarkan pengguna, jam berapa mereka terakhir di Situs, beberapa informasi tentang mereka, seperti biografi, zona waktu, dll. Kami juga perlu memperbarui model umpan kami, memposting, untuk memperhitungkan model pengguna dan atribut posting untuk setiap pengguna. Untuk melakukan itu, kami akan memperbarui model.py di kedua aplikasi. Mari kita mulai dengan mengedit model umpan. Ini seharusnya terlihat seperti ini sekarang:

from django.db import models # … Impor
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Tambahkan baris ini

Perhatikan baris kedua yang ditambahkan ke file. Ini adalah kunci asing, yang akan mengaitkan setiap posting dengan satu pengguna per posting, sehingga kami dapat memastikan bahwa kami menyimpan posting berdasarkan pengguna per pengguna dan tidak ada posting yang dapat dilakukan tanpa menghubungkannya dengan pengguna. Kami mendefinisikan kunci asing ini dengan kelas yang diwakilinya, argumen penghapusan untuk memastikan posting dihapus dengan pengguna, nol dan argumen kosong untuk memastikan kami dapat menghapus pengguna jika perlu, dan untuk mengakomodasi kurangnya pengguna pada posting yang sudah kami buat, dan nama terkait, yang dapat kami gunakan untuk merujuk ke objek pos yang dibuat pengguna. Nama terkait ini, tidak seperti Post.Author, penulis posting, memberi kami pengguna yang memposting posting itu sendiri. Kami sekarang dapat mendapatkan posting yang dibuat pengguna dengan menjalankan user.posts.all (), atau worit.posts.all ().

Sekarang, mari kita buat login kita lebih tangguh. Kami sudah dapat membuat situs kami jauh lebih rentan terhadap phishing hanya dengan membatasi berapa kali kami akan mengizinkan login ke situs, ini cukup mudah. Mari kita juga mulai menyimpan beberapa informasi tentang setiap pengguna sebelumnya karena kami terus mengembangkan aplikasi kami. Mengedit pengguna/model.py, tambahkan kode berikut.

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

Perhatikan bahwa model ini cukup mirip dengan model POST. Kami memiliki impor tambahan, TimeZone, yang akan memungkinkan kami untuk menetapkan default di bidang DateTime, dan kami juga memiliki karakterfeild dan textfield seperti posting. Menggunakan semua cap waktu ini membantu kami mengamankan situs dan memahami penggunaannya, dan bidang teks memungkinkan kami memberikan informasi tentang setiap pengguna, atau penulis, di situs web. OneToonefield harus menjadi satu -satunya pertimbangan kecil, itu berperilaku persis sama dengan ke depan tetapi dengan hanya satu model selanjutnya. Dengan cara ini, pengguna hanya memiliki satu profil, sementara mereka mungkin memiliki banyak posting.

Sekarang, mari kita tingkatkan login kami dan daftarkan tampilan untuk memperhitungkan profil. Pertama, edit pengguna/views.py dan fokuslah pada tampilan register:

# … Impor
            Profile.objects.create(user=user) # Pastikan untuk menambahkan baris ini, untuk membuat profil untuk pengguna

Ini hanya membuat profil untuk pengguna, tanpa mengisi informasi apa pun. Sekarang, kami ingin memastikan akun pengguna tidak dapat terlalu sering masuk, atau setidaknya kata sandi tidak dapat dicoba terlalu sering, jadi mari kita perbarui tampilan login.

# … Impor
        if user and user.profile.can_login < timezone.now(): # Perhatikan bahwa kami sekarang memeriksa apakah pengguna dapat masuk
        else: # Jika login tidak berhasil,
            user = User.objects.filter(username=username).first() # Ini adalah bagian di mana kami memperbarui profil pengguna
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Jadi mereka tidak bisa masuk lagi selama beberapa detik

Ini adalah dasar dasar keamanan. Pastikan situs tidak rentan terhadap seseorang yang hanya mencoba setiap kombinasi kata sandi yang mungkin, atau bahkan beberapa di antaranya pada saat yang sama. Ini tidak akan membuat frustrasi bagi pengguna biasa yang mengetahui kode sandi mereka dan hanya masuk pada beberapa perangkat, tetapi itu akan membuat banyak robot phishing keluar dari aplikasi. Perhatikan bahwa kami menambahkan pernyataan IF dengan variabel, can_login, yang seharusnya menjadi waktu di masa lalu, dan memperbarui dengan masing -masing login yang gagal menggunakan nama pengguna yang sama. Dengan cara ini, pengguna jahat tidak akan bisa menebak kata sandi di mana pun dengan cepat. Jumlah detik dalam datetime.timedelta () juga dapat diperbarui, dan situs web akan lebih tangguh namun sedikit kurang dapat digunakan dengan lebih banyak detik. Saya merekomendasikan 15 untuk memulai.

Ingat, kami membangun skrip cadangan untuk menyimpan pekerjaan kami, jadi mari kita lanjutkan dan mendukung apa yang kami miliki sejauh ini untuk memastikan kami memiliki segalanya yang disimpan. Jalankan perintah:

sudo backup

Sekali lagi, ini akan menyimpan pekerjaan Anda sejauh ini. Saya sarankan menjalankan cadangan yang sering untuk menyimpan pekerjaan Anda, dan Anda bahkan mungkin ingin menjalankan pekerjaan cadangan secara otomatis. Anda dapat melakukan ini dengan menggunakan utilitas UNIX yang disebut Cron. Untuk mengaktifkan utilitas ini, jalankan perintah berikut dan masukkan kata sandi Anda:

sudo crontab -e

Jika Anda belum memilih Opsi 1 untuk Nano, editor teks yang harus Anda kenal, dan gulir ke bagian bawah file menggunakan tombol panah. Tambahkan baris berikut:

0 * * * * sudo backup

Cron menggunakan format menit, jam, hari bulan, bulan, hari dalam seminggu, di mana A * atau angka mewakili kapan harus menjalankan perintah. Menggunakan 0 untuk menit dan * untuk sisa opsi, kami dapat menjalankan perintah pada menit pertama setiap jam di awal menit. Ini memungkinkan kami mendukung kode secara otomatis. Semua pekerjaan Cron ketika dieksekusi dengan sudo berjalan sebagai root, jadi kita tidak perlu mengetikkan kata sandi setiap jam.

Untuk membuatnya lebih mudah untuk mencadangkan kode kami tanpa menggunakan kata sandi, mari kita nonaktifkan kata sandi untuk perintah cadangan kami. Kami akan melakukan ini dengan menjalankan perintah berikut dan memasukkan kata sandi:

sudo visudo

Sekarang, mari gulir ke bagian bawah file dan tambahkan baris lain:

ALL ALL=NOPASSWD: /bin/backup

Ini memungkinkan kami menjalankan perintah "cadangan" sebagai pengguna mana pun, tanpa kata sandi. Format untuk ini mudah, cukup awalkan garis dengan "all all = nopasswd:/bin/" dan akhiri dengan perintah, misalnya/bin/cadangan, yang ada di/usr/bin/.

Sekarang, mari kita mulai bekerja dengan email. Email sangat penting untuk situs web, karena ini cara untuk menjaga situs web lebih aman, memverifikasi pengguna adalah orang sungguhan, dan bahkan memasarkan produk atau layanan kepada pelanggan. Banyak orang yang sering mengunjungi internet memeriksa email mereka setiap hari, dan menerima segala macam email pemasaran tentang produk dan layanan yang mereka minati. Ada beberapa opsi dalam hal memungkinkan email di situs web Django, dan Anda dipersilakan untuk memilih mana yang paling cocok untuk Anda.

Pertama, Anda dapat membayar layanan email yang akan memungkinkan Anda untuk mengirim email dari domain Anda dan membutuhkan kode minimal. Ada banyak layanan yang menawarkan ini, seperti Google Workspace, SendinBlue, Mailgun, dan banyak lagi.

Jika tidak, Anda tidak akan membangun layanan email Anda sendiri di dalam server Anda dari awal. Saya merekomendasikan opsi ini, meskipun lebih banyak kode dan mungkin memerlukan hosting khusus. Anda tidak akan dapat memulai server surat dari komputer rumah Anda kemungkinan besar, jadi mari kita lanjutkan dan periksa konfigurasi dan kode untuk mengirim email sebelum kami memulai server di cloud dan membuat server surat kami sendiri di dalam.

Pertama, edit settings.py dengan perintah berikut:

nano app/settings.py

Di mana aplikasi adalah nama aplikasi yang Anda buat dengan StartApp.

Tambahkan baris berikut:

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)

Pastikan untuk mengubah ini saat Anda siap untuk menggunakan aplikasi Anda, kami akan meninjau kembali ini nanti. Pengaturan email_address harus berupa email yang ingin Anda kirim, dan kata sandi (email_host_password) harus disetel ke kata sandi yang Anda hasilkan untuk server. Saya memuat kata sandi dari file konfigurasi untuk menjauhkannya dari kode menggunakan logika berikut, di atas baris ini di settings.py:

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

Kemudian, saya telah mengatur file JSON dengan konfigurasi di /etc/config.json menggunakan nano sebagai berikut.

Untuk mengedit file:

sudo nano /etc/config.json

Tambahkan baris berikut:

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

Kami akan terus mengedit file konfigurasi dan menambahkan semua kata sandi dan kunci yang akan kami gunakan di aplikasi. Untuk saat ini, mari kita periksa cara mengirim email dengan cepat menggunakan Python. Pertama, mari kita buat templat untuk email verifikasi yang dapat kami kirim ke pengguna kami, dan letakkan di direktori Template Pengguna. Template ini akan ditulis dalam HTML.

nano users/templates/users/verification_email.html

Email ini cukup sederhana. Dibutuhkan konteks pengguna, URL dasar untuk situs, dan ID pengguna dan token yang digunakan untuk memverifikasi email pengguna. Pastikan untuk mendefinisikan URL dasar di settings.py sebelum kita menulis beberapa kode Python untuk membuat template. Silakan dan tambahkan baris berikut ke app/settings.py, dekat awal.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Akhirnya, ketika situs Anda siap untuk internet dan Anda menggunakannya, Anda ingin mendefinisikan domain Anda sebagai nama domain yang Anda beli untuk mewakili situs. Ini adalah nama yang akan Anda ketik di navbar untuk mengakses situs Anda. Untuk saat ini, Anda dapat membiarkan domain kosong atau menggunakan placeholder. Anda juga ingin mengubah situs_name menjadi nama yang ingin Anda berikan kepada situs Anda, pilihan Anda.

Sebelum kami mengirim email, mari kita buat generator token sehingga kami dapat memiliki token aktivasi akun yang tidak pernah kedaluwarsa. Kita dapat melakukan ini dengan membangun dan mengimpor token aktivasi akun yang terlihat seperti berikut. Edit file:

nano users/tokens.py

Tambahkan kode berikut:

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

Generator token dasar ini menghasilkan token yang dapat kami kirimkan kepada pengguna dalam URL dan pengguna dapat menggunakan untuk memverifikasi email mereka dan mengaktifkan akun mereka.

Selanjutnya, mari kita lihat cara mengirim email. Menggunakan Nano, edit pengguna/email.py.

nano users/email.py

Mengirim email verifikasi html akan terlihat seperti ini:

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)

Ini cukup sederhana. Kami mengimpor fungsi yang kami butuhkan untuk mengirim email, membuat email dengan templat, dan pengaturan kami, dan kemudian kami menentukan email dengan nama templat dan mengirimkannya ke pengguna menggunakan fungsi. Anda akan melihat kami belum menentukan fungsi untuk mengirim surat, send_html_email, jadi, jadi mari kita tulis ini di bawah kode yang sudah kami tambahkan ke pengguna/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()

Ini sedikit lebih kompleks, dan kami belum siap menjalankan semua kode ini. Perhatikan kami mendefinisikan unsub_link, tautan yang dapat digunakan pengguna untuk berhenti berlangganan dari email kami. Ini penting, karena pengguna harus dapat memilih keluar dari email kami kecuali mereka ingin melihatnya, kapan saja. Kami juga menambahkan alternatif teks ke pesan kami, yang merupakan pesan HTML yang dilucuti dari tag HTML. Terakhir, kami memeriksa apakah email dikirim, dan jika tidak, kami menandai di profil pengguna bahwa email mereka tidak valid.

Mari kita kembali ke model pengguna sehingga kita dapat membuat ini semua berfungsi. Kita perlu mendefinisikan fungsi untuk menghasilkan tautan untuk berhenti berlangganan, dan mendefinisikan bidang Boolean untuk menandai bahwa email pengguna tidak valid.

Pertama, tambahkan impor berikut ke bagian atas pengguna/model.py

nano users/models.py
# ...

Selanjutnya, mari kita tambahkan fungsi ke model pengguna untuk membuat token dan periksa token yang digunakan untuk mengaktifkan email, serta bidang untuk menyimpan apakah pengguna berhasil menerima surat mereka. Di pengguna/model.py lagi, tambahkan kode berikut ke akhir model (kode indentasi)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Berlaku selama 30 hari

Ini cukup sederhana, kami menggunakan timestampSigner, yang merupakan alat kriptografi dasar, untuk membuat token yang akan kedaluwarsa setelah waktu tertentu, dan kami juga menggunakan fungsi lain untuk memeriksa apakah itu valid. Kami menggunakan token ini dua kali, sekali untuk memverifikasi email, dan sekali untuk tautan berhenti berlangganan.

Sekarang kita memiliki ini, pekerjaan terakhir yang perlu kita lakukan adalah dalam pandangan. Di dalam pengguna/views.py, mari tambahkan tampilan untuk memverifikasi alamat email, dan untuk berhenti berlangganan.

nano users/views.py

Pertama, tambahkan impor berikut. Saya melemparkan beberapa tambahan sehingga kami tidak perlu mengimpor lebih banyak item lagi nanti.

from .email import send_verification_email # Pastikan untuk mengimpor fungsi pengiriman email verifikasi

Anda mungkin sudah memiliki beberapa impor ini, tetapi tidak ada salahnya untuk mengulanginya. Anda perlu mengimpor fungsi pengiriman email verifikasi, serta account_activation_token dari pengguna. Tokens, di antara impor lainnya.

Sekarang, di bagian bawah file, tambahkan kode berikut:

        # berhenti berlangganan mereka
    # Jika tidak, redirect ke halaman login
# sendwelcomeemail (permintaan, pengguna)

Ini banyak kode. Mari kita hancurkan. Fungsi pertama, bersih dan sederhana, berhenti berlangganan pengguna dari milis. Fungsi kedua mengaktifkan email mereka, dan Anda akan melihat saya menambahkan fungsi yang dikomentari, SendWelcomeemail. Anda dipersilakan untuk menggunakan templat email dan definisi fungsi untuk mengirim email selamat datang, saya belum melakukannya. Fungsi terakhir yang saya lemparkan adalah penting, karena email aktivasi kedaluwarsa. Oleh karena itu, kita perlu mengirimkan kembali email aktivasi beberapa waktu. Kami dapat menggunakan formulir dasar untuk ini, dan memanggil fungsi untuk mengirim email verifikasi. Sebelum kita melakukan ini, mari kita pastikan itu akan dikirim ke tempat pertama, dengan menambahkan panggilan fungsi ke tampilan register. Tambahkan baris ini tepat sebelum pengalihan di tampilan register, DEF Register, di pengguna/views.py.

nano users/views.py
# … (Setelah) Def Register (permintaan):
# ... (Sebelum) Redirect (

Anda tidak perlu menambahkan baris pertama dan terakhir dalam cuplikan kode itu, pastikan tampilan register mengirimkan email verifikasi ke pengguna. Seharusnya terlihat seperti ini:

# … Impor
            send_verification_email(user) # Pastikan untuk menambahkan baris ini!

Sekarang, kita perlu menambahkan formulir untuk mengirimkan kembali email aktivasi. Di pengguna/forms.py, tambahkan formulir berikut:

# … (Impor)

Kami juga membutuhkan templat yang sesuai dengan formulir aktivasi email ini. Mari kita tambahkan template ini. Edit file:

nano users/templates/users/resend_activation.html

Selanjutnya, tambahkan kode berikut ke file.

Wah, itu banyak! Sekarang, ketika kami menggunakan kode ke server kami, kami akan dapat mengirim email HTML dan mengaktifkan akun pengguna dengan klik di email. Kami juga mungkin ingin mengirim email selamat datang sederhana, jadi mari kita lihat bagaimana melakukannya. Kembali ke pengguna/email.py, tambahkan kode berikut:

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)

Juga, kami akan membutuhkan templat untuk membuat semua informasi ini. Di situs web saya, template terlihat seperti di bawah ini, tetapi Anda dipersilakan untuk memformatnya sesuka Anda.

Perhatikan bahwa kami tidak memiliki tag bodi atau html, karena kami menambahkannya saat kami menambahkan tautan berhenti berlangganan HTML. Ini penting, tetapi kami tidak ingin mendefinisikannya dua kali.

Terus gimana? Kami telah menempuh perjalanan panjang. Sungguh, kita harus siap untuk menggunakan situs ke server. Kami dapat menambahkan dekorator @login_required dan membuat pandangan kami aman, mengambil pendaftaran pengguna, mengirim email yang sesuai, dan informasi cache, yang merupakan dasar dari apa yang perlu dilakukan situs web agar tetap relevan. Kami akan menambahkan beberapa fitur yang lebih berguna, dan kemudian membangun dasar untuk menggunakan kode kami ke server jarak jauh, menyiapkan server surat, konfigurasi domain, dan filter untuk membuat situs kami aman dan sesuai.

Kami juga membutuhkan tampilan reset kata sandi, jadi mari kita tambahkan dengan sangat cepat. Tampilan reset kata sandi bawaan Django rusak dalam beberapa fungsi, tetapi kita akan melihat cara menulis tampilan kita sendiri, templat email, formulir, dan pola URL. Begitulah tampilannya, di pengguna/views.py

# ... impor

Formulir ini dibangun untuk Django, tetapi kami akan memerlukan templat untuk mengonfirmasi reset kata sandi, pengguna/templat/pengguna/kata sandi_reset_confirm.html

Kami juga memiliki template untuk mengirim email reset kata sandi, dengan formulir sederhana, di pengguna/templat/pengguna/kata sandi_reset.html

Templat untuk email itu sendiri sederhana, itu adalah file dasar HTML yang membuat tautan untuk mengatur ulang kata sandi, di pengguna/templat/pengguna/kata sandi_reset_email.html. Django akan secara otomatis menafsirkan file ini.

Kami juga membutuhkan dua templat lagi. Yang pertama adalah mengkonfirmasi bahwa email telah dikirim. Pandangan untuk ini sudah ada di Django, jadi kita hanya perlu mengatasinya di urls.py. Templat ini terletak di pengguna/templat/pengguna/kata sandi_reset_done.html

Dan terakhir, untuk mengonfirmasi bahwa reset kata sandi selesai, pengguna/templat/pengguna/kata sandi_reset_complete.html

Sekarang, kita membutuhkan pola URL untuk pandangan ini. Di pengguna/urls.py, tambahkan pola URL berikut:

    # ... URL sebelumnya di sini

Empat template, itu banyak! Tapi sekarang kita dapat memastikan untuk dapat mengatur ulang kata sandi pengguna kapan saja kita perlu, semua dari browser web.

Saya mengerti ini banyak kode. Jika sepertinya sedikit di atas kepala Anda, tidak apa -apa. Anda akan meningkatkan, pemahaman Anda akan meningkat, dan Anda akan menjadi jauh lebih kompeten dengan kode segera. Jika Anda benar-benar tersesat, saya sarankan untuk kembali ke perangkat lunak ini nanti setelah mengerjakan kursus pembelajaran yang berjalan sendiri secara online. Ini biasanya bebas untuk memulai, dan akan memandu Anda melalui semua yang Anda butuhkan untuk sukses ketika Anda kembali ke proyek ini. Jika Anda merasa siap untuk melanjutkan, baca terus, selanjutnya, kami akan membahas penyebaran kode Anda ke server jarak jauh dan menyiapkan server surat, serta mengotomatisasi penyebaran Anda menggunakan bash sehingga Anda selalu dapat mengatur proyek baru dengan beberapa perintah sederhana.

Hal terakhir yang perlu kami lakukan sebelum digunakan ke server jarak jauh adalah membuat situs kami sedikit lebih aman. Anda akan melihat bahwa tampilan login hanya mengambil nama pengguna dan kata sandi, dan tidak ada otentikasi multi -faktor atau satu kode waktu. Ini adalah perbaikan yang mudah, dan dengan kode yang sama, kami dapat membuat situs kami mengirim pesan teks dan bahkan responsif terhadap pesan teks yang dikirim ke server. Untuk memulai, kami akan kembali ke model pengguna dan menambahkan penandatangan stempel waktu yang akan mewakili setiap login. Kami juga akan menambahkan pengidentifikasi yang unik dan berputar ke model pengguna yang akan digunakan untuk menambahkan keamanan ekstra ke login kami. Mengedit model pengguna, pengguna/model.py, tambahkan kode berikut:

# Pastikan untuk mengimpor penandatangan UUID, timestamp dan generator URL (terbalik)
    # Tambahkan kode ini di sini
    # Dan tambahkan fungsi ini
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Berlaku selama 3 menit

Pastikan pengguna/model.py Anda terlihat seperti ini, selain komentar (kode pada baris dengan #). Memecah ini, sederhana. Kami memiliki beberapa impor, penampungan timestams yang merupakan utilitas kriptografi yang dapat menghasilkan kode yang aman dan memverifikasi untuk memastikan itu valid, hanya digunakan sekali, dan tidak lebih tua dari jumlah detik tertentu. Kami juga menggunakan UUID, yang merupakan pengidentifikasi unik yang mengidentifikasi pengguna kami dalam penandatanganan token, dan di URL tempat token dikirim ke pengguna. Kami akan menggunakan kriptografi dasar ini untuk membangun tampilan otentikasi dua faktor. Sebelum kita melakukan hal lain, mari kita jalankan migrasi sehingga model pengguna kami diperbarui. Di direktori dengan kelola.py, jalankan perintah berikut untuk membuat dan menyelesaikan migrasi.

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

Ini penting karena setiap kali kami melakukan perubahan pada model, kami perlu membuat tabel dan memperbarui database dengan default sebelum kami benar -benar dapat menggunakan model.

Selanjutnya, mari kita berimprovisasi tampilan login kita untuk mengarahkan kembali ke tampilan otentikasi sekunder. Di pengguna/views.py, hapus fungsi login dan redirect ke URL yang baru saja kami hasilkan dalam model pengguna.

# … Impor
        if user and user.profile.can_login < timezone.now(): # Perhatikan bahwa kami sekarang memeriksa apakah pengguna dapat masuk
            # Hapus fungsi auth_login yang ada di sini
                return redirect(user.profile.create_auth_url()) # Catatan Kami mengarahkan ulang ke URL baru di sini
            else: # Jika pengguna tidak menggunakan otentikasi multi-faktor, cukup login.
        else: # Jika login tidak berhasil,
            user = User.objects.filter(username=username).first() # Ini adalah bagian di mana kami memperbarui profil pengguna
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Jadi mereka tidak bisa masuk lagi selama beberapa detik

Jadi ini cukup sederhana, kami sekarang memiliki cara untuk mengarahkan kembali tampilan otentikasi dua faktor saat kami membuatnya. Kami juga memiliki fallback jika pengguna belum menambahkan nomor telepon. Kami akan menambahkan tampilan dasar untuk segera menambahkan nomor telepon dan segera masuk dengan pesan teks.

Pertama, kami membutuhkan cara mudah untuk mengirim pesan teks dari kode kami. Untuk melakukan ini, kita dapat memilih dari sejumlah API, tetapi yang termudah menurut saya adalah Twilio. Mereka juga menawarkan harga yang baik untuk proyek yang lebih kecil, serta diskon massal. Buat akun di twilio.com, isi beberapa detail tentang proyek Anda, beli nomor telepon, dan salin tombol API Anda ke settings.py Anda. Kemudian, tambahkan kode ini di bawah file baru, pengguna/sms.py.

nano users/sms.py
# Impor semua paket yang diperlukan
# Kode ini mengirimkan teks dengan twilio
# Fungsi pembantu untuk mendapatkan angka dengan begitu banyak digit
# Kirim teks untuk memverifikasi pengguna
# Kirim pengguna apa pun dengan pengguna dengan fungsi ini
# Validasi kode dengan fungsi ini
# Validasi waktu

Pastikan untuk mengubah pengaturan Anda dengan tepat, menambahkan baris ini dengan kunci Anda:

# Pastikan untuk menyalinnya dari dasbor twilio Anda
AUTH_VALID_MINUTES = 3 # Jumlah menit halaman TFA aktif setelah dipakai

Pertama, kami akan membutuhkan formulir untuk dua tampilan otentikasi faktor kami. Mengedit pengguna/forms.py, tambahkan kode berikut.

# … Impor
# Formulir untuk memasukkan nomor telepon kami
# Formulir untuk mengautentikasi

Selanjutnya, mari kita buat tampilan di pengguna/views.py

# … Impor

Kami juga akan membutuhkan templat untuk kedua pandangan ini. Mari kita tambahkan template MFA terlebih dahulu.

nano users/templates/users/mfa.html

Tambahkan kode HTML ini ke template

Ini cukup jelas. Formulir mengirimkan kode atau kode kosong, dan Anda akan melihat di tampilan kami mengirim kode jika kami menerima kode kosong. Kemudian kami hanya memiliki dua tombol kirim, dan dengan cara ini kami dapat mengirim kode dengan kedua tombol. Selanjutnya, kami akan menambahkan formulir sederhana untuk menambahkan nomor telepon.

nano users/templates/users/mfa_onboarding.html

Tambahkan html berikut:

Formulir ini jauh lebih sederhana, hanya membuat formulir nomor telepon yang kami buat dan memungkinkan pengguna menambahkan nomor telepon.

Ini terlihat sangat bagus! Selama semuanya diatur dengan benar, kita harus dapat mengirim pesan, dan mencatat pengguna dengan nomor telepon mereka segera setelah kita menambahkan pola URL. Hal terakhir yang perlu kami atur adalah tampilan profil sehingga kami dapat memastikan pengguna dapat mengubah nomor telepon mereka tanpa masuk. Juga, pada akhirnya kami ingin menambahkan opsi "berhenti untuk berhenti", sehingga pengguna dapat mengirim pesan teks "berhenti" untuk memilih keluar dari pesan teks di masa mendatang.

Mari kita tambahkan tampilan profil ke pengguna/views.py. Tampilan ini akan memperbarui bio, email, nama pengguna, dan nomor telepon pengguna, serta memungkinkan kami untuk mengaktifkan otentikasi multi -faktor. Pertama, kami akan membutuhkan dua formulir lagi di pengguna/forms.py

# ... impor

Selanjutnya, kita dapat membuat tampilan untuk menggunakan kedua formulir ini. Edit pengguna/views.py dan tambahkan tampilan.

# Tambahkan impor ini

Kami juga membutuhkan templat untuk tampilan ini.

nano users/templates/users/profile.html

Anda akan melihat ini adalah bentuk yang cukup sederhana, tetapi memiliki beberapa javascript di dalamnya yang secara otomatis memposting isi formulir saat diperbarui. Ini berguna untuk dimiliki, jadi Anda dapat mengedit tanpa harus menekan kirim setiap saat.

Selanjutnya, kita membutuhkan URL yang mewakili semua pandangan ini di URL Patters pengguna. Edit pengguna/urls.py dan tambahkan kode ini:

# … Kode sebelumnya, impor
# … Pola URL yang sebelumnya kami masukkan, tambahkan tiga baris berikutnya

Sekarang adalah saat yang tepat untuk menguji proyek kami. Tapi pertama -tama, mari kita jalankan cadangan lain.

backup

Dan jalankan server. Sebelum kita menggunakan server Linux, itu ide yang bagus untuk mengaktifkan otentikasi dua faktor pada akun. Kami akan melakukan ini pergi ke URL profil kami,/pengguna/profil/, dan mencentang kotak untuk mengaktifkan otentikasi setelah memasukkan nomor telepon kami, dan kemudian mengirimkan formulir.

python manage.py runserver localhost:8000

Kunjungi halaman web dengan pergi ke browser web Anda, saya menggunakan Google Chrome dalam contoh ini, dan memasukkan URL https: // localhost: 8000/akun/profil/

Anda akan dapat masuk jika perlu dan mengaktifkan otentikasi dua faktor.

Proyek ini membutuhkan server untuk berjalan sehingga dapat benar -benar mengirim surat. Tapi pertama -tama, kita membutuhkan cara untuk melihat kesalahan. Anda akan melihat bahwa jika Anda menjalankan server dalam mode debug, dengan pengaturan.debug sama dengan True, server menunjukkan kesalahan secara otomatis. Untuk menunjukkan kesalahan tanpa menggunakan mode debug, yang tidak aman di server produksi, kita harus menambahkan tampilan untuk itu. Kesalahan terpenting yang perlu kita tangani adalah:

Kesalahan 500 - Masalah dengan kode kami Kesalahan 404 - Halaman yang tidak ditemukan (URL rusak) Kesalahan 403 - Kesalahan Izin Ditolak

Mari kita tambahkan aplikasi baru untuk menangani kesalahan ini, yang disebut kesalahan.

python manage.py startapp errors

Tambahkan ini ke settings.py seperti yang kami lakukan sebelumnya, dalam pengaturan Installed_Apps, dan mulailah dengan menambahkan referensi ke beberapa tampilan di aplikasi/urls.py, di mana aplikasi adalah nama proyek Django Anda.

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

Ini semua yang kita butuhkan selain tampilan kesalahan, templat, dan sedikit middleware. Mari kita tentukan itu seperti:

# Buat pandangan Anda di sini.

Selanjutnya, mari kita tentukan middleware untuk menangani kesalahan ini. Kami akan melakukan ini dengan terlebih dahulu menambahkan ke middleware_classes di settings.py, dengan nama middleware kami.

    # ... middleware sebelumnya

Selanjutnya, mari tambahkan middleware.

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

Kami menambahkan fungsi untuk mendapatkan pengecualian saat ini dengan menggunakan threading lokal, yang membantu kami melacak kesalahan dalam kode kami. Dalam hal template, kami hanya perlu satu, karena kami secara dinamis mendefinisikan judul dalam tampilan. Template hanya perlu membuat judul dan "melacak", Traceback kesalahan kami dari konteks.

nano errors/templates/errors/error.html

Ini adalah templat paling sederhana kami, tapi begitulah mudahnya melihat kesalahan dalam proyek kami. Selanjutnya, mari kita nonaktifkan debug dalam pengaturan.

nano app/settings.py

Temukan baris ini di mana diatur ke true, dan ubah menjadi false

DEBUG = False

Silakan dan cadangkan aplikasi sekarang. Kami siap digunakan ke server Linux jarak jauh, dan terus menambahkan fitur dari sana.

sudo backup

Sebelum kami memposting kode ini ke server, kami harus mempertimbangkan bahwa mungkin ada beberapa masalah dengan kode. Bergantung pada kasusnya, situs yang menerima informasi yang diposting kepada mereka akan memiliki masalah dengan spam yang diposting dan kesulitan menghapus spam. Ini seharusnya tidak terjadi segera, tetapi jika itu terjadi, kita kemudian akan memeriksa cara memoderasi spam secara otomatis di situs dan membuatnya lebih sulit bagi robot untuk mengakses situs, bersama dengan cara menonaktifkan akun pengguna, dan memverifikasi identitas pengguna dengan pemindaian ID mereka atau pemindaian biometrik, seperti pengenalan jari atau pengenalan wajah.

Melihat contoh otentikasi multi -faktor yang kami periksa, dalam produksi, hal -hal bisa berbeda. Perhatikan bagaimana kami membatasi login, dan token yang kedaluwarsa. Jika robot mengakses situs, dua faktor otentikasi bisa lebih sulit karena mereka dapat memasukkan kode pada saat yang sama pengguna. Untuk mengatasi ini, mari kita gunakan model dalam model pengguna, menyatakan bagaimana kami berinteraksi dengan situs ketika kami mengotentikasi menggunakan otentikasi multi -faktor dengan nomor telepon. Kami juga akan menambahkan opsi untuk mengotentikasi dengan email. Mulailah dengan mengedit model pengguna dengan nano.

nano users/models.py

Seperti inilah model yang kita tambahkan seharusnya. Kami tidak memerlukan metode apa pun, hanya variabel untuk menyimpan ID, pengguna, stempel waktu, kedaluwarsa, panjang dan upaya terhadap otentikasi multi -faktor apa pun (kode seperti 123456 dikirim ke telepon atau email).

# Token dasar yang digunakan untuk masuk ke situs web

Mari kita juga menambahkan hak istimewa kepada pengguna kami, dan kami akan mengaturnya secara manual untuk saat ini, sebelum akhirnya bermigrasi ke mendaftar pengguna istimewa secara otomatis. Di model pengguna, tambahkan baris ini di profil:

    vendor = models.BooleanField(default=False)

Seperti halnya perubahan pada database, kita perlu membuat migrasi dan memigrasikan database setiap kali kita mengedit file model.py di Django. Ingat, untuk melakukan ini, kami menggunakan sumber terlebih dahulu (jika belum digunakan karena terminal terbuka) dan kemudian Python mengelola.py untuk membuat migrasi dan bermigrasi.

cd project-directory-you-named # (jika perlu)

Untuk saat ini, Anda dapat meminta akun apa pun yang telah Anda buat sebagai vendor dengan menggunakan shell.

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

Sekarang, mari kita berevolusi tampilan otentikasi multi -faktor kami untuk menggunakan token ini. Pertama, kita perlu memodifikasi utilitas pembantu MFA kami. Menggunakan nano,

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

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# Mengotentikasi pengguna menggunakan email atau nomor telepon mereka
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Saring token dengan nilai yang diteruskan di URL (A 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)) # Jika sesi ini belum dibuat, buatlah
    user = User.objects.filter(id=token.user.id).first() # Dapatkan pengguna dari token
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Jika sudah diautentikasi, login
    if not user: raise PermissionDenied() # Tolak jika tidak ada pengguna yang ditemukan
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Periksa token auth
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Masuk pengguna jika belum masuk
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Tetapkan kedaluwarsa pada otentikasi multi -faktor mereka
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Mengalihkan pengguna ke halaman berikutnya
    if not user.profile.mfa_enabled: # Periksa apakah MFA diaktifkan
        if not check_verification_time(user, token): # Periksa waktu
            user.profile.mfa_enabled = False # Bersihkan Nomor Telepon
            user.profile.enable_two_factor_authentication = True # Aktifkan MFA
            user.profile.phone_number = '+1' # Nonaktifkan Nomor Telepon
            user.profile.save() # Simpan profil
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Masuki pengguna jika MFA mereka tidak diaktifkan
    if request.method == 'POST' and not fraud_detect(request, True): # Jika permintaan adalah permintaan pos
        form = TfaForm(request.POST) # Instantiate formulir
        code = str(form.data.get('code', None)) # Dapatkan kodenya
        if code and code != '' and code != None: # Pastikan itu tidak kosong
            token_validated = user.profile.check_auth_token(usertoken) # Periksa token auth
            is_verified = check_verification_code(user, token, code) # Periksa kodenya
            if token_validated: # Jika semuanya
                if is_verified: # Beres
                    user.profile.mfa_enabled = True # Aktifkan MFA (jika belum diaktifkan)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Masuk Pengguna
                    for key, value in request.GET.items(): # Bangun querystring untuk parameter berikutnya (jika ada)
                        return HttpResponseRedirect(next) # Redirect
            elif not token_validated: # Jika tokennya tidak valid
            if p.mfa_attempts > 3: # Jika ada terlalu banyak upaya
            if form.data.get('send_email', False): # Kirim email (atau teks)
    # Render formulir (untuk mendapatkan permintaan)

Saat kami menambahkan kode ini, pastikan untuk mengimpor fungsi untuk mengirim email. Di bagian atas file, pengguna melihat (dengan impor lainnya), tambahkan

from .mfa import send_verification_email as send_mfa_verification_email

Sekarang, kita perlu menulis fungsi itu sebelum semua ini akan berhasil. Ini harus memperpanjang fungsi Kirim Email kami, dan cukup kirim email ke pengguna dengan kode verifikasi.

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

Jadi ini semua berfungsi dengan baik, sekarang kami memiliki sistem otentikasi multi -faktor yang tergantung pada nomor telepon atau email untuk masuk. Tetapi kami juga membutuhkan cara untuk menghapus, atau setidaknya menyembunyikan pengguna yang tidak bekerja sama dengan persyaratan kami. Ini bisa berupa spammer, robot atau siapa pun yang tidak bermaksud baik untuk pekerjaan kami. Lihatlah tampilan yang saya miliki untuk memantau pengguna di situs web saya:

# impor
from .tests import is_superuser_or_vendor # Kami perlu membuat tes ini
    # Dapatkan daftar pengguna
    return render(request, 'users/users.html', { # Mengembalikan pengguna dalam templat

Perhatikan bahwa kode ini menggunakan tes, kita perlu mendeklarasikan tes ini dalam file tests.py dan mengimpornya. Mengedit pengguna/tests.py, mari kita buat tes.

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

Ini bersamaan dengan Template Pengguna/Pengguna.html, yang terlihat seperti ini:

Perhatikan bahwa template termasuk templat lain, pengguna/user.html. Saat menggunakan templat yang memiliki subtemplate dan tidak menggunakan Extends, itu ide yang bagus untuk menambahkan garis bawah () sebelum nama file untuk diperpanjang, untuk membedakan templat.

Perhatikan bahwa ini adalah banyak jinja, Anda mungkin tidak memiliki semua variabel ini. Tapi seperti inilah kode saya.

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

Kami juga membutuhkan subtemplate lain, toggle_active.html. Template ini harus menjadi formulir yang memungkinkan kita untuk beralih apakah pengguna aktif.

Kami juga perlu menambahkan tampilan untuk beralih aktivitas pengguna, dan pola URL yang sesuai. Sementara kita melakukannya, mari kita tambahkan tampilan untuk menghapus pengguna jika kita membutuhkannya.

# Impor
    success_url = '/' # Redirect pada URL sukses
    def test_func(self): # Menguji apakah pengguna superuser dan memiliki izin untuk menghapus

Meskipun ini praktis bila perlu, menghapus pengguna seharusnya tidak perlu sebagian besar waktu, kami hanya dapat beralih visibilitas pengguna yang mengunjungi situs jika kami perlu mengabaikannya.

Pola URL yang kami tambahkan terlihat seperti ini. Dengan Nano, edit pengguna/urls.py dan tambahkan baris ini:

nano users/urls.py

Baris harus masuk dalam daftar jalur dalam tampilan pengguna, sebelum akhir "]" tetapi setelah awal "[".

# ...
# ...

Sekarang, pastikan untuk mencadangkan situs sehingga Anda dapat mengunduhnya di server web yang akan terus kami kerjakan. Dari baris perintah,

sudo backup

Sekarang situs kami didukung.

Jadi sekarang kami memiliki beberapa fitur yang lebih berguna. Tapi bagaimana dengan gambaran besar di sini? Kode ini masih belum dapat diakses dari internet, kami belum memiliki server surat, dan kami perlu memperluas aplikasi kami untuk memasukkan proses verifikasi komprehensif serta tata letak yang halus untuk membantu kami menjelajahi Situs, bersama dengan protokol yang aman untuk mengautentikasi pengguna istimewa.

Kami akan mencapai semua ini. Hal terpenting untuk saat ini hanya adalah mendapatkan kode ini secara online, yang dapat kami lakukan hanya dengan beberapa baris bash di server Ubuntu. Anda perlu menyewa server untuk ini, kecuali jika Anda memiliki server di rumah dan langganan internet bisnis yang memungkinkan Anda membuka port. Saya pribadi menjalankan situs web saya di HP Z440 yang diinstal di apartemen saya, tetapi biasanya jauh lebih murah untuk kebutuhan dasar untuk menyewa server pribadi virtual (VPS).

Perlu diingat bahwa kode yang kami jalankan sekarang relatif tipis, itu perlu dipertahankan dan ditingkatkan sebelum kami siap menggunakan apa yang harus kami bangun produk. Pastikan untuk berhati -hati dengan apa yang Anda lakukan dengan internet, pastikan jika Anda menggunakan situs ini secara publik ke web di server Linux, Anda memiliki rencana untuk memblokir interaksi yang tidak diinginkan dengan situs web Anda. Ini kemungkinan tidak akan menjadi masalah pada awalnya, tetapi kami akan melihat berbagai solusi untuk memerangi ini, termasuk pembelajaran mesin, kecerdasan buatan dan visi komputer. Ketika itu menjadi masalah, lihat lebih jauh dalam teks ini untuk solusi.

Dalam hal menyewa VPS, ada banyak tempat yang bisa Anda kunjungi. Google Cloud memiliki server VPS, Ionos, Kamatera, Amazon AWS, dan lebih banyak penyedia menawarkan solusi server cloud yang sesuai dengan kebutuhan kita.

Anda harus mengklik formulir mereka dan memilih rencana untuk memulai. Anda dapat menggunakan paket dasar dengan penyedia apa pun, tetapi pastikan penyedia memungkinkan Anda untuk membuka port server mail port untuk mengirim email (ini harus port 587 dan port 25), beberapa penyedia memblokir port ini. Sejauh ini saya memiliki pengalaman terbaik dengan Ionos dan Kamatera, keduanya akan memungkinkan saya untuk mengirim email tanpa batas dan harga mereka cukup murah.

Anda akan terhubung ke server baru Anda melalui protokol yang disebut SSH atau Secure Shell, yang memungkinkan Anda untuk berinteraksi dengan server persis seperti komputer pribadi Anda, dari komputer pribadi Anda. Saat Anda mengatur server, penyedia hosting kemungkinan akan meminta Anda untuk menambahkan kunci SSH, atau mereka akan memberi Anda nama pengguna dan kata sandi. Kunci SSH adalah bagaimana Anda akan masuk ke server dari baris perintah untuk mengedit kode. Gunakan opsi ssh-keygen di bawah ini untuk menghasilkan kunci SSH.

ssh-keygen

Simpan file dan timpa jika Anda perlu, ada baiknya memutar kunci SSH Anda jika Anda belum melakukannya. Sekarang, Anda dapat menggunakan perintah berikut untuk melihat kunci SSH Anda. Anda ingin menyalinnya ke server jarak jauh Anda sehingga Anda dapat menggunakannya untuk mengotentikasi.

cat ~/.ssh/id_rsa.pub

Jika Anda tidak dapat melihat kunci SSH saat mengetikkan perintah itu (serangkaian angka panjang dan huruf yang dimulai dengan "SSH-RSA AAA"), coba hasilkan kunci RSA (mereka lebih aman, jadi saya sarankan untuk menggunakannya.) Kode berikut akan menghasilkan kunci SSH RSA 4096 bit.

ssh-keygen -t rsa -b 4096

Buat VPS yang menjalankan Ubuntu, namun Anda berencana untuk melakukan ini. Setelah Anda membuat VPS dengan mengklik formulir di situs web Penyedia (Kamatera.com, Ionos.com atau yang serupa), Anda ingin masuk. Untuk melakukan ini, gunakan perintah SSH dengan alamat IP Anda (alamat yang terlihat seperti xx.xx.xx.xx). Anda juga harus peka terhadap nama pengguna default di server yang kami buat, misalnya, Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Anda mungkin diminta kata sandi, jika Anda diminta kata sandi, masukkan. Kami tidak akan menggunakan nama pengguna default, jadi mari kita mulai dengan membuat pengguna baru dan menambahkan kunci SSH ke akun mereka.

Mari kita mulai dengan menambahkan file sshd_config baru, yang memberi tahu server cara menggunakan ssh.

nano sshd_config
# Ini adalah file konfigurasi sistem SSHD Server di seluruh sistem.  Melihat
# sshd_config (5) untuk informasi lebih lanjut.
# SSHD ini dikompilasi dengan path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Strategi yang digunakan untuk opsi di SSHD_Config default yang dikirimkan bersama
# OpenSsh adalah menentukan opsi dengan nilai default mereka di mana
# mungkin, tetapi biarkan mereka berkomentar.  Opsi yang tidak dikomentasikan mengesampingkan
# nilai default.
# Port 22
# Alamat kata -kata apapun
# ListenAddress 0.0.0.0
# Listenaddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Cipher dan kunci
# REKEYLIMIT Default Tidak Ada
# Logging
# Auth Syslogfacility
# Info Loglevel
# Otentikasi:
# LOGINGRACETIME 2M
# Laras-labuh emperrootlogin
# Strictmodes Ya
# MaxAuthtries 6
# MaxSessions 10
# Harapkan .ssh/otorisasi_keys2 diabaikan secara default di masa depan.
# OtorisedPrincipsFile tidak ada
# OtorisedKeysCommand tidak ada
# OtorisedKeySCommanduser Nobody
# Agar ini berfungsi, Anda juga akan membutuhkan kunci host di/etc/ssh/ssh_nown_hosts
# HostbasedAuthentication no
# Ubah ke Ya Jika Anda tidak mempercayai ~/.ssh/know_hosts untuk
# HostbasedAuthentication
# IGNUSERNOWNINGHOSTS no
# Jangan membaca file ~/.rhosts dan ~/.shosts pengguna
# Ignorerhosts ya
# Untuk menonaktifkan kata sandi teks yang jelas, ubah menjadi tidak di sini!
# Leveremptypasswords no
# Ubah ke YA untuk mengaktifkan kata sandi tantangan-respons (waspadai masalah dengan
# beberapa modul dan utas PAM)
# Opsi Kerberos
# Kerberosauthentication no
# Kerberosorlocalpasswd Ya
# Kerberosticketcleanup Ya
# Kerberosgetafstoken no
# Opsi GSSAPI
# GSSAPIAUTIKASI NO
# Gssapicleanupcredentials ya
# Gssapistrictacceptorcheck ya
# Gssapikeyexchange no
# Atur ini ke 'ya' untuk mengaktifkan otentikasi PAM, pemrosesan akun,
# dan pemrosesan sesi. Jika ini diaktifkan, otentikasi PAM akan
# diizinkan melalui KBDinterActiveAuthentication dan
# PasswordAuthentication.  Tergantung pada konfigurasi PAM Anda,
# Otentikasi PAM melalui KBDinterActiveAuthentication dapat mem -bypass
# Pengaturan "permitrootlogin tanpa kata-kata".
# Jika Anda hanya ingin akun PAM dan pemeriksaan sesi berjalan tanpa
# Otentikasi Pam, lalu aktifkan ini tetapi atur kata sandi othentication
# dan KBDinterActiveAuthentication menjadi 'Tidak'.
# Allowagentforwarding ya
# Izintcpforwarding ya
# Gatewayports no
# X11DisplayOffset 10
# X11uselocalhost Ya
# Izin ya
# Printlastlog ya
# TCPKEEPLIVE Ya
# Lingkungan Lingkungan No
# Kompresi tertunda
# ClientAliveInterval 0
# Clientalivecountmax 3
# Digunakan no
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Izin no
# Chrootdirectory tidak ada
# Versionaddendum tidak ada
# tidak ada jalur spanduk default
# Izinkan klien untuk lulus variabel lingkungan lokal
# mengesampingkan default tidak ada subsistem
# Contoh pengaturan utama berdasarkan per pengguna
# Cocokkan ANONCV Pengguna
# X11 untuk no
# Izinkan No
# Izin no
# Forcecommand CVS Server

Ingat, Ctrl+X dan Y untuk menyimpan file. Selanjutnya, mari kita tulis skrip dasar yang disebut inisialisasi (semua di direktori home default pengguna kami).

nano initialize

Tambahkan baris ini ke file, gantiDengan kunci SSH Anda yang Anda temukan menggunakan kucing. (.ssh/id_rsa.pub)

# !/bin/bash

Untuk memandu Anda melalui file ini, mari kita mulai baris demi baris. Baris pertama memberi tahu kompiler bahwa ini adalah skrip bash. Kemudian kami memasang dependensi, menyalin sshd_config ke direktori yang benar, memulai kembali ssh, menghasilkan tombol ssh untuk root, menambahkan 'tim' pengguna (Anda dapat memilih nama yang Anda suka untuk ini, gunakan perintah adduser dengan nama dan kata sandi yang dinonaktifkan untuk saat ini). Kami juga menambahkan tim ke grup sudo, menghasilkan kunci SSH mereka, menambahkan kunci kami ke kunci resmi dan mereka juga, dan mencetak kunci mereka. Pengguna baru ini akan menjadi cara kami masuk ke Situs.

Di terminal baru, silakan dan buka server lagi.

ssh team@XX.XX.XX.XX

Anda seharusnya tidak memerlukan kata sandi kali ini, karena Anda memiliki kunci SSH. Kami juga telah menonaktifkan login dengan kata sandi untuk menjaga situs lebih aman.

Sekarang, server ini mulai benar -benar kosong tanpa informasi di atasnya. Mari kita mulai dengan mengkloning proyek kami dari git sehingga kami dapat mengunduh dan menjalankannya di mesin jarak jauh. Di server jarak jauh yang terhubung melalui SSH, cetak pertama kunci SSH Anda:

cat ~/.ssh/id_rsa.pub

Selanjutnya, tempel kunci ini ke dalam pengaturan git seperti yang kami lakukan sebelumnya untuk mengatur repositori git kami. Kami sekarang dapat mengkloning proyek kami langsung ke server. Pastikan Anda telah mendukung proyek secara lokal terlebih dahulu sehingga ada di Git Server untuk diunduh.

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

Sempurna. Sekarang semua file ada di sini. Kita bisa melihatnya dengan LS

ls

Sekarang, mari kita mulai mengatur server. Pertama, salin direktori proyek Anda ke nama sederhana dan berkesan yang akan kami gunakan untuk proyek ini.

cp -r yourproject whatyoucalledit

Di mana "Whatyoucalledit" adalah nama baru dari proyek Anda. Selanjutnya, kita perlu membangun utilitas dasar untuk mengatur server. Kami akan menyimpan utilitas ini dan menggunakannya di masa depan. Untuk membangun utilitas ini, mari kita buat biner pengguna untuk menentukan bagaimana kita mengedit skrip. Menggunakan bash, edit/usr/bin/askrip

sudo nano /usr/bin/ascript

Pastikan untuk menggunakan sudo di sana sehingga Anda memiliki izin untuk mengedit file. Di file, tambahkan baris ini:

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

Ingat skrip ini mengambil argumen, nama skrip, sebagai $ 1. Pertama -tama ia memeriksa apakah file tersebut ada, atau membuatnya, menambahkan baris pertama untuk mendeklarasikan skripnya adalah bash, mengubah izinnya, mengeditnya, dan menambahkan namanya ke /etc /Ascripts yang memungkinkan kami menyimpan nama -nama skrip yang kami buat. Jika file sudah ada, cukup ubah izin dan edit. Simpan file, dan selanjutnya kita akan mengubah izin. Selama kita menggunakan skrip ini, kita tidak perlu melakukannya lagi.

sudo chmod a+x /usr/bin/ascript

Sempurna. Sekarang mari kita buat skrip yang disebut Pengaturan. Pertama, bukan untuk membanjiri Anda, tetapi lihat seperti apa skrip pengaturan saya. Kami akan berjalan melalui seperti apa skrip ini dalam proyek Anda, Anda tidak akan membutuhkan semua yang ada di skrip saya untuk memulai.

# !/bin/bash
# sudo chmod a+x skrip/useretup
# ./scripts/usersetup
# ssh-keygen
# Direktori Proyek
# Perintah log
# Konfigurasi Nano
# Git Config
# Perbarui dan instal
# Aktifkan Antivirus Clamav
# Atur nama host
# Siapkan postgres
# Pengaturan Cadangan Basis Data
# Nonaktifkan ptables
# Instal Bitdefender
# Pengaturan postfix
# Buat dir
# Siapkan VirtualEnv
# Dapatkan dan Bangun Ketergantungan
# Tetapkan aturan firewall
# Instal dependensi PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP menginstal opencv-python == 4.5.5.64
# Pip Instal OpenCV-Contrib-Python == 4.5.5.64
# Instal Certbot
# Jalankan Certbot
# Muat Ulang Server Surat
# Salin sertifikat
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Atur Pengaturan Pengguna
# Atur izin
# tim sudo chown -r: pengguna/var/run/
# Sudo Chown Root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: pengguna db.sqlite3
# Salin konfigurasi dan atur izin
# Pengaturan Basis Data
# Menyuntikkan konfigurasi PAM dan menghapus konfigurasi SSH yang salah
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profile
# Salin skrip tempat sampah dan atur izin
# Muat Ulang dan Aktifkan Layanan
# Aktifkan modul Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Nonaktifkan situs default
# Aktifkan situs kami
# Muat ulang daemon dan restart apache, postfix dan opendkim
# Atur izin
# Konfigurasi Pertukaran
# Mesin caption init
# Siapkan git
# Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain
# Pengaturan selesai

Itu banyak pengaturan! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs certificates dan mengatur server, menginstal konfigurasi, memulai dan memungkinkan Sever, mengalokasikan swap, mengatur izin, dan mencetak IP, alamat IPv6, dan kunci OpendKim. Cukup sederhana, tapi sepertinya banyak kode. Kami tidak akan membutuhkan banyak ini karena kami tidak memiliki dependensi, kami tidak menggunakan seledri, selyedbeat atau daphne, tetapi kami akan menginstal beberapa dari mereka untuk memulai. Perhatikan bahwa kode ini memiliki domain yang dinyatakan beberapa kali.

Kami juga perlu membeli nama domain (yang merupakan biaya tahunan kecil). Saya merekomendasikan Squarespace untuk membeli domain, tata letaknya intuitif dan mudah digunakan. Anda dapat membeli domain pilihan Anda, tetapi saya menggunakan domain femmebabe.com dalam contoh ini. Setelah Anda membeli domain, pergilah ke panel konfigurasi Squarespace DNS dan tambahkan catatan yang menunjuk domain Anda ke server dengan alamat IP. Seharusnya terlihat seperti ini:

@ A xx.xx.xx.xx

Dengan operator @ sebagai host, yang berarti semua subdomain di bawah domain ini dan domain root semuanya akan mengalihkan ke server. Ada lebih banyak catatan untuk dinyatakan, tetapi kami dapat beralih ke ini setelah kami siap mengirim surat. Perlu diingat, mungkin perlu beberapa hari sebelum Anda dapat berhasil mengirim surat dari server. Catatan DNS yang kami pengaturan akan membutuhkan waktu untuk menyebarkan.

Ngomong -ngomong, satu -satunya catatan yang perlu kita mulai adalah catatan A. Jadi sekarang kita dapat mengisi skrip di bawah ini sesuai dengan proyek kami dan menjalankannya.

Mari kita mulai dengan skrip pengaturan yang lebih kecil untuk hanya menginstal apa yang kita butuhkan untuk kemajuan dasar. Kami tidak akan menggunakan begitu banyak dependensi atau postgresql, kami hanya akan memulai server HTTP dasar dan khawatir tentang sertifikasi ketika itu selesai. Ingat, untuk mendapatkan sertifikat HTTPS dan menjalankan server dengan aman, kita perlu membeli domain bersama dengan sewa server. Untuk saat ini, ganti "tim" dalam file ini dengan nama pengguna Anda, "dir" dengan direktori proyek Anda, dan berikan email dan domain Anda di tag <>.

Selain itu, sebelum kita menjalankan kode ini, kita perlu mengubah pengaturan ke firewall dukungan penyedia hosting, jika ada. Biasanya ini ada di tab 'Jaringan' dari penyedia hosting Anda, atau jika Anda hosting sendiri, di bagian 'Port Forwarding' dari router Anda. Anda juga ingin mengatur IP statis melalui router Anda dengan alamat mesin server Anda, jika Anda menggunakan hosting mandiri. Anda perlu membuka port berikut untuk akses baca/tulis.

22 (SSH) 25 (surat) 587 (surat) 110 (klien surat) 80 (http) 443 (https)

# !/bin/bash
# Perintah log
# Konfigurasi Nano
# Git Config
# Perbarui dan instal
# Aktifkan Antivirus Clamav
# Atur nama host
# Pengaturan Cadangan Basis Data
# Nonaktifkan ptables
# Siapkan VirtualEnv
# Instal Certbot
# Jalankan Certbot
# Atur Pengaturan Pengguna
# Atur izin
# tim sudo chown -r: pengguna/var/run/
# Sudo Chown Root: root/run/sudo/ts -r
# Muat Ulang dan Aktifkan Layanan
# Aktifkan modul Apache
# Muat ulang daemon dan restart apache, postfix dan opendkim
# Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain

Sebelum menjalankan kode ini, pastikan domain yang telah Anda beli terhubung ke server. Untuk melakukan ini, buka terminal di mesin lokal Anda, dan jalankan perintah ini dengan domain Anda:

ping femmebabe.com # Masukkan domain Anda di sini, setelah ping

Jika semuanya terlihat baik dan server mengirimkan tanggapan, kami siap untuk menjalankan skrip dan menginstal paket serta memulai, mengaktifkan dan mensertifikasi server Apache kami.

Ini bukan semua pengaturan yang diperlukan untuk mengonfigurasi postfix, kita akan melihat pengaturan itu lebih nanti. Untuk saat ini, jalankan kode pengaturan ini dan perlu beberapa menit untuk menginstal dan mensertifikasi server Anda. Sekali lagi, pastikan untuk mengganti nama, email dan nama domain dalam skrip sesuai dengan nama yang Anda beli.

Sekarang server disediakan, Anda dapat pergi ke URL di browser web apa pun dan memeriksa untuk memastikan server menjalankan HTTPS. Jika tidak, coba tunggu sebentar untuk catatan DNS untuk mengejar ketinggalan dan kemudian jalankan perintah berikut untuk mencoba kembali sertifikasi Certbot:

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

Selama Anda telah mengonfigurasi semuanya dengan benar, Anda harus dapat mengakses halaman default Apache hanya untuk mengetahui kode Anda berfungsi dan menampilkan halaman web langsung. Selanjutnya, mari edit settings.py untuk mengubah mode debug default kami menjadi produksi. Kami juga akan mengkonfigurasi domain di pengaturan, serta IP internal.

nano yourproject/settings.py

Di pengaturan, ubah/tambahkan baris ini.

# Konfigurasi Situs

Sekarang, kita perlu mengonfigurasi Apache2. Mari mengedit file konfigurasi yang akan kami gunakan dengan baris ini:

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

File konfigurasi ini harus memiliki nama domain kami di dalamnya, dan nama pengguna dan proyek. Saya menggunakan nama domain femmebabe.com, tim nama pengguna, dan nama proyek 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>

Pastikan untuk mengganti nama proyek, direktori, dan domain dalam kode contoh ini saat mengkonfigurasi server Anda. Sekarang, kita perlu menonaktifkan situs default. Ini bisa dilakukan dengan menggunakan bash.

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

Selanjutnya, kami dapat mengaktifkan situs default dan memuat ulang Apache2, juga menggunakan Bash. Ingatlah untuk menggantikan femmebabe dengan nama file yang Anda nyatakan saat mengedit di/etc/apache2/situs-tersedia/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Kembali ke domain Anda di Navbar. Anda akan melihat situs yang Anda konfigurasi di browser web Anda. Selamat! Jika Anda tidak melihatnya, Anda mungkin perlu membuat beberapa perubahan. Tinjau dengan cermat pengaturan dalam proyek Anda, konfigurasi Apache, dan pastikan Anda tidak memiliki kesalahan, dan jalankan perintah berikut untuk memeriksa proyek untuk kesalahan.

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

Jika Anda memiliki kesalahan dalam proyek Python Anda, lacaknya ke tempat mereka berada dan memperbaikinya. Anda mungkin tidak dapat melihat semua kesalahan Anda tergantung di mana mereka berada, jadi jika Anda memiliki kesalahan yang hanya mengatakan "Populate tidak masuk kembali", edit file berikut di lingkungan virtual, registry.py, untuk mengekspos kesalahan.

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

Gulir ke baris 83, di mana kesalahan runtime ini dinaikkan (angkat runtimeError ("populate () bukan reentrant")), dan menambahkan komentar sebelum baris ini, kemudian menambahkan, dengan indentation yang sama, self.app_configs = {}. Ini terlihat seperti ini:

                # Mencegah panggilan reentrant untuk menghindari menjalankan appconfig.ready ()
                # metode dua kali.
# Naikkan RuntimeError ("Populate () Not Reentrant")

Anda kemudian dapat memeriksa proyek lagi dan mengekspos kesalahan.

python manage.py check

Kemudian Anda dapat melihat kesalahan dan memperbaikinya. Saat Anda memperbaikinya dan kode dikompilasi tanpa kesalahan, pastikan untuk mengubah file kembali sehingga terlihat seperti ini:

                # Mencegah panggilan reentrant untuk menghindari menjalankan appconfig.ready ()
                # metode dua kali.
# self.app_configs = {}

Asalkan server online, ketika kami membuat perubahan lebih lanjut, kami perlu menggunakan perintah berikut untuk memuat ulang server:

sudo systemctl reload apache2

Luar biasa! Tapi bagaimana dengan mengirim surat? Untuk mulai mengirim email, pertama -tama kita harus memperbarui konfigurasi domain. Ini harus ada di panel DNS Anda di Squarespace, atau pendaftar nama domain apa pun yang Anda pilih. Kami juga perlu menginstal dan menambahkan konfigurasi, dan menjalankan beberapa perintah.

Pertama, mari kita dapatkan alamat IPv6 dari server. Kami akan membuka DNS Anda dan menambahkan catatan.

Untuk mendapatkan alamat IPv6 server, gunakan perintah ini:

ip -6 addr

Sekarang, kami dapat menambahkan catatan berikut ke pengaturan DNS. Catatan saya terlihat seperti ini. Namun, untuk catatan Anda, Anda harus mengganti alamat IP dengan IP Anda (bukan 75.147.182.214, itu milik saya). Tambahkan juga domain Anda sebagai pengganti femmebabe.com, serta alamat IPv6 Anda yang ditemukan dengan perintah sebelumnya (Anda tidak dapat menggunakan milik saya, Fe80 :: 725a: FFF: FE49: 3E02). Jangan khawatir tentang domainkey untuk saat ini, ini dibuat ketika kami mengatur postfix, server surat, dengan opendkim, dan mencetak kunci. Kami akan mengkonfigurasi ini yang terakhir.

@ A N/a 75.147.182.214

@ MX 10 femmebabe.com

@ Ptr N/a femmebabe.com

@ Txt N/a Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ all

default._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmeebabe.svg

_DMARC Txt N/a V = DMARC1; p = tidak ada

sendonly._domainkey Txt N/a

Sekarang, kita perlu menambahkan beberapa konfigurasi yang bertahan untuk postfix. Yang perlu kami lakukan adalah memastikan kami mengganti nama domain, femmebabe.com, dengan nama domain yang Anda gunakan. Mari kita lihat semua file konfigurasi satu per satu, dan instal di direktori yang disebut konfigurasi dalam proyek kami, untuk menginstal ke OS.

nano config/etc_postfix_main.cf

Tambahkan teks ini ke file

# Lihat /usr/share/postfix/main.cf.dist untuk versi yang lebih lengkap dan lebih lengkap
# Debian Spesifik: Menentukan nama file akan menyebabkan yang pertama
# baris file yang akan digunakan sebagai namanya.  DEBIAN DEFAULT
# IS /etc /MailName.
# myorigin = /etc /mailname
# Menambahkan .Domain adalah pekerjaan MUA.
# Unkomment Baris berikutnya untuk menghasilkan peringatan "tertunda surat"
# delay_warning_time = 4h
# Lihat http://www.postfix.org/compatibility_readme.html - default ke 3.6 pada
# instalasi baru.
# Parameter TLS
# Konfigurasi Milter

Konfigurasi berikutnya!

nano config/etc_postfix_master.cf

Tambahkan baris ini:

# 
# File Konfigurasi Proses Master Postfix.  Untuk detail tentang format
# dari file, lihat halaman manual master (5) (perintah: "man 5 master" atau
# On-line: http://www.postfix.org/master.5.html).
# 
# Jangan lupa untuk mengeksekusi "Reload postfix" setelah mengedit file ini.
# 
# ============================================================================
# Jenis Layanan Private Unpriv Chroot Wakeup MaxProc Command + Args
# (ya) (ya) (tidak) (tidak pernah) (100)
# ============================================================================
# smtp inet n - y - 1 postscreen
# SMTPD Pass - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Pilih satu: Aktifkan pengiriman hanya untuk klien loopback, atau untuk klien mana pun.
# 127.0.0.1:submission inet n - y - - smtpd
# -O syslog_name = postfix/kiriman
# -O smtpd_tls_security_level = enkripsi
# -O smtpd_sasl_auth_enable = ya
# -O smtpd_tls_auth_only = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTIons
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O smtpd_relay_restrictions = empit_sasl_authenticated, tolak
# -O milter_macro_daemon_name = berasal
# Pilih satu: Aktifkan SMTP hanya untuk klien loopback, atau untuk klien mana pun.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -O syslog_name = postfix/smtps
# -O smtpd_tls_wrappermode = ya
# -O smtpd_sasl_auth_enable = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTIons
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O smtpd_relay_restrictions = empit_sasl_authenticated, tolak
# -O milter_macro_daemon_name = berasal
# 628 INET N - Y - - QMQPD
# qmgr unix n - n 300 1 oqmgr
# -O smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# =======================================================================
# Antarmuka ke perangkat lunak non-postfix. Pastikan untuk memeriksa manual
# Halaman dari perangkat lunak non-postfix untuk mengetahui opsi apa yang diinginkannya.
# 
# Banyak layanan berikut menggunakan pengiriman pipa postfix (8)
# agen.  Lihat halaman Pipa (8) Man untuk informasi tentang $ {penerima}
# dan opsi amplop pesan lainnya.
# =======================================================================
# 
# Maildrop. Lihat file postfix maildrop_readme untuk detailnya.
# Juga tentukan di main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# =======================================================================
# 
# Versi Cyrus terbaru dapat menggunakan entri "LMTP" Master.CF yang ada.
# 
# Tentukan dalam cyrus.conf:
# lmtp cmd = "lmtpd -a" listen = "localhost: lmtp" proto = tcp4
# 
# Tentukan di main.cf satu atau lebih dari yang berikut:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# =======================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Juga tentukan di main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - pipa
# flags = drx user = cyrus argv =/cyrus/bin/deliver -e -r $ {pengirim} -m $ {ekstensi} $ {user}
# 
# =======================================================================
# Contoh pengiriman lama melalui Cyrus.
# 
# Old -Cyrus Unix - N N - - Pipa
# flags = r user = cyrus argv =/cyrus/bin/pengiriman -e -m $ {ekstensi} $ {user}
# 
# =======================================================================
# 
# Lihat file postfix uucp_readme untuk detail konfigurasi.
# 
# 
# Metode pengiriman eksternal lainnya.
# 

Dan konfigurasi OpenDKIM. Opendkim mengidentifikasi server email dengan kunci domain untuk membuatnya lebih aman. Tanpa itu, surat tidak ditandatangani dan mungkin tidak sampai ke kotak masuk.

nano config/etc_default_opendkim

Tambahkan baris ini:

# Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim
# Layanan Systemd. Harap gunakan parameter konfigurasi yang sesuai di
# /etc/opendkim.conf sebagai gantinya.
# 
# Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian mengeksekusi
# /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di
# /etc/systemd/system/opendkim.service.d/override.conf dan
# /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang
# Direkomendasikan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan
# Postfix dalam chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Tidak berkomentar untuk menentukan soket alternatif
# Perhatikan bahwa pengaturan ini akan mengganti nilai soket apa pun di opendkim.conf
# bawaan:
# Dengarkan semua antarmuka di port 54321:
# Soket = inet: 54321
# Dengarkan Loopback di port 12345:
# Soket = inet: 12345@localhost
# Dengarkan di 192.0.2.1 di port 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Tambahkan baris ini:

# Default_process_limit = 100
# default_client_limit = 1000
# Batas Default VSZ (Ukuran Memori Virtual) untuk proses layanan. Ini terutama
# dimaksudkan untuk menangkap dan membunuh proses bocor itu sebelum mereka makan
# semuanya.
# default_vsz_limit = 256m
# Pengguna login digunakan secara internal oleh proses login. Ini yang paling tidak dipercaya
# Pengguna di Sistem Dovecot. Seharusnya tidak memiliki akses ke apa pun.
# default_login_user = Dovenull
# Pengguna internal digunakan oleh proses yang tidak mampu. Itu harus terpisah dari
# Pengguna Masuk, sehingga proses login tidak dapat mengganggu proses lain.
# default_internal_user = dovecot
    # port = 143
    # port = 993
    # SSL = ya
  # Jumlah koneksi yang harus ditangani sebelum memulai proses baru. Khas
  # Satu -satunya nilai yang berguna adalah 0 (tidak terbatas) atau 1. 1 lebih aman, tetapi 0
  # lebih cepat. <doc/wiki/loginprocess.txt>
  # service_count = 1
  # Jumlah proses untuk selalu menunggu lebih banyak koneksi.
  # Proses_min_avail = 0
  # Jika Anda mengatur service_count = 0, Anda mungkin perlu menumbuhkan ini.
  # vsz_limit = $ default_vsz_limit
    # port = 110
    # port = 995
    # SSL = ya
    # port = 587
  # Buat pendengar Inet hanya jika Anda tidak dapat menggunakan soket UNIX di atas
  # inet_listener lmtp {
    # Hindari membuat LMTP terlihat untuk seluruh internet
    # alamat =
    # port =
  # }
  # Sebagian besar memori masuk ke file mmap (). Anda mungkin perlu meningkatkan ini
  # Batasi jika Anda memiliki kotak surat besar.
  # vsz_limit = $ default_vsz_limit
  # Max. Jumlah proses IMAP (koneksi)
  # Proses_limit = 1024
  # Max. Jumlah proses POP3 (koneksi)
  # Proses_limit = 1024
  # Max. Jumlah proses pengiriman SMTP (koneksi)
  # Proses_limit = 1024
  # AUTH_SOCKET_PATH menunjuk ke soket userdb ini secara default. Biasanya
  # Digunakan oleh Dovecot-LlA, Doveadm, mungkin proses IMAP, dll. Pengguna yang memiliki
  # Izin lengkap untuk soket ini bisa mendapatkan daftar semua nama pengguna dan
  # Dapatkan hasil pencarian pengguna semua orang.
  # 
  # Mode 0666 default memungkinkan siapa saja untuk terhubung ke soket, tetapi
  # Pencarian UserDB hanya akan berhasil jika UserDB mengembalikan bidang "UID" itu
  # cocok dengan uid proses penelepon. Juga jika UID atau GID penelepon cocok dengan
  # UID atau GID SOCKET Pencarian berhasil. Hal lain menyebabkan kegagalan.
  # 
  # Untuk memberikan izin lengkap penelepon untuk mencari semua pengguna, atur mode ke
  # sesuatu yang lain dari 0666 dan dovecot memungkinkan kernel menegakkan
  # Izin (mis. 0777 memungkinkan semua orang izin penuh).
  # Proses pekerja auth dijalankan sebagai root secara default, sehingga dapat mengakses
  # /etc/shadow. Jika ini tidak perlu, pengguna harus diubah menjadi
  # $ default_internal_user.
  # Pengguna = root
  # Jika proxy DICT digunakan, proses surat harus memiliki akses ke soketnya.
  # Misalnya: mode = 0660, grup = vmail dan global mail_access_groups = vmail
    # Mode = 0600
    # pengguna =
    # grup =

Sekali lagi, pastikan untuk mengganti domain di semua file ini, femmebabe.com, dengan domain yang Anda pilih. Edit file berikutnya, konfigurasi dovecot,

nano config/etc_dovecot_dovecot

Dan tambahkan baris ini

## File Konfigurasi Dovecot
# Jika Anda sedang terburu -buru, lihat http://wiki2.dovecot.org/quickconfiguration
# Perintah "Doveconf -n" memberikan output bersih dari pengaturan yang diubah. Gunakan itu
# Alih -alih menyalin & menempelkan file saat memposting ke milis Dovecot.
# '# 'Karakter dan segalanya setelah diperlakukan sebagai komentar. Ruang ekstra
# dan tab diabaikan. Jika Anda ingin menggunakan salah satu dari ini secara eksplisit, letakkan
# value inside quotes, eg.: key = "# char dan trailing whitespace "
# Sebagian besar pengaturan (tetapi tidak semua) dapat ditimpa dengan berbagai protokol dan/atau
# Sumber/tujuan IP dengan menempatkan pengaturan di dalam bagian, misalnya:
# protocol imap {}, lokal 127.0.0.1 {}, jarak 10.0.0.0/8 {}
# Nilai default ditampilkan untuk setiap pengaturan, itu tidak diperlukan untuk tidak mengkomentasikan
# itu. Ini adalah pengecualian untuk ini: tidak ada bagian (mis. Namespace {})
# atau pengaturan plugin ditambahkan secara default, mereka hanya terdaftar sebagai contoh.
# Jalur juga hanya contoh dengan default nyata yang didasarkan pada konfigurasi
# opsi. Jalur yang tercantum di sini adalah untuk configure --prefix =/usr
# --sysconfdir =/etc ---localstatedir =/var
# Aktifkan protokol yang diinstal
# Daftar IP atau host yang dipisahkan koma tempat mendengarkan untuk koneksi.
# "*" mendengarkan semua antarmuka IPv4, "::" Mendengarkan semua antarmuka IPv6.
# Jika Anda ingin menentukan port non-default atau sesuatu yang lebih kompleks,
# Edit conf.d/master.conf.
# Dengarkan = *, ::
# Direktori dasar tempat menyimpan data runtime.
# base_dir =/var/run/dovecot/
# Nama contoh ini. Dalam Multi-Instance Setup Doveadm dan perintah lainnya
# dapat menggunakan -i <stalle_name> untuk memilih instance mana yang digunakan (alternatif
# ke -c <igig_path>). Nama contoh juga ditambahkan ke proses dovecot
# dalam output PS.
# instance_name = dovecot
# Pesan ucapan untuk klien.
# LOGIN_GREETING = DOVECOT SIAP.
# Daftar Rentang Jaringan Tepercaya yang Dipisahkan Ruang. Koneksi dari ini
# IP diizinkan untuk mengesampingkan alamat dan port IP mereka (untuk penebangan dan
# untuk pemeriksaan otentikasi). disable_plaintext_auth juga diabaikan
# jaringan ini. Biasanya Anda akan menentukan server proxy IMAP Anda di sini.
# login_trusted_networks =
# Daftar Soket Pemeriksaan Akses Login yang Dipisahkan (mis. TCPWRAP)
# login_access_sockets =
# Dengan proxy_maybe = ya jika tujuan proxy cocok dengan IP ini, jangan lakukan
# proksi. Ini tidak diperlukan secara normal, tetapi mungkin berguna jika tujuan
# IP adalah mis. IP penyeimbang beban.
# auth_proxy_self =
# Tampilkan lebih banyak judul proses verbose (dalam PS). Saat ini menunjukkan nama pengguna dan
# Alamat IP. Berguna untuk melihat siapa yang sebenarnya menggunakan proses IMAP
# (Misalnya kotak surat bersama atau jika UID yang sama digunakan untuk beberapa akun).
# verbose_proctitle = no
# Jika semua proses dibunuh ketika proses master dovecot dimatikan.
# Mengatur ini ke "tidak" berarti dovecot dapat ditingkatkan tanpa
# memaksa koneksi klien yang ada untuk ditutup (meskipun itu juga bisa
# Masalah jika peningkatannya adalah mis. karena perbaikan keamanan).
# shutdown_clients = ya
# Jika bukan nol, jalankan perintah surat melalui banyak koneksi ke server DOVEADM,
# Alih -alih menjalankannya secara langsung dalam proses yang sama.
# doveadm_worker_count = 0
# Unix Socket atau Host: Port Digunakan untuk Menghubungkan ke Doveadm Server
# doveadm_socket_path = doveadm-server
# Daftar Variabel Lingkungan yang Dipisahkan Ruang yang disimpan di Dovecot
# startup dan diturunkan ke semua proses anaknya. Anda juga bisa memberi
# kunci = pasangan nilai untuk selalu mengatur pengaturan tertentu.
# import_environment = tz
## 
## Pengaturan Server Kamus
## 
# Kamus dapat digunakan untuk menyimpan kunci = daftar nilai. Ini digunakan oleh beberapa orang
# plugin. Kamus dapat diakses secara langsung atau meskipun a
# Server Kamus. Dict Block Dict Names Dictionary Names to URIS berikut
# Saat server digunakan. Ini kemudian dapat dirujuk menggunakan URI dalam format
# "Proxy :: <name>".
  # kuota = mysql: /etc/dovecot/dovecot-ronic-sql.conf.ext
# Sebagian besar konfigurasi yang sebenarnya disertakan di bawah ini. Nama file
# pertama kali diurutkan berdasarkan nilai ASCII mereka dan diuraikan dalam urutan itu. 00-prefix
# Dalam nama file dimaksudkan untuk membuatnya lebih mudah untuk memahami pemesanan.
# File konfigurasi juga dapat mencoba dimasukkan tanpa memberikan kesalahan jika
# itu tidak ditemukan:
# Mengizinkan Dovecot mendengarkan semua koneksi input (IPv4 / IPv6)

Tambahkan kata sandi untuk pengguna dovecot:

nano config/etc_dovecot_passwd

Bagian pertama dari file, sebelum usus besar, adalah nama pengguna. Bagian terakhir, "YourPassword", menunjukkan kata sandi yang ingin Anda berikan kepada server surat Anda.

team:{plain}yourpassword

Selanjutnya, konfigurasi opendkim

nano config/etc_opendkim.conf

Dan tambahkan baris ini:

# Ini adalah konfigurasi dasar untuk menandatangani dan memverifikasi. Itu bisa dengan mudah
# Diadaptasi agar sesuai dengan instalasi dasar. Lihat opendkim.conf (5) dan
# /usr/share/doc/opendkim/examples/opendkim.conf.sample untuk lengkap
# Dokumentasi parameter konfigurasi yang tersedia.
# Logenghy tidak
# Parameter Penandatanganan dan Verifikasi Umum. Di Debian, header "dari" adalah
# Division, karena sering kali merupakan kunci identitas yang digunakan oleh sistem reputasi
# dan dengan demikian agak sensitif keamanan.
# Menandatangani domain, pemilih, dan kunci (diperlukan). Misalnya, lakukan penandatanganan
# untuk domain "example.com" dengan pemilih "2020" (2020._domainkey.example.com),
# Menggunakan kunci pribadi yang disimpan di /etc/dkimkeys/example.private. Lebih granular
# Opsi Pengaturan dapat ditemukan di /usr/share/doc/opendkim/readme.opendkim.
# Domain example.com
# Selector 2020
# Keyfile /etc/dkimkeys/example.private
# Di Debian, Opendkim berjalan sebagai pengguna "Opendkim". Umask 007 diperlukan saat
# Menggunakan soket lokal dengan MTA yang mengakses soket sebagai non-priviled
# Pengguna (misalnya, postfix). Anda mungkin perlu menambahkan pengguna "postfix" ke grup
# "Opendkim" dalam hal ini.
# Soket untuk koneksi MTA (diperlukan). Jika MTA berada di dalam penjara chroot,
# Harus dipastikan bahwa soket dapat diakses. Di Debian, postfix berjalan
# chroot in/var/spool/postfix, oleh karena itu soket unix harus
# dikonfigurasi seperti yang ditunjukkan pada baris terakhir di bawah ini.
# Socket lokal: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
# Host untuk menandatangani daripada memverifikasi, default adalah 127.0.0.1. Lihat
# Bagian Operasi Opendkim (8) untuk informasi lebih lanjut.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Jangkar Trust memungkinkan DNSSEC. Di Debian, file jangkar trust disediakan
# oleh paket DNS-Root-Data.
# Nameserver 127.0.0.1
# Peta domain di dari alamat ke kunci yang digunakan untuk menandatangani pesan
# Satu set host internal yang suratnya harus ditandatangani
nano config/etc_default_opendkim

Dan tambahkan baris ini

# Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim
# Layanan Systemd. Harap gunakan parameter konfigurasi yang sesuai di
# /etc/opendkim.conf sebagai gantinya.
# 
# Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian mengeksekusi
# /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di
# /etc/systemd/system/opendkim.service.d/override.conf dan
# /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang
# Direkomendasikan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan
# Postfix dalam chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Tidak berkomentar untuk menentukan soket alternatif
# Perhatikan bahwa pengaturan ini akan mengganti nilai soket apa pun di opendkim.conf
# bawaan:
# Dengarkan semua antarmuka di port 54321:
# Soket = inet: 54321
# Dengarkan Loopback di port 12345:
# Soket = inet: 12345@localhost
# Dengarkan di 192.0.2.1 di port 12345:
# Socket = inet: 12345@192.0.2.1

Ketika kami siap mengatur server postfix kami, kami akan menjalankan kode di bawah ini, dengan nama domain yang sesuai tertanam. Mulailah dengan membuat skrip

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

Sekarang, di Nano, editor teks, edit file ini sehingga termasuk nama domain Anda alih -alih femmebabe.com.

# !/bin/bash
# Pengaturan postfix

Sekarang, jalankan skrip yang sudah selesai untuk mengonfigurasi postfix, opendkim dan dovecot.

./scripts/postfixsetup

Setelah skrip ini berjalan, salin baris terakhir yang dicetak dan tempel ke konfigurasi DNS Anda sebagai nilai untuk sendonly._domainkey. Ini adalah kunci Opendkim yang digunakan untuk mengidentifikasi domain Anda saat mengirim surat yang aman.

Luar biasa! Dalam beberapa hari, Anda harus dapat mengirim surat dari server asalkan semuanya dikonfigurasi dengan benar.

Jika Anda baru saja mengonfigurasi DNS untuk server email Anda, perlu waktu kurang dari 72 jam untuk diperbarui catatan. Biasanya jauh lebih cepat. Anda dapat memeriksa apakah server Anda berfungsi dengan menggunakan perintah ini, disediakan email Anda:

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

Jika semuanya tampak berfungsi dengan benar, Anda harus dapat mengirim email dengan server Anda. Jika tidak berfungsi, cobalah melihat log untuk melihat apa kesalahannya.

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

Ini akan menawarkan informasi verbose tentang surat yang dikirim oleh server dan apakah itu berfungsi dengan baik. Anda harus dapat melihat email di kotak masuk Anda juga, jika tidak ada, periksa folder spam Anda.

Anda juga perlu mengonfigurasi pengaturan Anda di pengaturan Anda.py sehingga server email Anda dapat berbicara dengan aplikasi Django Anda, proyek. Tambahkan atau ganti baris ini di pengaturan Anda

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

Perhatikan bahwa kami menggunakan file konfigurasi untuk mendapatkan kata sandi. Mari kita muat file ini di pengaturan seperti itu, di awal file.:

# Buka dan Muat Konfigurasi

Mari kita buat file ini dan tambahkan tombol rahasia untuk itu, serta kata sandi email. Untuk menghasilkan kunci rahasia, gunakan perintah ini, dengan panjang apa pun yang Anda suka di akhir:

openssl rand -base64 64

Sekarang, salin teks yang OpenSSL dihasilkan dan edit /etc/config.json

sudo nano /etc/config.json

Tambahkan baris berikut ke file Anda, dengan kunci yang OpenSSL dihasilkan sebagai kunci rahasia.

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

Format JSON sederhana dan mudah digunakan, kami dapat menyatakan kunci lain yang ingin kami gunakan dalam proyek kami dengan cara ini juga, dan membuat mereka terpisah dari direktori proyek kami sehingga pengguna lain tidak dapat menulis kepada mereka dan sehingga mereka tidak dapat dibaca dari direktori proyek kami saja. Ini adalah praktik yang disarankan untuk kunci API, yang akan kami gunakan lebih dari beberapa di sini.

Anda juga ingin mencadangkan proyek Anda untuk memastikan semuanya disimpan dan Anda dapat memulihkan pekerjaan Anda nanti bahkan jika Anda tidak lagi ingin menyewa server.

sudo backup

Sekarang, coba kirim email HTML dari server web, asalkan mengirim satu dari baris perintah berfungsi. Permintaan contoh pengguna Anda di shell, dan kirim email HTML ke pengguna itu melalui Django. Ubah nama saya di kode, Charlotte, menjadi nama pengguna Anda.

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

Jika perintah pertama tidak berfungsi, pastikan untuk digunakan

source venv/bin/activate

Asalkan semuanya diatur dengan benar, sekarang Anda akan mendapatkan email selamat datang di kotak surat Anda yang dikirim oleh aplikasi web Anda. Kerja bagus! Anda sudah jauh.

Saya ingin menambahkan, jika Anda pernah berjuang dengan kesalahan sama sekali saat mengerjakan proyek seperti ini, jangan ragu untuk mencari jawaban dan meminta bantuan. Google, di antara mesin pencari lainnya, adalah sumber yang bagus untuk mencari bantuan pemrograman. Cukup cari kesalahan yang Anda dapatkan, dan Anda akan dapat melihat bagaimana orang lain menyelesaikan masalah. Juga, Anda dipersilakan untuk menghubungi saya, pendidik Anda (guru, profesor, tutor), setiap rekan di internet yang tersedia untuk bantuan pemrograman, atau berkonsultasi dengan buku ini lagi atau sumber daya lain untuk menemukan solusi untuk masalah yang Anda alami. Saya mengerti ini tidak mudah, tetapi bahkan jika Anda telah membaca sejauh ini dan tidak menulis kode apa pun, Anda belajar banyak tentang membangun aplikasi web dari awal. Tepuk punggung diri Anda, Anda melakukan pekerjaan dengan baik.

Terima kasih telah meluangkan waktu untuk membaca panduan pengembangan web edisi ketiga ini. Dalam edisi mendatang, saya akan memasukkan lebih banyak contoh penting yang dibahas di awal dokumen dan kami akan menyelam lebih dalam ke dunia pengembangan perangkat lunak dan perangkat keras. Tetap disini untuk apa yang akan datang, dan saya berharap dapat mengajari Anda cara membangun perangkat lunak yang luar biasa. Sampai jumpa di edisi berikutnya!






Críoch a chur le
Freastalaí 1
Léim
Féach an t -alt iomlán
Lean ar aghaidh ag léamh

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le Cryptocurrency



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

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le Cryptocurrency


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

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le Cryptocurrency


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

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


Ceannaigh ar

le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le 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.


le hais Daisy / Amharc ar | Ceannaigh | Ceannaigh le Cryptocurrency




https://glamgirlx.com -


(Cliceáil nó sconna chun an íomhá a íoslódáil)
Siamsaíocht ghairmiúil, grianghraif, físeáin, fuaime, sruthú beo agus gameplay ócáideach, chomh maith le scanadh ID, forbairt gréasáin agus seirbhísí máthairionadaíochta.

Fág barr dom i Bitcoin ag baint úsáide as an seoladh seo: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Téarmaí Seirbhíse