ニュース - サイトにアクセスしてください
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 ...
実用的なWebベースの深い学習とセキュリティの例

実用的なWebベースの深い学習とセキュリティの例 第3版 シャーロット・ハーパー 2024年7月3日 2025年6月3日に更新/変換

序文:

Web向けのソフトウェアの構築におけるセキュリティ上の考慮事項は、信頼できる、安定しており、実用的な目的に役立つプロトタイプを設計しながら、Web開発者の計画と実行の重要な部分です。 HTML、JavaScript、およびCSSの実装とPython、C/C ++、Java、Bashを実装するバックエンドソフトウェアを実装するだけでなく、HTML、JavaScript、CSSの実装によりDOM(ドキュメントオブジェクトマークアップ)があり、Web開発者に創造性を表現するさまざまなプロジェクトを作成する自由と力を提供し、使いや使いや機能を提供し、謙虚さと機能を描写し、キャラクターを描写し、キャラクターを描写しているため、魅力的なキャラクターを提供するためのさまざまなプロジェクトを提供し、さまざまな創造性と機能性を提供し、機能を提供します。時間を殺したり、インターネットで何かを成し遂げたりするには、通常はタッチスクリーンのスマートフォンデバイスで。ほとんどの人は、ゼロからウェブサイトを構築したいときにどこから始めればよいかさえ知らないでしょう。他の人のウェブサイトで開始し、機能性、信頼性、使いやすさ、特に創造性が制限されている傾向があります。この本を読んで、私があなたに教えたいことを学び、またはあなたの目標について個人的に話し、正しい方向に何らかのガイダンスを得ることさえ、あなた自身のソフトウェアをコードして書くことを学び、次の影響力のある強力で、合理化された、重要なウェブアプリケーションを構築するための時間を確保し、あなたが聴衆を正確に満たすことを望んでいるものを正確に満たすことを学ぶために何らかの時間を取るためにやる気があります。

私について: 私は、C/C ++、Java、Python、HTML、CSS、JavaScriptの幅広い経験を持つソフトウェア開発者です。私は人々が使用し、訪問したい、さらには時間を学び、再作成し、殺すために使用することに夢中になりたいウェブサイトを構築し、最も重要なことに、私はソフトウェアを販売しています。あなたがウェブサイトをどのように見て機能させたいかについて正確に考えていたなら、あなたは私をサポートすることをいとわなかったので、私はあなたのニーズを満たしている間、私は自分のニーズを満たすことができ、あなたは自分でウェブサイトを運営するコストを賄うことをいとわないので、次のYouTube、Tiktok、Twitter、Google、またはあなたがアクセスできるハイテックセキュリティアプリのみを構築します。私の時間を売ろうとする代わりに、私はあなたの時間を買おうとしています:私はあなたにすでに存在する情報でアプリ(ウェブサイト)を自分で構築するように話したいと思います。そして、私を明確にさせてください、私があなたに与える教育は非公式になります。あなたは学校に行って正式な教育でこれらすべてを学ぶか、学校でこの本を読んで、あなたの課題を完成させ、あなたの教育から多くを奪うことさえできますが、私は正式にあなたを熱い席に置いて、あなたに課題を完了するように頼むことはありません。私はあなたの教授ではありません。あなたはあなた自身の個人的な成功に駆り立てられたキャリアに向けてあなたを導きたい友人のように私を考えることができます。そして、私もあなたに成功を売っていません、あなたはあなたの時間とともにそれを買う必要があります。コードの学習には急な学習曲線があり、決して簡単ではなかったか、そうあるはずです。自分でアプリを学び、構築するためにイライラしている場合でも、できる限り一生懸命働き、失敗し、再試行し、再試行する必要があります。それはコード自体の性質です。コードは、プログラマーエラーメッセージを提供するように設計されたコンパイラによって実行されます。これらは、検索エンジンにエラーをコピーして他の人の例を読むだけでも、コードの方法を教えます。そして、私は言わなければなりません、あなたはアプリを構築するために非常に金持ち、スマート、成功、または詳細指向または整理さえする必要はありません。コンピューターはあなたのためにその組織の世話をします。試行錯誤を通して忍耐し、焦点を維持し、自分がしていることに一生懸命働く必要があります。そして、あなたはあなたがしていることの全体で非常に成功したキャリアを持っているでしょう。

私という人間: 最後のセクションは学習に関するものであり、あなたがこの本からの方法をとることについてのことを理解しています。私は正確に誰ですか?それは複雑な質問です。私は自分自身が不明です。なぜなら、私が時々この本をコーディングしたり書いたりすることを困難にすることができる医学的状態に苦しんでいる間、私は自分自身を紹介することになると私の人生をより困難にする社会化とアイデンティティの問題に挑戦を提示します。要するに、あなたがこの本を読んでいるなら、あなたはそれをひっくり返してそれが役に立つと思ったので、あなたがそれを家に持ち帰りました、またはあなたがあなたがあなたにあなたがしていることをすべて成功させたいと思っている私はあなたのような心のある個人です。私は自分自身、ソフトウェア開発者、学生であり、この本を書いています。他の生徒のためにこの本を書いています。他の学生は、ビジネスのラインに関係なく成功する可能性のある、大きなパズルのようなパズルのようにコピーするための例を挙げることで、人生を楽にすることで生活を楽にしたいと考えています。主に、これが私がしていることです。私は自分自身や他の人々が成功するのを助けるためにアプリを構築します。私も著者ですが、これは私の最初の出版物であり、ポートフォリオを有用なドキュメントにまとめるために完了するつもりです。私もアーティストです。 私はあなたにこれを認めます、私はちょっと奇妙な人です。私は完璧ではありません。私は、大学を去り、州を去ることを導いて、より多くの成功を収めて自分の名前を作ろうとする法律にさえ告げました。私は出生時の女性で、化粧をし、自分の写真を撮り、ドレスやその他の女性の服を着て、自然に女性として自分自身を意識しています。私は過去に他の人たちに、WebAppsの執筆と構築に苦労することにつながる問題がありました。この本を早く手に入れることができなかったことをお詫びします。あなたはこれが必要でした。私のように見え、私のように機能し、同じことをするコードを読み、書きたいと思うでしょう。同じことをしますが、さらに良いことです。なぜなら、私のようにキーボードをマッシュするのではなく、自分でお金を求める本を作成するのではなく、人生で成功するために必要なリソースを持っているからです。私は家族の育ち、健康状態、医師、メディア、法律にあらゆる種類の問題を抱えており、私のコードは、分裂した欲求不満の世界でフェミニズムと女性の性質である闘争を深く反映しています。しかし、この本は私が深く気にかけているもの、私の赤ちゃん、私のポートフォリオ、そして私の生計を立てるので、私から学ぶためにあなたがテキストを家に持ち帰り、慎重にそれを熟成させるときのあなたの考慮に感謝します。私は完璧ではないことを覚えておいてください。この本にはエラー、改訂、新しいエディションがあり、私の執筆で成功した経験を積むために、できる限り論理的な脳で考える必要があります。また、あなたが書くときに挑戦に直面しているときでさえ、私はあなたにとって良いことを意味することを理解してください。このように考えてみてください。コンピューターシステムをレンタルして、デジタルスペースで想像できることをすべて実行し、遭遇したすべての情報を保存し、分析して整理し、それを理解するようになると、摂取している情報や公開さえも困難に遭遇します。私は同じ困難に遭遇したので、私はあなたにこれを言います。この本をあなた自身のリスクで使用し、コミュニティやコミュニティと協力して安全な設定内でソフトウェアを構築し、失敗したり、間違った方法で成功したりしても個人的に物事を取り入れないでください。仕事、インターネット。あなたは私がほんの少しの言葉を持っている人にあまり慣れていないかもしれませんが、私はあなたが読むことをお勧めします、あなたはあなたがあなたの仕事を完了するためにあなた自身のプロジェクトを構築しながら私を読み続けて理解し続けながら私を知るようになります。あなたの教授や教師があなたに割り当てられない限り、この本には宿題はありませんが、あなたが読んだときに自分でプロジェクトのポートフォリオを構築することを強くお勧めします。私のCapstoneプロジェクトは、以前のプロジェクトのコード、手作業で整然と書くことを学んだコード、そして私があなたの友人や家族があなたのニュースを使用している家族や家族を使用している家族を使用しているように、あなたの友人や家族を使用しているように見える人気のあるアプリのように私が成功するのに役立つ幅広いアイデアやヒントを組み込んだコードを組み込んでいるため、この本で読むもののほとんどの基礎です。

この本は何ですか: この本は、例ともチュートリアルです。ここでコード、コードの学習方法、コードのデバッグとエラーの修正に関する情報、手順のトラブルシューティングの手順、コードのバックアップと保存方法の手順、コードを破壊し、コードを展開し、コードを展開し、楽しい、魅力的で、魅力的で、中毒性のあるウェブサイトを構築し、APPの描写をすることができるようになります。あなたが構築するソフトウェアは、あなたのウェブサイトの訪問者であるエンドユーザーにとって、可能な限り最も魅力的であるために絶対的な最善の光になります。この本では、プラットフォームとセキュリティとしてのWebに焦点を当てたソフトウェアデザインの多くの例を示します。バックアップとスクリプト機能を備えたUNIXシェルを使用して基本プロジェクトを構築することにより、学習エクスペリエンスを開始します。次に、基本的なブログWebサイトを調べ、写真とビデオ機能をブログにアップグレードし、これらの機能を使用してフリーソフトウェアを使用してセキュリティソリューションを使用し、プラグ可能な認証モジュール(PAM)を使用してサーバーを保護します。次に、ファイルの処理と処理、ビデオ編集、音声寄付、バーコードスキャン、光学文字認識などの概念を確認します。途中で、無料で有料のオプションを使用して、ソフトウェアをより便利かつ安全にするのに役立つAPIを調べます。途中で、バレルとリピーターの設計、砲塔とドローンの設計、その他のプリンシパルなど、銃器や弾薬の設計と製造などの物理的なセキュリティと過激派のツールを探求します。ゲーム、2Dおよび3Dレンダリングエンジンを構築するために休憩を取り、基本的な次元レンダリングソフトウェアとシリコンゴムでそれぞれ電子振動マッサージャーキャストのケーススタディの例で埋め込まれたハードウェアを使用します。途中で、ソフトウェアをよりよく保護するために、すでに利用可能な機械学習ソリューションも採用します。また、プロセスを合理化および保護するために、Webで利用可能なストックツールを使用します。この本は、Webアプリケーションを構築し、コンピューターおよび組み込み機械システムの専門的なネットワークと統合することに成功するためのガイドであり、全体的なソフトウェアと埋め込みハードウェアの構築ガイドと、背景知識や以前の経験のないガイドです。

この本はそうではありません: 本当にウェブサイトを持ちたい場合は、単純なストアをセットアップして必要なものを販売したり、ブログを投稿したり、写真やビデオを投稿したり、コードを1行に書いたりすることなく、その他のコードを書くことなく、単純なストアを販売するだけです。この本はそうではありません。この本は、まだプロトタイプである最新のソフトウェアを展開しており、古い企業が運営するスケールで運営するのに費用がかかる可能性があるため、すでに見つけられるソフトウェアよりも、より便利で、完全に機能し、機能的で安全なソフトウェアを構築する方法を教えてくれます。この本に密接に従うと、コードを書き、調査コードを作成し、独自のアプリを作成すると、自分がしていることからお金を稼ぐことができます。私はこの本から、人々が必要としたい情報が含まれており、私のアプリを購入または使用するときにすでに購入しているため、この本からお金を稼ぎます。この本はあなたのためのアプリを構築しませんが、必要なツールと、ウェブ用のソフトウェアの構築におけるあなた自身の成功を促進するスキルとヒントを正しい方向に向け、あなたを除外します。

あなたが学ぶこと: この本は、ソフトウェア、本当に機能的で有用なソフトウェア、メディア記録、顔認識、マシン読み取り可能なゾーンバーコードスキャンなどのセキュリティ機能、ビデオと写真を認証、記録、レンダリングするWeb API、BluetoothやField(NFC)通信などのメッセージを交換する方法を教えてくれます。この本は、ネットワーク化されたコンピューターの使用方法、Debian Linuxに焦点を当てた方法、BASHコードを構築してソフトウェアをシームレスで自動化されたそよ風にする方法、ダイナミックなメッセージを提供するためのバックエンドとしてPythonコードを構築する方法、ブートストラップを使用してCSSスタイルを使用して、ネットワークログインを介したユーザーのログインと対話を介したネットワークを介したネットワークを介したネットワークを介して、ネットワークを介してネットワークを構築できるようにする方法を教えてくれます。目的、IDスキャン、画像とビデオのモデレーション、ソフトウェアを安全に保つためのデータマイクロトランザクション、支払い処理、暗号通貨取引、非同期タスクなど。バッテリー、充電器、マイクロコントローラー、サーキット、モーター、センサーを使用して、はんだ、ワイヤー、3Dプリント、および鋳造材料を使用して、独自のBluetoothデバイスを構築する方法を学びます。添加剤の製造とツールとダイアキングに適用される3D設計プリンシパルを実証します。そのため、統合されたバッテリー、充電器、電子回路、機能出力を備えた独自の埋め込みハードウェアデバイスを製造できます。そして、それらをBluetoothとWebでネットワーク化します。具体的には、2つのケーススタディ、振動するマッサージャーと自家製の銃器を調べます。どちらも、グラフィカルインターフェイスまたはコマンドラインユーティリティとして利用できるOpenSCADでプログラムされ、より迅速な結果のためにWebに統合できます。 事前の経験なしでゼロからウェブサイトを構築および展開する方法を学び、それを機能的で、安全で、美しく、有用で、最も重要な実用的にします。機械学習とコンピュータービジョンを使用して、サイトを安全で実用的なものにし、ウェブサイトからビデオとオーディオを記録し、音楽を寄付し、音楽を作成し、有用なサンプルを作成し、他のWebサイトを活用して、あなたが提供するすべての有用な情報を提供し、さらに重要な情報を提供する必要があるすべての有用な情報を共有するために、他のウェブサイトの最良のネットワークを構築することでノイズを突破する方法を学びます。この本は、メディア、セキュリティ、機械学習に最も重点を置いています。これらは、適切なユーザーを引き付け、現実的で実用的で、実用的で、実践的で魅力的な方法で間違ったソフトウェアを外すことで、Web向けのソフトウェアを構築するのに役立つ主要な3つのコンポーネントです。 この本は、UNIX、特にDebian(Ubuntu)、Bash Shell、Python、HTML、CSS、JavaScript、およびRequestsなどのPython用の多くの便利なソフトウェアパッケージ、およびGitやFFMPEGなどの有用なBashソフトウェアを教えています。また、暗号通貨を自動的に取引する方法を教え、暗号通貨や通常のデビットカードから支払いを行いながら、そうすることを選択した場合は、訪問者に収益のシェアを支払います。広告を通じてあなたのウェブサイトからお金を稼ぐ方法、検索エンジンのアプリを準備し、迅速にする方法を教えてくれます。顧客が検索するために検索するものの最初のランキングにランク付けされ、できるだけ多くの一般的な検索にランク付けします。ソフトウェアを販売したり、宣伝したり、サービスを探しているクライアントにアピールしたり、すでに存在し、安価でうまく機能している道を通してインターネット上で自分の名前を作る方法を教えます。あなたのために機能するクラウドコンピューターにデータを保存し、データを安く保存する方法、ユーザーが望むことや必要なことを行うWebサイトを計画して構築する方法、およびユーザーが通知、電子メール、テキストメッセージ、電話、およびその他のアベニューを使用して、ユーザーを携帯電話でタップさせてユーザーをエンゲージメントさせて、ユーザーをエンゲージメントさせて、ユーザーをエンゲージメントして、ユーザーを使用することで、ユーザーをエンゲージメントします。この本は、テキストから写真、写真、音声まで、メディアを大量に公開して配布すること、エンドユーザー(顧客)に良い印象を与え、あなたとあなたのみを代表するアプリであり、あなたのソフトウェア、そしてあなたの会社が可能な限り見栄えを良くするために、自分自身を販売する方法で自分自身を販売することに焦点を当てます。また、コーディングのヒント、メイクアップや写真などの実用的な虚栄心、モデリングや演技など、私からいくつかのヒントとトリックを学びます。これは、自分自身とあなたの会社を、あなたのソフトウェアのバランスをとりながら、ソフトウェアの健康的なバランスをとる必要があるだけのコンテンツを配布しながら、できるだけ多くのコンテンツを配布するために可能な限り最高の光で描写するために重要です。 この本は「実用的」と呼ばれています「理由から、特にWeb専用、特にセキュリティに焦点を当てて、実用的な観点からセキュリティに焦点を当てて、テキストに概説した実用的な目的に焦点を当てて、セキュリティに焦点を当てたコードの学習を扱っています。このテキストの学習コンポーネントは機械学習を網羅しています。画像のキャプション、および本物のコンピューター移動画像などの画像の性質(画像の写真、または印刷された写真)など、画像の性質などのその他のタスクは、コンピューターを使用して登場する可能性があります。サーバーコンピューターは、通常、ユーザー名とパスコードを要求してログインするコンピューターを作成できます。おそらく、新しいログインまたは新しいIPアドレスの確認トークンを使用できますが、大規模で使いやすく、根本的に安全で、強力なソフトウェアを構築している場合は、ソフトウェアがあまりにもソフトウェアに近づきます。 完璧に安全なソフトウェアを構築する人は誰でも、これが意味することのある程度の感覚を持っています。ソフトウェアは本質的に安全ではありません。なぜなら、アクセスに使用するデバイスとアカウントは、常に自由に自由に使えるとは限らず、ソフトウェアを意図していない人の手に渡る可能性があるため、ソフトウェア自体にリスクをもたらす可能性があるためです。これはこの本の焦点です。ネットワーク化されたコンピューターは、デフォルトで長いキートークンで固定されており、SSHまたはセキュアシェルキーでセキュリティで固定されており、Webサーバーがサーバー自体で実行されているオープンアクセスと最先端のセキュリティツールを提供するため、Webサーバーでセキュリティが最適です。 Webサーバーは、ユーザーがネットワークソフトウェアにアクセスできる場所であるため、ユーザーのデバイスの最も強力な部分であるユーザーのWebブラウザにアクセスできます。このツールキットは、テキスト、表示されるWebページをレンダリングでき、画像、オーディオ、ビデオ(顔や状態IDの写真など)を録画し、Bluetoothラジオデバイスに読み書きできることもあり、近いフィールドトランスポンダータグ、安価なキーカード、FOBS、ステッカー、リング、さらには、Web sect by con fid con sec by seen sec by cons con sec by s con sec by s con sec by s con s con fire by con fired by s con s con s con s con s con fired by s con fired by cons emanすべてのツールを自由に使用して、この本を使用して、安全なWebサイトを構築するための知識を身につけ、全体的にあなたのために働く安全なネットワーク化されたコンピューターシステムを装備し、入札を行い、見た目と感じを行います

どこから始めるか: 特に、この本で詳細に説明し、そのユースケースとその実用的な例を文書化する前述のツールのコーディングの経験がある場合、必要な正確なコードで、この本または任意のセクションを開始するセクションをスキップすることを歓迎します。コードを書く経験がない場合は、この本をすべて読むことを強くお勧めします。特に、この本があなたに合っていることを確認するために、前のセクションを読むことをお勧めします。この本があなたに合っていない場合は、ウェブ開発について学ぶことに興味がある友人や親relativeに贈ることを検討し、それを借りて、教師として失敗した、または他の教師が私の前にしたギャップを埋めるために彼らから学ぶことを検討してください。あなたがそうするところから始めて、この本のすべての部分は、有用なアプリを構築するつもりであれば役立ちます。そして、最適なアプリはエンドユーザーを念頭に置いて構築されていることを考慮してください:顧客を知る。今、あなたは私を知っています、あなたはこの本を知っていて、あなたは始める準備ができています。まず、コンピューターをつかみます(ボックスストア、Amazon、または古いデスクトップが機能する最も安いラップトップでさえ、あなたに合った方法でセットアップします。

この本を読む方法: 強調表示されたテキストは、テキストがコマンドプロンプトに属し、実行するコードを書き込むことを示します。コマンドプロンプトは、キーボードに焦点を当てており、クリックをほとんどまたはまったく必要とせず、ワークフローをスピードアップし、物事を簡単にする必要があります。

はじめる: 飛び込みましょう。ローカルマシンにコードを作成することから始めて、インターネットに接続されたWebサイトを構築せずに開始します。これは、そもそも安全で、費用はかかりません。そしてあなたにとって簡単です。オペレーティングシステムに応じて、バッシュシェルに入ると少し違います。 Mac OSの場合、仮想マシンとの最も互換性を得るため、この時点で仮想マシンをインストールすることをお勧めします。 VirtualBoxやParalellなどのさまざまなプロバイダーは、仮想マシンを実行できますが、高速で合理化されたエクスペリエンスを作成するために推奨されるネイティブ環境を使用する場合は、マシンにUbuntuを直接インストールすることもできます。 LinuxまたはWindowsを使用している場合は、プロジェクトを作成するのは非常に簡単です。端末を開き、フィット感のあるサイズを調整し、ステップ2に従って開始します。Windowsを使用している場合は、ステップ1に従ってください。

ステップ1: - Windowsユーザーのみ Windowsでは、管理者とタイプとしてコマンドプロンプトを開きます WSL –Install

ステップ2: - ここを続けるか、Windowsを使用していない場合はステップ1をここまでスキップします オープンターミナル(OSに応じて、WindowsのUbuntu、MacまたはLinuxのターミナル、または同様の名前と呼ばれます)は、プロジェクトを作成することから始めます。これは、ディレクトリを作成するMKDIRコマンドで行います。プロジェクトを保存するためにディレクトリを作成する必要がある場合は、CDコマンドを使用してディレクトリに変更し、

cd/path/to/directory-パスは、宛先ディレクトリの前にあるフォルダー(ファイル)です。デフォルトパスは〜または/home/username(ユーザー名がユーザー名)です。デフォルトのディレクトリに変更するには、CDまたはCDを入力してください〜 mkdirの例 - 「例」をディレクトリの名前に置き換えます

これで、プロジェクトの作業ディレクトリがあります。別のマシンに切り替えたり、書いたコードを展開してWebの準備が整いたりする必要がある場合に備えて、このディレクトリを保存することが非常に重要であるため、次の数ステップでディレクトリをバックアップするスクリプトを作成します。しかし、スクリプトを構築するには少しコードが必要であり、コードはできるだけ便利になるために自動化する必要があります。スクリプトを作成して、最初にスクリプトを作成しましょう。スクリプトを作成して実行可能にすることから始めましょう。 Sudo、Chmod、Touchを使用して、スクリプトを「Ascript」と呼びます。

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

これで、スクリプトを作成し、実行可能にし、編集する準備ができています。 Nanoは、クリックせずにテキストを編集できるテキストエディターです。これは、グラフィカルユーザーインターフェイスを使用するよりもはるかに簡単です。 Nanoを使用してファイルを編集するには、Nanoを使用してからファイルへのパスを使用します。スクリプトを作成するスクリプトを作成すると、そもそもスクリプトを作成することにかなり似ています。上記と同じコードを使用して、スクリプトの名前を「Ascript」という引数パラメーター1ドルに置き換えます。これにより、単にSudo Ascript Newscriptを入力することでスクリプトを呼び出すことができます。この時点で、「Newscript」をスクリプトの名前に置き換えることで、新しいスクリプトを作成できます。 Nanoのコードは次のように見えます。

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

また、ナノを閉じるために、コントロールキーを押し続けてXを押し、Yを押して、ファイルを保存していることを示し、リターンを押します。次に、これらの3つのコマンドを入力してスクリプトを編集する代わりに、Sudo ascript scriptを入力してスクリプトを再度編集することができます。これはうまくいきます!また、新しいスクリプトをシェルで呼び出すことで簡単に実行できます。今すぐ保存しましょう。バックアップスクリプトを作成して、新しいスクリプトを保存してから、バックアップスクリプトをバックアップしながら、プロジェクトディレクトリにバックアップしましょう。

sudo ascript backup

今、ナノで:

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

ここで、/path/to/directoryは、mkdirで作成したプロジェクトへのパスです。後で、このような繰り返しパスをループとリストでコピーする方法を学びます。このスクリプトを実行してコードをバックアップするには、コントロール+x、y、returnでファイルをNanoに保存し、以下をシェルに入力します

backup

この本を読んでシェルでフォローしているときにパスワードを求められている場合は、ユーザーパスワードを正しく入力してください。コマンドを再実行する必要がある前に3回トライします。上下矢印を使用してコマンドを再実行して編集できます。コマンドを右、左矢印、キーボードを削除して削除し、returnで実行する前に、コマンドを選択するために断続的に上下に押します。

おめでとう!ワーキングディレクトリに2つの重要なシェルスクリプトをバックアップする素晴らしいバックアップスクリプトを作成できました。プロジェクトが大きくなるにつれて後で物事を動かしているかもしれませんが、これは今のところうまくいきます。クラウドのバックアップに進みましょう。これにはGithubを使用します(バックアップ用に他にも多数のGitソリューションがありますが、それらはすべて同じです。)Gitは、サーバーに編集をソフトウェアにバックアップできるVerision Controlソフトウェアです。特に、単一のコードが故障したときに時々破損する場合があるセキュリティでのLinuxインスタンスに移行するため、ソフトウェアを保存するのに役立ちます。自動的にバックアップする機会がないとコードがバックアップされない場合にロックアウトします。

この時点でUbuntu仮想マシンをまだ使用していない場合は、この時点でUbuntu Virtual Machineを使用して、作業Webサイトを構築してコンピューターにディープラーニング操作を事前に形成するために必要なすべてのパッケージをインストールするときにライフを楽にすることをお勧めします。近い将来、コードをWebサーバーに移動しますが、フィッシングに耐性のあるWebサーバーの背後に少なくとも数層のセキュリティがあることを確認し、これを行うために多くのLinuxパッケージを採用したいと考えています。それでもMac OSを使用したい場合は、必要なパッケージをオンラインで検索してインストールすることを歓迎しますが、この本やシリーズがカバーするすべてのパッケージに代わるものはない場合があります。

コマンドSudo Ascriptバックアップを実行して、バックアップスクリプトで作業をコミットするためのいくつかのコマンドを追加しましょう。

# …

もう一度、Xを制御して保存します。

次に、このプロジェクトの時間構成を1回実行する必要があります。まもなくGITプロジェクトになるため、GITリポジトリから展開するたびにすべてのコマンドを入力する必要はありませんが、展開スクリプトを作成するときにこれを把握できます。まず、正しいディレクトリにいることを確認し、Gitリポジトリを初期化し、SSHキーを生成しましょう。

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

SSH-KeyGenを入力した後、.SSHというフォルダーの下のホームフォルダーに新しいキーを保存する必要があります。 id_rsa.pubと呼ばれます。このキーを見つけてコピーしましょう。それを見るために、

cd ~
cat .ssh/id_rsa.pub

SSHキーをアカウントに追加する前に、最後のコマンドによって返されるテキストをコピーし、Gitプロバイダー(理想的にはGitHub)でアカウントを作成します。アカウントを取得したら、右上のメニューをクリックして設定を入力してから、メニューのSSHキーとGPGキーのSSHキーを追加します。 SSHキーを追加し、貼り付けてタイトルを付けることでSSHキーを追加し、GitHubに保存して戻って新しいリポジトリを作成します。これは他のGITプロバイダーでも同様です。ドキュメントを読む必要があります。新しいリポジトリ構成で、リポジトリに説明名を付け、公開するかどうかを決定し、まだ包含用のファイルを構成しないようにしてください。リポジトリが作成されたら、クローンをSSH URLでコピーし、次のコマンドに貼り付けます。

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

これで、CDを使用してリポジトリに戻ることができます。これに精通しています。バックアップで今すぐバックアップスクリプトを試してください

素晴らしい!今、私たちは本当にコーディングを得ることができます。 BashとGitをよく把握できるようになったので、Djangoをインストールしましょう。 Djangoはソフトウェアを自動的にバックアップできるようにします。Bashはこれを行うこともできますが、Djangoはより安全な実装をする必要があります(無効にしてより簡単に構成できます)。

Ubuntuにソフトウェアをインストールするには、Sudo Apt-Getコマンドを使用します。まず、すでに持っていたソフトウェアを更新してアップグレードしましょう。これは、sudo apt-getアップデートとsudo apt-getアップグレード-yで実行できます。次に、次のコマンドを使用して、PythonとVirtual EnvironmentのホームであるVirtual Environmentをインストールしましょう。sudoapt-getインストールpython-is-python3 python3-venv

これは、Ubuntuインスタンスのソフトウェアインストールに関してDjangoを使用するために必要なすべてです。 WindowsとLinuxの場合、これはかなり簡単なはずですが、Macの場合は、VirtualBoxやParalellsデスクトップなどの無料または有料の仮想環境を使用して仮想マシンとLinuxをインストールし、Ubuntu環境をセットアップするために上記の手順を再作成することをお勧めします。この場合、UbuntuはWebサイトが実行するソフトウェアであり、前述のすべてのソフトウェアでWebサイトをホストできるため、この場合は重要です。

Djangoを掘り下げましょう。

私たちのディレクトリで、CDを使用して:

python -m venv venv # コードが保存されている仮想環境を作成します
source venv/bin/activate # 仮想環境をアクティブにします
django-admin startproject mysite . # ここで、MySiteは現在のディレクトリから始めています。

DjangoはWebサーバーをホストしており、基本的なローカルWebサイトを稼働させるために必要なすべてを行っているため、Djangoが始めたばかりです。 Djangoがインストールされたので、設定を少し編集して、必要な方法を機能させるようにしましょう。まず、新しいアプリを作成しましょう

python manage.py startapp feed

最初のアプリはフィードと呼ばれていることに気付くでしょう。アプリは好きなものを何でも呼び出す必要があり、新しいアプリを作成しますが、各アプリの名前は、アプリがコードで参照されるたびに一貫している必要があります。新しいアプリを追加するには、常にStartProjectに名前が付けられたアプリが作成した他のディレクトリのsettings.pyを常に編集します。ナノを使用して、

nano app/settings.py

設定で、installed_appsを見つけて、[]を3行に分離します。空の中心線に4つのスペースを使用して、「フィード」またはアプリの名前を追加します。 settings.pyのこのセクションは次のようになります。

INSTALLED_APPS = [
    'feed',
]

忘れる前に、Djangoが機能していることをテストしましょう。コマンドPython Manage.py Runserver 0.0.0:8000を使用して、サーバーを実行してから、コードを実行しているコンピューター上のWebブラウザでhttp:// localhost:8000にナビゲートし、他のコマンドと同じコントロールCでサーバーをquit quit with control cでquit quitを参照してください。

それでは、いくつかのPythonコードの作成に掘り下げましょう。 Djangoには3つの主要なコンポーネントがあり、それらはすべてコードで完全に実行されています。コンポーネントはモデル、ビュー、およびテンプレートと呼ばれ、それぞれがユーザーに配信される前にそれぞれより高いレベルと低レベルにあります。

このモデルは、取得、並べ替え、レンダリングのためにデータベースに情報を保存するコードです。

ビューは、モデルのレンダリング、操作、および変更された方法を決定します。ほぼすべてのビューがモデルを直接使用します。

テンプレートは、テンプレート言語と呼ばれるいくつかの余分なベルとホイッスルを備えたHTMLコードです。テンプレートは、ビューからPythonコードとモデルや情報(Usuall文字列と整数)などのコンテキストで満たされているビューによってレンダリングされます。

Djangoには、以下を含むがこれらに限定されない他のコンポーネントもあります。

説明したようにアプリを構成する設定。

URLは、Webアプリケーションの特定の部分にアクセスするためにユーザーが従うパターンです。

サーバーに送信される情報が処理され、データベースとユーザーにレンダリングされる方法を定義するフォーム。これらは、サーバー側の情報を処理する基盤であり、コンピューターが保存しているあらゆる種類の情報、特にテキスト文字列、数字、真の/誤ったブール人(通常はチェックボックス)を受け入れることができます。

HTMLコードとテンプレート言語であり、PythonとHTMLのギャップを埋めるテンプレートは、Python情報を、誰でもアクセスできるHTMLコードとして提供できます。

通常、JavaScriptであり、サーバーが提供し、テンプレートにリンクしているライブラリである静的ファイル。

サーバーがサービスを提供している、外部的にホストされている、またはホスティングのために別のサーバー(バケット)に投稿される前にサーバーに書き込まれるメディアファイル。

ミドルウェアは、すべてのビューと同時に実行され、ビューに「含まれている」と見なされるコードの部分です。

コンテキストプロセッサは、各ビューのコンテキストを処理し、追加のコンテキストを追加するために使用されます。

ビューがレンダリングされる前に、ユーザーまたはリクエストが特定の要件に合格することを検証するテスト。

消費者は、WebSocketsがコミュニケーションにどのように処理し、応答するかを指示します。

adminは、モデルを登録するために使用され、Django管理ページ内で詳細に操作できるようにします。ここでは、グラフィカルインターフェイスを介してデータベースを管理できます。

Djangoコードの一部の部分を定義するCeleryは、すぐに次のタスクまたはコード行に進む前に実行を開始できます。

Djangoは他の多くのコンポーネントを持つことができます。これについては、ここで詳しく説明します。 Djangoをより機能的にする方法はたくさんあります。これは、非同期タスクを実行する高速で合理化された通信チャネル、セロリ、特にコードのほとんどが実行されるビュー機能でDjangoを拡張するための他の多くのソフトウェアであるセロリであるWebSocketを追加します。ビュー関数は、通常、特定のURLパターンまたはサーバーのセクションに固有のすべてのコードを宣言するため、重要です。

まず、ビュー関数を調べてみましょう。ビュー関数は、ビューで使用されるコードを示すインポートから始まり、通常の関数の定義またはクラスを使用して定義されます。最も単純なビューは、関数定義defで定義され、基本的なテンプレートでHTTPResponseを返します。 「Hello World」というテキストを返すために基本的なビューを定義することから始めましょう。 defのようなステートメントの後にコードを追加するたびに、場合、その場合など、機能に適用したい事前の定義に4つのスペースを追加する必要があることを忘れないでください。これらのそれぞれがすぐに意味することに取り組みます。

サイトのディレクトリから、Nanoを使用してFeed/Views.pyファイルを編集し、ファイルの最後に次の行を追加します。

from django.http import HttpResponse

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

DjangoのHttpresponseは、開閉で示されるテキスト文字列で応答します。リクエストや文字列など、情報やクラスに情報を渡すたびに、括弧(、開閉)を使用する必要があります。

これがまだ私たちの見解を見る必要があるすべてではありません。もちろん、ビューが正確にある場所にサーバーに伝えていませんが、ビューをレンダリングするパスを定義する必要があります。 App/urls.pyで基本的なパスを定義することから始めましょう。後でパスグループに入ります。

App/urls.pyで、作成したばかりのビューをインポートし始めた後、インポートステートメントの後に行を追加します。

from feed import views as feed_views

それでは、ビューパターンを定義しましょう。ビューパターンには、サーバー内にビューが存在するサーバー(ユーザーがナビゲーションバーに入力してWebページに入力するURLパス)、ビューのフレンドリーな名前を指示する3つのコンポーネント、パスコンポーネントの3つのコンポーネントがあり、ビューのフレンドリーな名前があるため、テンプレートで作業するときにパターンを取得できます。あなたのコードベースは、価値があり、作業しやすくするために柔軟性と即興を必要とする絶えず変化する環境になるため、このように物事を行い、柔軟性を持つことは理にかなっています。あなたの見解がどのように見えるかは次のとおりです。これをurlpatterns = [app/urls.pyのセクションに追加できます。ビューパターンは、上記の3つのコンポーネントとパスと呼ばれる関数で定義されます。 URLパターンはリストです。そのため、コンマで各アイテムを常に終了するようにしてください。これはそれぞれを分離するためです。また、各アイテムは、設定のアプリと同じように、その前に4つのスペースを備えた新しいラインに移動する必要があります。 Webサーバーのルートディレクトリで実行されるビューを作成するために、Viewの最初のコンポーネントを空の文字列関数で定義します。あなたのurls.pyは次のようになります:

from feed import views as feed_views

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

これは、完全に静的なDjangoを使用してWebサイトを作成するための基礎です。画像、ビデオ、オーディオなどのキャッシュ情報を開始できる、よりダイナミックなWebサイトを作成するには、次に探索するモデ​​ルを使用する必要があります。とりあえず、コードを確認してサーバーを実行しましょう。エラーをコードに確認するには、実行してください。

python manage.py check

エラーメッセージがある場合は、アプリに行った変更を慎重に確認し、外部または不足しているスペース、余分なキャラクター、閉鎖されていない文字列、タイプミス、誤って削除された文字など、修正する必要があるものがあるかどうかを確認する必要があります。エラーメッセージを読んで(持っている場合)、作成または編集したファイルへのパスを行番号とともに確認できるはずです。そのファイルと行を調べて、そこにあるものを修正できるかどうかを確認してください。問題を修正した場合は、上記のコマンドをもう一度実行します。ソフトウェアが実行されて動作している場合、出力「システムチェックは問題がない」に表示されます。今、あなたは行く準備ができています。サーバーを実行します:

python manage.py runserver 0.0.0.0:8000

Webブラウザーを開き、http:// localhost:8000に移動します。括弧内にテキストが返され、httpresponse関数の引用が表示されているのを見る必要があります。これは基本的な例にすぎませんが、ここまで行えば、Linux、Bash、Python、およびDjangoがどのように機能するかの基本を理解しています。いくつかのデータベースモデリングをより深く掘り下げ、情報を保存する際のPythonクラスのパワーを探りましょう。次に、JavaScriptと機械学習を使用して、サイトを完全に紹介し、柔軟で安全にする前に、HTMLとCSSのグリップを取得し始めます。

クラスは、アプリのモデルに保存されます。 nanoを使用して、app/models.pyを編集し、新しいクラスを追加します。クラスはクラス定義で定義され、この場合はモデルから継承するスーパークラスに渡されます。モデル。クラスの名前は、クラスの定義の後に行われ、クラスに関連する属性と関数の定義が以下に示される前に、クラスの定義a :(コロン)が使用されます。私たちのクラスには、それを取得してユニークに保つために使用できるIDが必要です。また、情報を保存するためのテキストフィールドも必要です。その後、タイムスタンプ、ファイル、ブールリアン(モデルをどうするかについてのコードを決定するのに役立つ真または誤った定義を追加することができ、ソートするために使用できます)、モデルをサーバーにログインしたユーザーに結び付けるインスタンスなど。以下のコードを開梱しましょう。

from django.db import models # クラスを定義するために使用されるインポートとそれは属性です
class Post(models.Model): # クラス自体の定義
    id = models.AutoField(primary_key=True) # モデルのIDは、モデルを照会し、一意に保ち、モデルが作成されたら対話する必要がある場合に役立つ自動化されたキーです。
    text = models.TextField(default='') # クラスストア、この場合、いくつかのテキストが空の文字列にデフォルトである属性。

前に行ったように、ファイルを閉じて保存します。

このクラスを更新する際にアプリが進化するときに調査する他の多くのフィールドとオプションがありますが、これはテキストを投稿するアプリを作成するための基本的な必需品です。ただし、このモデルは単独では機能しません。前述のように、このモデルを機能させるにはカスタムビューとカスタムURLパターンが必要になります。また、テンプレートとともにフォームも必要です。最初にフォームを調べてみましょう。

フォームを定義するには、nanoでapp/forms.pyを編集し、次の行を追加します。フォームクラスの2つのインポートと、作成したモデル(Feed.models.post)、モデルと同様のクラス定義、およびフォームが相互作用するモデルを定義するメタと呼ばれるサブクラスとともにフィールドが必要です。フォームには、リクエスト、モデル、またはその他の情報に基づいて設定する初期化関数を持つこともできます。これを後で検討します。

モデルフォームは、モデルを作成したり、モデルを編集できるため、非常に便利です。そのため、両方に使用します。以下の形で1つを定義しましょう。

from django import forms
from feed.models import Post

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

これは、フォームとモデルがどのように見えるかの基本です。このモデルフォームを使用して、投稿をインスタンス化または編集して、含むテキストを変更できます。次に、このフォームをビューに統合することを検討します。まず、移行を行い、データベースを移行して、モデルが実行されたときにモデルと対話できるようにしましょう。これを行うには、次のコマンドを実行します。

python manage.py makemigrations
python manage.py migrate

これには実行に時間がかかりますが、一度実行すると、ビュー、ミドルウェア、またはソフトウェアの他の場所でモデルにアクセスできます。私たちのモデルを見ることができるビューを作成して続けましょう。記載されているように、Feed/Views.pyを編集し、次のコードを追加します。 #signの後に何も追加する必要はありません。そのコードは、コードに関する情報を示すために使用されるコメントです。まず、モデルをビューでインポートし、ディスプレイのリストとしてテンプレートでレンダリングできるコンテキストに追加することから始めます。次に、モデルに基づいて新しいオブジェクトを作成してサーバーに投稿するボタンを使用してフォームとモデルをレンダリングできるテンプレートを追加します。これは複雑に聞こえるので、一歩一歩見しましょう。ビューを完了する前に、モデルをレンダリングするだけのテンプレートを作成し、シェルに新しい投稿を作成して確認できることを確認しましょう。その見方は次のとおりです。

    posts = Post.objects.all() # これまでにデータベース内のすべての投稿をクエリします

これはすべて、私たちが一番下に到達するまで非常にシンプルに見えます。レンダリング、前の例のようなHTTP応答ではなく関数によって返される値は、常に最初の入力としてリクエストを受け、コンテキスト(この場合はデータベースの投稿)を受け入れます。これはテンプレートでレンダリングされ、関数で定義されたテンプレートを返すことができます。このテンプレートは、Jinja2と呼ばれる言語の少しのHTMLドキュメントになり、Python情報をHTMLにレンダリングします。

テンプレートの作成を開始するには、フィードに2つのディレクトリを作成します。

mkdir feed/templates
mkdir feed/templates/feed

次に、上記のディレクトリでテンプレートを編集し、フィード/テンプレート/フィードを編集し、この例のコードを追加します。この例のテンプレートを見てみましょう。

これは非常にシンプルなテンプレートです。 HTMLタグの開閉、ドキュメントタイプのタグ、レジェンドタイトル付きのボディタグ、画面全体に小さな行を追加するブレークタグ、およびテンプレートの段落として投稿のリストの各投稿をレンダリングするループ用のループを定義します。これは投稿をレンダリングするのに必要なすべてですが、データベースにはまだ何もありません。シェルでいくつかを作成しましょう。 manage.pyでシェルを実行できます

python manage.py shell

次に、ポストモデルをインポートしましょう

from feed.models import Post

次に、文字列を使用した簡単な投稿を作成し、シェルを終了します。文字列は、有効なテキストである限り、何でもすることができます。

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

最後に、フィードにURLパターンを追加する必要があります。フィードアプリは複数のURLを使用し、ファイルサイズを小さく保ちたいので、このようなフィードアプリでローカルURLS.PYを作成しましょう。

from django.urls import path
from . import views

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

また、ベースアプリでurls.pyを編集する必要があります。これが何であれ、これが最初に作成したディレクトリでした。 app/app.pyを編集し、URLパターンに次のことを追加します

from django.urls import include # 上部に
    # ...ここでの以前のコード

これで、Python Manage.py runserverでサーバーを実行すると、データベース内のアイテムとともにモデル、ビュー、テンプレート、およびURLパターンがあるため、作成したページが表示されます。次に、作成したフォームを実装し、独自の投稿の作成を開始しましょう。しかし、あまりにも多くのコードを書く前に、以前に書いたスクリプトを使用してバックアップを作成しましょう、バックアップ。このスクリプトをシェルで実行し、少し待ってください。すべてのコードがGITリポジトリにバックアップされます。

backup

フォームの実装は比較的簡単です。フォームをインポートし、[[ポスト]リクエストハンドラーをビューに追加し、データベースに投稿を保存してから、同じビューにリダイレクトします。既にインポートしたリダイレクト関数と、ViewパターンのURLを取得するためにReverseと呼ばれる別の関数を使用できます。含まれているパターンの名前空間がフィードであり、ビューはフィードとも呼ばれるため、文字列「フィード:フィード」でこれを照会します。

    posts = Post.objects.all() # これまでにデータベース内のすべての投稿をクエリします
    if request.method == 'POST': # POSTリクエストを処理します
        form = PostForm(request.POST) # フォームのインスタンスを作成し、データを保存します
        if form.is_valid(): # フォームを検証します
            form.save() # 新しいオブジェクトを保存します
        return redirect(reverse('feed:feed')) # GETリクエストで同じURLにリダイレクトします
        'form': PostForm(), # レンダリングできるように、フォームをコンテキストに渡すようにしてください。

次に、新しいフォームを考慮してテンプレートを更新する必要があります。これを使用してこれを行うことができます

HTMLにタグを付け、送信ボタンを使用してHTMLテンプレートのフォームをレンダリングします。また、最初にページをロードせずに外部サイトがフォームに投稿するのを防ぐトークンであるCSRFトークンも必要です。

これを分解しましょう。新しいフォームクラス、トークン、フォーム自体、および送信ボタンがあります。非常にシンプルですが、それを見てみると、見た目を良くしたいと思うかもしれません。機能し、フォームで新しい投稿を投稿でき、データベースに保存されます。ここでいくつかのことが起こっています。 HTMLタグを使用して、ドキュメントがHTMLドキュメントであることを宣言し、テンプレートタグ({%…%})を使用して、フォームにトークンをレンダリングし、別の{{…}}をレンダリングします。また、ブロックタグとテンプレートタグを使用してテキストをレンダリングするループもあります。ブロックタグは、テンプレートのセクションがどのようにレンダリングされるかを定義できるため、非常に重要です。テンプレートタグは、変数をコードに入力する方法の基礎です。

これで、アプリの見た目を良くする必要があります。今のところは本当に基本的に見えるからです。これを行うには、インライン、またはドキュメント内の各オブジェクトに結び付けられたクラスのいずれかを使用することで行うことができます。 CSSは、ページ上のすべてのものをどのように見えるかを伝え、見た目を本当に良くすることができるので、本当にいいです。これを行うことができるいくつかのライブラリがありますが、私の個人的な行くことはブートストラップです。

ブートストラップは彼らのウェブサイトからダウンロードできます、getBootStrap.com/。そこに着いたら、ボタンを押してインストールドキュメントを読み取り、cdnセクションを介してincludeからコードをコピーします。 HTMLドキュメントの上部にあるこのコードが、Headと呼ばれるタグが必要です。また、各テンプレートでこれらのリンクを再現する必要がないように、先に進んでベーステンプレートを作成しましょう。

MKDIRテンプレートを使用したテンプレートと呼ばれる新しいディレクトリを作成し、テンプレート/base.htmlを編集します。

このように見えるはずです:

CSSとJavaScript、.CSSおよび.JSファイルをコピーしてください。将来、サイトをより機能的にするためにJavaScriptが必要になるためです。

それでは、Bash Shellに戻り、クイックコマンドを実行しましょう。仮想環境にアクセスする必要がある場合は、Source venv/bin/activateを入力する必要があることを忘れないでください。これにより、DjangoがアクセスできるようにPythonパッケージをローカルにインストールできます。 Django Bootstrapクラスによって生成されたフォームを提供するために、Crispy FormsというPythonパッケージを使用します。これを次のコマンドでダウンロードできます

pip install django-crispy-forms

これがインストールされたら、settings.pyに追加します

    # …以前のコードはここにあります

さて、フィードテンプレートに戻って、いくつかのものを削除できます。ドキュメントの開始と終了を削除し、拡張機能とブロック定義を使用して、ベーステンプレートからの継承に置き換えましょう。また、フォームにテンプレートフィルターインポートとテンプレートフィルターを追加し、テンプレートフィルターを追加します。最後に、フォームのボタンにブートストラップクラスを追加して、ボタンのように見せましょう。それは次のようになります:

美しい!それはすでにかなりのコードです。次に、それをテストし、すべてが見栄えが良いことを確認し、すべてが適切に機能していることを確認する必要があります。以前の指示に従ってサーバーを実行し、サイトが大丈夫になっていることを確認してください。素晴らしい仕事!次のステップに進む準備ができており、同様のURL、フォーム、ビュー、テンプレートを使用してユーザーログイン機能を追加します。ベーステンプレートは重要であり、必要に応じて変更を加えて変更を加え続けますが、ユーザーがユーザー名とパスコードでログインできるようにし、最終的にはアプリを安全に保ち、独自のアカウントをアクセスできるようにすることで、サイトをより安全にすることに焦点を当てましょう。

これを行うには、Djangoに組み込まれたユーザーモデルを使用する必要があります。ユーザーモデルは、私たちの投稿のようなデータベースモデルであり、ユーザーをWebサイトにログインするようにレンダリングできます。将来的には、サイトをインターネットに展開する前に、このモデルをそれに起因する他のモデルで拡張し、フィッシングに耐性のあるログインの追加のセキュリティ対策を構築します。まず、Djangoが提供するいくつかの組み込みのログインフォームを使用します。まず、基本ログインページのテンプレートとビューをレンダリングするために使用する新しいアプリを作成しましょう。また、ピンコード、顔認識、近いフィールド通信、外部デバイス、マルチファクター認証、指紋認識など、アプリを保護するために、継続的なログインチャレンジを表す他のアプリを作成します。

私たちはすでにアプリの開始について話しました。私たちのディレクトリから、仮想環境内の内部では、これらの引数のpass.py

python manage.py startapp users

これで、新しいアプリのディレクトリが必要です。ユーザーログインに対応するディレクトリにビューを作成することから始めましょう。 Djangoはユーザーログインのビューを構築していますが、カスタムビューが必要であるため、これらは適切ではありません。

このビューでは、POSTリクエストをチェックし、Djangoからインポートされたログインフォームへのパスリクエストを確認し、ユーザーアカウントを認証し、ユーザーをログインしてからフィードアプリにリダイレクトします。

ユーザー/views.pyで、次のコードを追加します

        username = request.POST['username'] # 投稿リクエストからユーザー名とパスワードを取得します
        password = request.POST['password'] # ユーザーを認証します

これは、基本的なログインビューに必要なすべてです。それでは、ベーステンプレートを拡張して、ビュー用のフォームを作成しましょう。まず、ユーザーフォルダーにテンプレート用の新しいディレクトリを作成します。

mkdir users/templates
mkdir users/templates/users

これで、ユーザー/テンプレート/ユーザー/login.htmlを編集できるはずです。私たちがそれに取り組んでいる間、ユーザーがサインアップできるようにするテンプレートを作成します。

nano users/templates/users/login.html

さて、テンプレートで、

これがログインテンプレートの基本です。構造の他のテンプレートと同じですが、レンダリングされると少し違って見えます。このコードをコピーして、register.htmlという別の非常に類似したテンプレートを構築します。ここでは、文言を変更し、ビルドする新しいフォームを使用します。最初にテンプレートを作りましょう。ユーザー/テンプレート/ユーザー/register.htmlを編集し、次のコードを追加します。

次に、ユーザー登録用のフォームを作成し、モデルでユーザーログインをアップグレードする前にビューに戻りましょう。このフォームは、最初から基本的になりますが、将来的には契約やCaptchaなどの詳細とセキュリティ機能を組み込みます。 nano users/forms.pyでフォームを編集し、次のコードを追加します。

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

ここには別のフォームがありますが、これはかなり単純に機能します。これは、ユーザー名、電子メール、パスワードを備えたユーザーレジスタフォーム、およびパスワードの確認フィールドです。このフォームは通常のforms.formクラスを拡張していないことに注意してください。これは、メタがあることを意味するモデルフォームです。 1つのフィールドは同じように定義され、クラスメタはモデルを定義します。フォームはフォームに書き込まれる残りの情報に対応します。これのほとんどは、すでにDjangoの組み込みのユーザーCreationFormに存在しているため、クラスの基礎としてそれを使用します(括弧内に渡されます)。

次に、フォームとテンプレートができたので、ユーザーを登録するビューを調べます。これは、新しい投稿ビューのようなモデルフォームです。ユーザー/views.pyを編集し、次のコードを追加します。

# …輸入

これは、ユーザーを登録するために必要なすべてですが、より多くの情報が必要です。ユーザーが登録した時間、サイトで最後にいた時間、伝記、タイムゾーンなどの情報に関する情報を知りたいと思います。また、ユーザーモデルと各ユーザーへの属性投稿を説明するために、フィードモデルの投稿を更新する必要があります。それを行うために、両方のアプリでModels.pyを更新します。フィードモデルを編集することから始めましょう。今はこのように見えるはずです:

from django.db import models # …輸入
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # この行を追加します

ファイルに追加された2行目に注意してください。これは外部キーであり、各投稿を投稿ごとに1人のユーザーに帰属させるため、ユーザーごとに投稿を保存し、ユーザーに起因することなく投稿を作成できないことを確認できます。この外部キーを表すクラスで定義します。これは、必要に応じてユーザーを削除できることを確認するために、ユーザーで投稿を削除していることを確認するための削除引数、すでに作成した投稿にユーザーが不足していること、およびユーザーが作成する投稿オブジェクトを参照するために使用できる関連名に対応します。この関連名は、投稿の著者であるPost.authorとは異なり、投稿自体を投稿したユーザーに提供されます。これで、urning user.posts.all()、またはauthor.posts.all()を実行してユーザーが作成した投稿を取得できます。

それでは、ログインをより回復力のあるものにしましょう。サイトへのログインが許可される回数を制限するだけで、フィッシングに対してサイトの脆弱性をはるかに脆弱にすることができますが、これは非常に簡単です。また、アプリの開発を続けている間、各ユーザーに関する情報を保存し始めましょう。ユーザー/models.pyを編集し、次のコードを追加します。

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

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

このモデルはPOSTモデルとかなり似ていることに注意してください。 DateTimeフィールドにデフォルトを設定できる追加のインポートTimeZoneがあり、投稿のようなCarchersFieldとTextfieldもあります。これらすべてのタイムスタンプを使用すると、サイトを確保し、その使用を理解することができ、テキストフィールドにより、各ユーザーまたは著者に関する情報をWebサイトでレンダリングすることができます。 OnetOonefieldは唯一のマイナーな考慮事項である必要があります。これは、ForeginKeyとまったく同じ動作をしますが、後続のモデルごとに1つしか動作しません。これにより、ユーザーは1つのプロファイルしか持っていませんが、多くの投稿がある場合があります。

次に、プロファイルを考慮してログインと登録ビューを改善しましょう。まず、ユーザー/Views.pyを編集し、レジスタビューに焦点を当てます。

# …輸入
            Profile.objects.create(user=user) # この行を必ず追加して、ユーザーのプロファイルを作成してください

これにより、情報を入力することなく、ユーザーのプロファイルが作成されます。これで、ユーザーアカウントがあまり頻繁にログインできないことを確認するか、少なくともパスワードを頻繁に試すことができないことを確認する必要があるため、ログインビューを更新します。

# …輸入
        if user and user.profile.can_login < timezone.now(): # ユーザーがログインできるかどうかを確認することに注意してください
        else: # ログインが成功しなかった場合、
            user = User.objects.filter(username=username).first() # これはユーザープロファイルを更新する部分です
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # だから彼らは数秒間再びログインすることはできません

これは、セキュリティの基本的な基本です。サイトが、可能なあらゆるパスワードの組み合わせを試したり、同時にいくつかのパスワードの組み合わせを試してみても、サイトが脆弱ではないことを確認してください。これは、パスコードを知っており、いくつかのデバイスにログインする普通のユーザーにとってイライラすることはありませんが、アプリから多数のフィッシングロボットを締め出します。変数Can_Loginを使用したIFステートメントを追加し、過去の時間であるはずであり、同じユーザー名を使用してログインが失敗したごとに更新する必要があることに注意してください。これにより、悪意のあるユーザーは、それほど迅速にパスワードを推測することができません。 datetime.timedelta()の秒数も更新でき、ウェブサイトはより弾力性が高いが、より多くの秒でわずかに使用できるようになります。最初に15をお勧めします。

覚えておいてください、私たちは仕事を保存するためにバックアップスクリプトを作成したので、これまでに持っているものをバックアップして、すべてが保存されていることを確認しましょう。コマンドを実行します:

sudo backup

繰り返しになりますが、これはこれまでのところあなたの仕事を救います。頻繁にバックアップを実行して作業を保存することをお勧めします。バックアップジョブを自動的に実行することもできます。 Cronと呼ばれるUNIXユーティリティを使用してこれを行うことができます。このユーティリティを有効にするには、次のコマンドを実行してパスワードを入力してください。

sudo crontab -e

NANOのオプション1をまだ選択していない場合は、既に慣れているテキストエディターを使用して、矢印キーを使用してファイルの下部にスクロールします。次の行を追加します。

0 * * * * sudo backup

Cronは、フォーマット分、時間、月、月、曜日を使用します。ここでは、 *または数値がコマンドを実行するタイミングを表します。 1分間に0を使用し、残りのオプションで *を使用すると、1分の開始時に1時間ごとにコマンドを実行できます。これにより、コードを自動的にバックアップできます。 sudoがrootとして実行されたときに実行された場合、Cronのすべての仕事があるため、1時間ごとにパスワードを入力する必要はありません。

パスワードを使用せずにコードを簡単にバックアップできるようにするには、バックアップコマンドのパスワードを無効にしましょう。これを行い、次のコマンドを実行し、パスワードを入力します。

sudo visudo

次に、ファイルの下部にスクロールして、別の行を追加しましょう。

ALL ALL=NOPASSWD: /bin/backup

これにより、パスワードなしでコマンド「バックアップ」をユーザーとして実行できます。このための形式は簡単で、「すべて= nopasswd:/bin/」の行を接頭するだけで、/usr/bin/に存在する/bin/backupなどのコマンドで終了します。

それでは、電子メールの操作を始めましょう。ウェブサイトをより安全に保ち、ユーザーが実在の人物であり、顧客に市場やサービスでさえあることを確認する方法であるため、ウェブサイトにとってメールは本当に重要です。インターネットを頻繁に頻繁に訪れる多くの人々は、毎日メールをチェックし、興味のある製品やサービスに関するあらゆる種類のマーケティングメールを受け取ります。DjangoのWebサイトでメールを有効にすることに関しては、いくつかのオプションがあります。

まず、ドメインから電子メールを送信し、最小限のコードが必要な電子メールサービスの支払いを行うことができます。 Google Workspace、SendInBlue、Mailgunなど、これを提供する多くのサービスがあります。

それ以外の場合は、サーバー内で自分のメールサービスをゼロから構築しています。このオプションは、より多くのコードであり、特別なホスティングが必要になる場合でもお勧めします。自宅のコンピューターからメールサーバーを起動することはできないようになる可能性が高いため、クラウド内のサーバーを起動して内部で独自のメールサーバーを作成する前に、構成とコードを調べて電子メールを送信してみましょう。

まず、次のコマンドでsettings.pyを編集します。

nano app/settings.py

ここで、アプリはStartAppで作成したアプリの名前です。

次の行を追加します。

SITE_NAME = 'Django App'

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

アプリを展開する準備ができたら、これらを必ず変更してください。これを後で再検討します。 email_addressの設定は、送信したい電子メールである必要があり、パスワード(email_host_password)をサーバー用に生成するパスワードに設定する必要があります。設定ファイルからパスワードをロードして、次のロジックを使用してコードから締め出さないようにします。

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

次に、次のようにNANOを使用して /etc/config.jsonで構成を備えたJSONファイルを設定しました。

ファイルを編集するには:

sudo nano /etc/config.json

次の行を追加します。

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

[構成ファイルの編集]を引き続き編集し、アプリで使用するすべてのパスワードとキーを追加します。とりあえず、Pythonを使用して電子メールを送信する方法をすばやく調べてみましょう。まず、ユーザーに送信できる検証メールのテンプレートを作成し、ユーザーテンプレートディレクトリに配置しましょう。このテンプレートはHTMLで記述されます。

nano users/templates/users/verification_email.html

このメールはかなり簡単です。ユーザーのコンテキスト、サイトのベースURL、およびユーザーのメールの検証に使用されるユーザーIDとトークンが必要です。テンプレートをレンダリングするためにPythonコードを書く前に、settings.pyでベースURLを定義してください。先に進み、次の行をapp/settings.pyに追加します。

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

BASE_URL = PROTOCOL + '://' + DOMAIN

最終的に、サイトがインターネットの準備ができていて、展開すると、サイトを表すために購入するドメイン名としてドメインを定義する必要があります。これは、サイトにアクセスするためにNavbarに入力する名前です。今のところ、ドメインを空白のままにしたり、プレースホルダーを使用したりできます。また、Site_nameを選択した名前に変更する名前に変更する必要があります。

電子メールを送信する前に、トークンジェネレーターを作成して、決して期限切れにならないアカウントアクティベーショントークンを作成できます。これを行うことができます。これは、以下のように見えるアカウントアクティベーショントークンをインポートすることで行うことができます。ファイルを編集します:

nano users/tokens.py

次のコードを追加します。

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

この基本的なトークンジェネレーターは、ユーザーをURLで送信できるトークンを生成し、ユーザーは電子メールを確認してアカウントをアクティブにするために使用できます。

次に、メールの送信方法を見てみましょう。 nanoを使用して、ユーザー/email.pyを編集します。

nano users/email.py

検証HTMLメールを送信すると、次のようになります。

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

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

これはかなり簡単です。電子メールを送信し、テンプレートと設定で電子メールをレンダリングする必要がある関数をインポートし、テンプレート名で電子メールを定義し、関数を使用してユーザーに送信します。メールを送信する機能を定義していないことがわかります。

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

これはもう少し複雑であり、このコードのすべてをまだ実行する準備ができていません。 unsub_linkを定義していることに注意してください。ユーザーが電子メールから登録解除に使用できるリンク。これは重要です。なぜなら、ユーザーはいつでもそれらを見たくない限り、ユーザーが私たちのメールをオプトアウトできる必要があるからです。また、メッセージに代わるテキストを追加します。これは、HTMLタグを削除したHTMLメッセージです。最後に、電子メールが送信されたかどうかを確認しましたが、そうでない場合は、ユーザーのプロファイルで、電子メールが有効でないことをマークします。

これをすべて機能させることができるように、ユーザーモデルに戻りましょう。登録解除へのリンクを生成する関数を定義し、ユーザーのメールが無効であることをマークするブールフィールドを定義する必要があります。

まず、ユーザー/models.pyのトップに次のインポートを追加します

nano users/models.py
# …

次に、ユーザーモデルに関数を追加してトークンを作成し、電子メールのアクティブ化に使用されるトークンと、ユーザーがメールを正常に受信しているかどうかを保存するフィールドを確認しましょう。ユーザー/models.pyでは、モデルの最後に次のコードを追加します(インデントコード)

# …
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 30日間有効です

これはかなり簡単です。基本的な暗号化ツールであるタイムスタンプシグナーを使用して、一定の時間後に期限切れになるトークンを作成します。また、別の関数を使用して有効かどうかを確認します。これらのトークンを2回使用して、メールを検証し、1回は登録解除リンクを使用します。

これらを手に入れたので、私たちがする必要がある最後の仕事は見解です。ユーザー/views.py内で、ビューを追加して、メールアドレスを確認し、登録解除します。

nano users/views.py

まず、次のインポートを追加します。私はいくつかの余分なものを投げたので、後でもう一度アイテムを再度インポートする必要はありません。

from .email import send_verification_email # 確認電子メールの送信機能をインポートしてください

これらの輸入品のいくつかはすでにあるかもしれませんが、それらを繰り返すことは害はありません。他のインポートの中でも、users.tokensからのaccount_activation_tokenだけでなく、検証メールの送信機能をインポートする必要があります。

次に、ファイルの下部に、次のコードを追加します。

        # それらを登録解除します
    # それ以外の場合は、ログインページにリダイレクトします
# sendwelcomemail(リクエスト、ユーザー)

これはたくさんのコードです。それを分解しましょう。最初の機能は、クリーンでシンプルで、メーリングリストからユーザーを登録解除します。 2番目の関数は電子メールをアクティブにし、コメント機能のsendwelcomemailを追加したことに気付くでしょう。メールテンプレートと関数の定義を使用してウェルカムメールを送信できます。まだ行っていません。アクティベーションメールの有効期限が切れるため、私が投げた最後の関数は重要です。したがって、アクティベーションメールをいつか再送信する必要があります。これには基本的なフォームを使用して、関数を呼び出して確認メールを送信できます。これを行う前に、レジスタビューに関数呼び出しを追加して、最初に送信されるようにしましょう。レジスタビューのリダイレクト、DEFレジスタ、ユーザー/Views.pyの直前にこの行を追加します。

nano users/views.py
# …(後)defレジスタ(リクエスト):
# …(前)リダイレクト(

そのコードスニペットに最初と最後の行を追加する必要はありません。レジスタビューが検証メールをユーザーに送信していることを確認してください。このように見えるはずです:

# …輸入
            send_verification_email(user) # このラインを追加してください!

次に、アクティベーションメールを再送信するためにフォームを追加する必要があります。ユーザー/forms.pyで、次のフォームを追加します。

# …(輸入)

また、この再送信メールアクティベーションフォームに対応するテンプレートも必要です。このテンプレートを追加しましょう。ファイルを編集します。

nano users/templates/users/resend_activation.html

次に、次のコードをファイルに追加します。

ええ、それはたくさんです!これで、サーバーにコードを展開すると、HTMLメールを送信して、電子メールをクリックしてユーザーアカウントをアクティブ化できます。また、簡単なウェルカムメールを送信したいと思うかもしれませんので、それを行う方法を見てみましょう。ユーザー/email.pyに戻り、次のコードを追加します。

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

また、この情報をすべてレンダリングするためのテンプレートが必要です。私のウェブサイトでは、テンプレートは以下のように見えますが、好きなようにフォーマットすることを歓迎します。

HTML Unsubscribeリンクを追加するときにこれらを追加するため、閉じたボディまたはHTMLタグがないことに注意してください。これらは重要ですが、2回定義したくありません。

では、次は何ですか?私たちは長い道のりを歩んできました。本当に、サイトをサーバーに展開する準備ができている必要があります。 @Login_Requiredデコレーターを追加して、ビューを安全にし、ユーザーのサインアップを行い、コンプライアンスの電子メールとキャッシュ情報を送信できます。これは、関連性を保つためにウェブサイトが必要とすることの基礎です。さらにいくつかの便利な機能を追加し、コードをリモートサーバーに展開し、メールサーバー、ドメイン構成、フィルターを設定してサイトを安全かつ適切にするための基礎を構築します。

また、パスワードリセットビューも必要なので、それを本当に迅速に追加しましょう。 Djangoの内蔵パスワードリセットビューはいくつかの関数で壊れていますが、独自のビュー、電子メールテンプレート、フォーム、およびURLパターンを書く方法について説明します。ユーザー/views.pyでは、ビューがどのように見えるかを次に示します

# ...輸入

このフォームはdjangoに組み込まれていますが、パスワードのリセット、ユーザー/テンプレート/ユーザー/password_reset_confirm.htmlを確認するためのテンプレートが必要です

また、ユーザー/テンプレート/ユーザー/password_reset.htmlで、シンプルなフォームのパスワードリセットメールを送信するテンプレートもあります。

電子メール自体のテンプレートは簡単です。これは、ユーザー/テンプレート/ユーザー/password_reset_email.htmlでパスワードをリセットするためのリンクをレンダリングする基本的なHTMLファイルです。 Djangoはこのファイルを自動的に解釈します。

さらに2つのテンプレートも必要です。 1つ目は、電子メールが送信されたことを確認することです。これらのビューはすでにDjangoにあるので、urls.pyでそれらに対処する必要があります。このテンプレートは、users/templates/users/password_reset_done.htmlにあります

そして最後に、パスワードのリセットが完了していることを確認するために、ユーザー/テンプレート/ユーザー/Password_reset_complete.html

これで、これらのビューにはURLパターンが必要です。ユーザー/urls.pyで、次のURLパターンを追加します。

    # ...以前のURLはここにあります

4つのテンプレート、それはたくさんです!しかし、今では、必要なときに、すべてがWebブラウザーからユーザーのパスワードをリセットできるようにすることができます。

これはたくさんのコードであることを理解しています。それがあなたの頭の上に少し見えるなら、それは大丈夫です。あなたは改善し、あなたの理解が改善され、あなたはすぐにコードにもっと能力を尽くすようになります。あなたが完全に迷子になっている場合は、自己ペースの学習をオンラインでコード化するために学習した後、後でこのソフトウェアに戻ることをお勧めします。これらは通常、自由に始めることができ、このプロジェクトに戻ったときに成功するために必要なすべてを案内します。続行する準備ができていると感じた場合は、次に読んでください。コードの展開をリモートサーバーに展開してメールサーバーを設定し、BASHを使用して展開を自動化して、いくつかの簡単なコマンドを使用して新しいプロジェクトをいつでも設定できるようにします。

リモートサーバーに展開する前に最後に行う必要があることは、サイトをもう少し安全にすることです。ログインビューはユーザー名とパスワードのみを取得し、マルチファクター認証またはワンタイムコードがないことに気付くでしょう。これは簡単な修正であり、同じコードを使用すると、サイトにテキストメッセージを送信し、サーバーに送信されたテキストメッセージに応答することもできます。まず、ユーザーモデルに戻り、各ログインを表すタイムスタンプ署名者を追加します。また、ログインに追加のセキュリティを追加するために使用されるユニークで回転識別子をユーザーモデルに追加します。ユーザーモデル、ユーザー/モデル.pyの編集、次のコードを追加します。

# 必ずUUID、タイムスタンプの署名者、URLジェネレーターをインポートしてください(逆)
    # このコードをここに追加します
    # この関数を追加します
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 3分間有効です

コメント(#の行のコード)に加えて、ユーザー/Models.pyがこのように見えることを確認してください。これを分解すると、それは簡単です。いくつかのインポートがあります。これは、安全なコードを生成し、それが有効であることを確認するために検証できる暗号化されたユーティリティであるタイムスタンプシグナーです。また、トークンの署名でユーザーを識別する一意の識別子と、トークンがユーザーに送信されるURLでUUIDを使用します。この基本的な暗号化を使用して、2因子認証ビューを構築します。他のことをする前に、ユーザーモデルが更新されるように移行を実行しましょう。 manage.pyを使用したディレクトリで、次のコマンドを実行して移行を完了します。

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

これは重要です。モデルを変更するたびに、モデルを実際に使用できるようにする前に、テーブルを作成し、デフォルトでデータベースを更新する必要があるためです。

次に、ログインビューを即興で即興で、二次認証ビューにリダイレクトしましょう。ユーザー/views.pyで、ログイン関数を削除し、ユーザーモデルで生成したばかりのURLにリダイレクトします。

# …輸入
        if user and user.profile.can_login < timezone.now(): # ユーザーがログインできるかどうかを確認することに注意してください
            # ここにあるauth_login関数を削除します
                return redirect(user.profile.create_auth_url()) # 注意してください。ここで新しいURLにリダイレクトします
            else: # ユーザーがマルチファクター認証を使用していない場合は、それらをログインするだけです。
        else: # ログインが成功しなかった場合、
            user = User.objects.filter(username=username).first() # これはユーザープロファイルを更新する部分です
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # だから彼らは数秒間再びログインすることはできません

これは非常に簡単です。これは、作成時に2つの要因認証ビューにリダイレクトする方法があります。また、ユーザーが電話番号を追加していない場合に備えて、フォールバックもあります。基本的なビューを追加して電話番号をすぐに追加し、すぐにテキストメッセージでログインします。

まず、コードからテキストメッセージを送信する簡単な方法が必要です。これを行うには、多くのAPIから選択できますが、私の意見で最も簡単なAPIはTwilioです。また、小規模なプロジェクトやバルク割引の優れた価格設定も提供しています。 twilio.comでアカウントを作成し、プロジェクトの詳細を入力し、電話番号を購入し、settings.pyにAPIキーをコピーします。次に、このコードを新しいファイル、ユーザー/sms.pyの下に追加します。

nano users/sms.py
# 必要なすべてのパッケージをインポートします
# このコードは、Twilioでテキストを送信します
# 非常に多くの数字で数字を取得するヘルパー機能
# テキストを送信して、ユーザーを確認します
# この関数のテキストをユーザーに送信します
# この関数でコードを検証します
# 時間を検証します

設定を適切に変更して、これらの行をキーに追加してください。

# Twilioダッシュボードからこれらをコピーしてください
AUTH_VALID_MINUTES = 3 # TFAページがインスタンス化されるとアクティブになります

まず、2つの要因認証ビューにフォームが必要になります。ユーザー/forms.pyの編集、次のコードを追加します。

# …輸入
# 電話番号を入力するためのフォーム
# 認証のためのフォーム

次に、ユーザー/Views.pyでビューを作成しましょう

# …輸入

また、これらのビューの両方にテンプレートが必要です。最初にMFAテンプレートを追加しましょう。

nano users/templates/users/mfa.html

このHTMLコードをテンプレートに追加します

これはかなり自明です。フォームはコードまたは空のコードのいずれかを送信します。つまり、空のコードを受信した場合、コードを送信するビューで表示されます。次に、2つのボタンを2つだけ持っているので、どちらのボタンでコードを送信できます。次に、電話番号を追加する簡単なフォームを追加します。

nano users/templates/users/mfa_onboarding.html

次のHTMLを追加します。

このフォームははるかにシンプルで、作成した電話番号フォームをレンダリングし、ユーザーが電話番号を追加できるようにします。

これは本当によさそうだ!すべてが適切にセットアップされている限り、URLパターンを追加するとすぐに、メッセージを送信し、電話番号でユーザーをログインできるはずです。最後にセットアップする必要があるのはプロファイルビューです。これにより、ユーザーがログインせずに電話番号を変更できるようにすることができます。最終的には、「停止する停止」オプションを追加して、ユーザーが将来のテキストメッセージをオプトアウトするために「停止」することができます。

ユーザー/Views.pyにプロファイルビューを追加しましょう。このビューでは、ユーザーのバイオ、電子メール、ユーザー名、電話番号を更新し、マルチファクター認証を有効にすることができます。まず、ユーザー/forms.pyにさらに2つのフォームが必要になります

# ...輸入

次に、これらのフォームの両方を使用するビューを作成できます。ユーザー/views.pyを編集し、ビューを追加します。

# これらのインポートを追加します

また、このビューにはテンプレートが必要です。

nano users/templates/users/profile.html

これはかなりシンプルなフォームであることに気付くが、更新されるフォームの内容を自動的に投稿するJavaScriptが含まれている。これは有用であるため、毎回送信を押すことなく編集を行うことができます。

次に、ユーザーのURLパターンのこれらすべてのビューを表すURLが必要です。ユーザー/urls.pyを編集して、このコードを追加します。

# …以前のコード、インポート
# …以前に入力したURLパターン、次の3行を追加します

今こそ私たちのプロジェクトをテストするのに良い時期です。しかし、最初に、別のバックアップを実行しましょう。

backup

サーバーを実行します。 Linuxサーバーに展開する前に、アカウントで2つの要因認証を有効にすることをお勧めします。これをプロファイルURL、/users/profile/、および電話番号を入力した後に認証を有効にするためにボックスをチェックしてからフォームを送信します。

python manage.py runserver localhost:8000

Webブラウザに移動してWebページにアクセスして、この例ではGoogle Chromeを使用して、url https:// localhost:8000/accounts/profile/を入力しています。

必要に応じてログインし、2つの要因認証を有効にすることができます。

このプロジェクトは、実際にメールを送信できるように、実行するサーバーが必要です。しかし、最初に、エラーを確認する方法が必要です。デバッグモードでサーバーを実行すると、settings.debugがtrueに等しい場合、サーバーはエラーを自動的に表示します。生産サーバーで安全でないデバッグモードを使用せずにエラーを表示するには、ビューを追加する必要があります。処理できる最も重要なエラーは次のとおりです。

エラー500-コードの問題 エラー404-見つからなかったページ(壊れたURL) エラー403-許可が拒否されたエラー

エラーと呼ばれるこれらのエラーを処理するための新しいアプリを追加しましょう。

python manage.py startapp errors

これをsettings.pyに追加したように、以前と同じように、installed_appsの設定で、App/urls.pyのいくつかのビューへの参照を追加することから始めます。アプリはdjangoプロジェクトの名前です。

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

これは、エラービュー、テンプレート、ミドルウェアの少し以外に必要なすべてです。それらをそう定義しましょう:

# ここであなたの意見を作成します。

次に、これらのエラーを処理するためにミドルウェアを定義しましょう。これは、最初にMiddleware_Classesに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.')

関数を追加して、ローカルのスレッドを使用して現在の例外を取得します。これにより、コードのエラーをトレースすることができます。テンプレートに関しては、ビューでタイトルを動的に定義するため、テンプレートは1つだけが必要です。テンプレートは、コンテキストからのエラートレースバックであるタイトルと「トレース」をレンダリングする必要があります。

nano errors/templates/errors/error.html

これは私たちの最も単純なテンプレートですが、プロジェクトのエラーを見るのは簡単です。次に、設定でデバッグを無効にしましょう。

nano app/settings.py

この行が真実に設定されている場所を見つけて、それをfalseに変更します

DEBUG = False

今すぐアプリをバックアップしてください。リモートLinuxサーバーに展開し、そこから機能を追加し続ける準備ができています。

sudo backup

このコードをサーバーに投稿する前に、コードにいくつかの問題があるかもしれないと考えるべきです。ケースに応じて、彼らに投稿された情報を受け入れるサイトには、スパムが投稿され、スパムの削除が困難になります。これはすぐには起こりませんが、それが起こっている場合は、後でサイトのスパムを自動的にモデレートし、ロボットがユーザーアカウントを非アクティブ化し、指紋や顔の認識のようなIDまたは生体認証スキャンでユーザーの身元を確認する方法をより困難にする方法を検討します。

生産で調べたマルチファクター認証の例を見ると、物事は異なる場合があります。ログインを制限し、トークンの期限切れにしていることに注意してください。ロボットがサイトにアクセスしている場合、ユーザーが同時にコードを入力する可能性があるため、2つの要因認証がより困難になる可能性があります。これと戦うために、ユーザーモデルのモデルを使用して、電話番号でマルチファクター認証を使用して認証するときにサイトとの対話方法を宣言しましょう。また、電子メールで認証するオプションも追加します。 NANOでユーザーモデルを編集することから始めます。

nano users/models.py

これは、追加しているモデルがどのように見えるかです。 ID、ユーザー、タイムスタンプ、有効期限、長さ、およびマルチファクター認証に対する試行(電話または電子メールに送信された123456などのコード)を保存するための方法だけの方法は必要ありません。

# ウェブサイトにログインするために使用される基本的なトークン

また、ユーザーに特権を追加しましょう。最終的には特権ユーザーの自動的に移住する前に、今のところ手動で設定します。ユーザーモデルでは、プロファイルにこの行を追加します。

    vendor = models.BooleanField(default=False)

データベースの変更と同様に、DjangoでModels.pyファイルを編集するたびに移行を行い、データベースを移行する必要があります。これを行うには、最初にソースを使用します(ターミナルが開いていたのでまだ使用されていない場合)。その後、python manage.pyで移行と移行を行います。

cd project-directory-you-named # (必要に応じて)

今のところ、シェルを使用してベンダーとして作成したアカウントを登録できます。

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

次に、このトークンを使用するためにマルチファクター認証ビューを進化させましょう。まず、MFAヘルパーユーティリティを変更する必要があります。ナノを使用して、

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

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# 電子メールまたは電話番号を使用してユーザーを認証します
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # URL(uuid)に渡された値によってトークンをフィルタリングします
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # このセッションが作成されていない場合は、作成してください
    user = User.objects.filter(id=token.user.id).first() # トークンからユーザーを取得します
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # それらがすでに認証されている場合は、それらをログインします
    if not user: raise PermissionDenied() # ユーザーが見つからなかった場合は拒否します
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # 認証トークンを確認してください
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # 彼らがまだログインしていない場合、ユーザーにログインします
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # マルチファクター認証の有効期限を設定します
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # ユーザーを次のページにリダイレクトします
    if not user.profile.mfa_enabled: # MFAが有効になっているかどうかを確認してください
        if not check_verification_time(user, token): # 時間を確認してください
            user.profile.mfa_enabled = False # 電話番号をクリアします
            user.profile.enable_two_factor_authentication = True # MFAを有効にします
            user.profile.phone_number = '+1' # 電話番号を無効にします
            user.profile.save() # プロファイルを保存します
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # MFAが有効になっていない場合はユーザーにログインします
    if request.method == 'POST' and not fraud_detect(request, True): # リクエストがPOSTリクエストの場合
        form = TfaForm(request.POST) # フォームをインスタンス化します
        code = str(form.data.get('code', None)) # コードを取得します
        if code and code != '' and code != None: # 空でないことを確認してください
            token_validated = user.profile.check_auth_token(usertoken) # 認証トークンを確認してください
            is_verified = check_verification_code(user, token, code) # コードを確認してください
            if token_validated: # すべてがあれば
                if is_verified: # 順番です
                    user.profile.mfa_enabled = True # MFAを有効にする(まだ有効になっていない場合)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # ユーザーにログインします
                    for key, value in request.GET.items(): # 次のパラメーターのクエリストリングを構築する(存在する場合)
                        return HttpResponseRedirect(next) # リダイレクト
            elif not token_validated: # トークンが無効だった場合
            if p.mfa_attempts > 3: # 試みが多すぎる場合
            if form.data.get('send_email', False): # 電子メール(またはテキスト)を送信する
    # フォームをレンダリングします(Get Requests用)

このコードを追加するときは、電子メールを送信するために関数をインポートしてください。ファイルの上部で、ユーザーは(他のインポート付き)を表示します。

from .mfa import send_verification_email as send_mfa_verification_email

これで、これが機能する前にその関数を書く必要があります。送信メール機能を拡張し、検証コードを使用してユーザーにメールを送信するだけです。

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

したがって、これはすべてうまく機能します。現在、電話番号または電子メールに依存する多因子認証システムがあります。ただし、削除する方法も、少なくとも条件に協力していないユーザーを非表示にします。これらは、スパマー、ロボット、または私たちの仕事を意味しない人である可能性があります。私のウェブサイトでユーザーを監視するためのビューを見てください:

# 輸入
from .tests import is_superuser_or_vendor # このテストを作成する必要があります
    # ユーザーのリストを取得します
    return render(request, 'users/users.html', { # テンプレートでユーザーを返します

このコードはテストを使用していることに注意してください。このテストをtests.pyファイルで宣言してインポートする必要があります。ユーザー/tests.pyの編集、テストを作成しましょう。

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

これは、users/users.htmlテンプレートと組み合わせて、次のようになります。

テンプレートには別のテンプレートが含まれていることに注意してください、ユーザー/user.html。サブテンプレートを持ち、拡張機能を使用していないテンプレートを使用する場合、アンダースコアを追加することをお勧めします()テンプレートを区別するために、拡張するファイルの名前の前。

これは多くのジンジャであり、これらの変数のすべてが定義されているわけではないことに注意してください。しかし、これが私のコードの外観です。

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

また、別のサブテンプレート、toggle_active.htmlも必要です。このテンプレートは、ユーザーがアクティブであるかどうかを切り替えることができるフォームである必要があります。

また、ユーザーアクティビティと適切なURLパターンを切り替えるビューを追加する必要があります。私たちがそれに取り組んでいる間、それが必要な場合にユーザーを削除するビューを追加しましょう。

# 輸入
    success_url = '/' # 成功URLのリダイレクト
    def test_func(self): # ユーザーがスーパーユーザーであり、削除する許可があるかどうかをテストします

これは必要に応じて実用的ですが、ほとんどの場合、ユーザーを削除する必要はないはずですが、却下する必要がある場合は、サイトにアクセスするユーザーの可視性を切り替えることができます。

追加したURLパターンは、このように見えます。 nanoを使用して、ユーザー/urls.pyを編集して、これらの行を追加します。

nano users/urls.py

行は、エンディングの前にユーザービューのパスのリストに載る必要があります。

# …
# …

次に、サイトをバックアップして、作業を続けるWebサーバーにダウンロードできるようにしてください。コマンドラインから、

sudo backup

今、私たちのサイトはバックアップされています。

そのため、いくつかの便利な機能があります。しかし、ここの全体像はどうですか?このコードはまだインターネットからアクセスできず、メールサーバーはまだありません。また、特権ユーザーを認証するための安全なプロトコルとともに、包括的な検証プロセスとスムーズなレイアウトを含めるためにアプリを拡張するためにアプリを拡張する必要があります。

これらすべてに到達します。今のところ最も重要なことは、このコードをオンラインで取得することです。これは、Ubuntuサーバーでのほんの数行のbashでできます。ただし、自宅にサーバーとポートを開くことができるビジネスインターネットサブスクリプションがない限り、このためにサーバーをレンタルする必要があります。私は個人的に私のアパートにインストールされているHP Z440でウェブサイトを実行していますが、通常、仮想プライベートサーバー(VPS)をレ​​ンタルするための基本的なニーズがはるかに安いです。

現在実行しているコードは比較的薄く、製品を構築するために必要なものを使用する準備が整う前に、維持および改善する必要があることに留意してください。インターネットで何をしているかに注意してください。このサイトをLinuxサーバーでWebに公開している場合は、Webサイトとの不要なやり取りをブロックする計画があります。これは最初は問題にならないでしょうが、機械学習、人工知能、コンピュータービジョンなど、これと戦うためのさまざまなソリューションを検討します。問題が発生したら、このテキストをさらに検討して、解決策を確認してください。

VPSを借りるという点では、行くことができる場所がたくさんあります。 Google Cloudには、VPSサーバー、Ionos、Kamatera、Amazon AWS、およびより多くのプロバイダーが私たちのニーズに合ったクラウドサーバーソリューションを提供しています。

フォームをクリックして、開始する計画を選択する必要があります。プロバイダーと一緒に基本プランを使用することはできますが、プロバイダーがポートメールサーバーポートを開いて電子メールを送信できることを確認してください(これはポート587とポート25である必要があります)、一部のプロバイダーはこれらのポートをブロックします。これまでのところ、私はIonosとKamateraで最高の経験をしてきました。どちらも無制限の電子メールを送信することができ、価格はかなり安いです。

SSHまたはSecure Shellというプロトコルを介して新しいサーバーに接続します。これにより、パーソナルコンピューターから、パーソナルコンピューターとまったく同じようにサーバーとリモートでインターフェイスできます。サーバーをセットアップすると、ホスティングプロバイダーはSSHキーを追加するように依頼する可能性があります。または、ユーザー名とパスワードが表示されます。 SSHキーは、コマンドラインからサーバーにログインしてコードを編集する方法です。以下のSSH-KeyGenオプションを使用して、SSHキーを生成します。

ssh-keygen

ファイルを保存して、必要に応じて上書きする必要がある場合は、SSHキーをまだ回転させていない場合は良いことです。これで、次のコマンドを使用してSSHキーを表示できます。リモートサーバーにコピーして、使用して認証できるようにする必要があります。

cat ~/.ssh/id_rsa.pub

そのコマンドを入力するときにSSHキー(「SSH-RSA AAA」から始まる長い数字と文字)を見ることができなかった場合は、RSAキーを生成してみてください(それらをより安全であるため、使用することをお勧めします。)次のコードは4096ビットRSA SSHキーを生成します。

ssh-keygen -t rsa -b 4096

Ubuntuを実行しているVPSを作成しますが、これを行う予定です。 Providers Webサイト(kamatera.com、ionos.comなど)のフォームをクリックしてVPSを作成したら、ログインする必要があります。これを行うには、IPアドレス(xx.xx.xx.xxのように見えるアドレス)でSSHコマンドを使用します。また、作成したサーバー上のデフォルトのユーザー名、たとえばubuntuに敏感である必要があります。

ssh ubuntu@XX.XX.XX.XX

パスワードを要求される場合があります。パスワードを求められている場合は、入力してください。デフォルトのユーザー名は使用しません。まず、新しいユーザーを作成してSSHキーをアカウントに追加してください。

まず、SSHの使用方法をサーバーに伝える新しいSSHD_CONFIGファイルを追加します。

nano sshd_config
# これは、SSHDサーバーシステム全体の構成ファイルです。  見る
# SSHD_CONFIG(5)詳細については。
# このSSHDは、path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesでコンパイルされました
# デフォルトのsshd_configのオプションに使用される戦略
# opensshは、デフォルトの値でオプションを指定することです。
# 可能ですが、彼らにコメントしたままにしておきます。  メントなしのオプションはオーバーライドします
# デフォルト値。
# ポート22
# アドレスファミリー任意
# 聴く0.0.0.0
# 聞くことを聞く::
# hostkey/etc/ssh/ssh_host_rsa_key
# hostkey/etc/ssh/ssh_host_ecdsa_key
# hostkey/etc/ssh/ssh_host_ed25519_key
# 暗号とキーイング
# rekeylimitデフォルトなし
# ロギング
# Syslogfacility Auth
# loglevel情報
# 認証:
# logingraceTime 2m
# permitrootloginはパスワードを禁止します
# StrictModesはい
# Maxauthries 6
# 最大10
# .ssh/authorized_keys2が将来デフォルトで無視されることを期待してください。
# 認定principalsfileなし
# 認定KeysCommandなし
# 認定KeysCommanduser誰も
# これを機能させるには、/etc/sssh/ssh_known_hostsのホストキーも必要です
# hostbasedAuthentication no
# 〜/.ssh/nown_hostsを信頼していない場合は、はいに変更します
# hostbasedAuthentication
# IngroreUserknownhosts no
# ユーザーの〜/.Rhostsおよび〜/.shostsファイルを読んではいけません
# IgnorerHostsはい
# Tunneled Clear Textパスワードを無効にするには、ここでNOに変更してください!
# ammitemptypasswords no
# offery-responseパスワードを有効にするには、はいに変更します(問題に注意してください
# いくつかのPAMモジュールとスレッド)
# Kerberosオプション
# Kerberosauthentication no
# kerberosorlocalpasswdはい
# kerberosticketcleanupはい
# Kerberosgetafstoken no
# GSSAPIオプション
# gssapiauthentication no
# gssapicleanupcredentialsはい
# gssapistrictacceptorcheckはい
# gssapikeyexchange no
# これを「はい」に設定して、PAM認証、アカウント処理を有効にします。
# およびセッション処理。これが有効になっている場合、PAM認証は行われます
# KBDINTERACTIVEAUTHENTICIATIONを通じて許可されます
# PasswordAuthentication。  PAM構成に応じて、
# KBDINTERACTIVEAUTHENTICATIONによるPAM認証は、バイパスされる場合があります
# 「パスワードのないPermitrootlogin」の設定。
# PAMアカウントとセッションチェックが必要な場合は、
# PAM認証は、これを有効にしますが、PasswordAuthenticationを設定します
# および「いいえ」へのkbdinteractiveauthentication。
# AlowAgentForwardingはい
# Alowtcpforwardingはい
# ゲートウェイポート番号
# x11displayoffset 10
# x11uselocalhostはい
# 許可はい
# printlastlogはい
# tcpkeepaliveはい
# Prituserenvironment no
# 圧縮遅延
# ClientAliveInterval 0
# ClientAliveCountMax 3
# 使用済みno
# pidfile /run/sshd.pid
# Maxstartups 10:30:100
# 浸透材番号
# Chrootdirectoryなし
# versionAddendumなし
# デフォルトのバナーパスはありません
# クライアントがロケール環境変数を渡すことを許可します
# サブシステムなしのデフォルトをオーバーライドします
# ユーザーごとのオーバーライド設定の例
# ユーザーANONCVSを一致させます
# x11forwarding no
# Allowtcpforwarding no
# 許可番号
# ForceCommand CVSサーバー

ファイルを保存するには、ctrl+xおよびyを覚えておいてください。次に、Initialize(すべてユーザーのデフォルトのホームディレクトリにあるすべて)という基本的なスクリプトを書きましょう。

nano initialize

これらの行をファイルに追加し、置き換えますSSHキーを使用して、CATを使用して見つかりました。 (.ssh/id_rsa.pub)

# !/bin/bash

このファイルを紹介するには、行ごとにスタートしましょう。最初の行は、これがバッシュスクリプトであることをコンパイラに伝えます。次に、依存関係をインストールし、sshd_configを正しいディレクトリにコピーし、sshを再起動し、rootのsshキーを生成し、ユーザー「チーム」を追加します(これに好きな名前を選択できます。また、Sudoグループにチームを追加し、SSHキーを生成し、承認されたキーとそれらのキーにもキーを追加し、キーを印刷します。この新しいユーザーは、サイトへのログイン方法です。

新しい端末で、先に進んでサーバーを再度開きます。

ssh team@XX.XX.XX.XX

SSHキーがあるので、今回はパスワードを必要としません。また、サイトを安全に保つために、パスワードでログインを無効にしました。

これで、このサーバーは情報がなく、完全に空白に起動します。 Gitからプロジェクトをクローニングして、リモートマシンでダウンロードして実行できるようにしましょう。 SSHに接続されたリモートサーバーで、最初にSSHキーを印刷します。

cat ~/.ssh/id_rsa.pub

次に、このキーをGitリポジトリをセットアップするために前に行ったように、GIT設定に貼り付けます。これで、プロジェクトをサーバーに直接クローンすることができます。最初にプロジェクトをローカルでバックアップしていることを確認して、Gitサーバー上にダウンロードしてください。

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

完璧。これで、すべてのファイルがここにあります。 LSでそれらを見ることができます

ls

それでは、サーバーのセットアップを始めましょう。まず、プロジェクトディレクトリをプロジェクトに使用するシンプルで記憶に残る名前にコピーします。

cp -r yourproject whatyoucalledit

ここで、「Whatyoucalledit」はあなたのプロジェクトの新しい名前です。次に、サーバーをセットアップするには、基本的なユーティリティを構築する必要があります。このユーティリティを保存し、将来使用します。このユーティリティを構築するには、ユーザーバイナリを作成して、スクリプトの編集方法を定義します。 BASHを使用して、編集/usr/bin/ascript

sudo nano /usr/bin/ascript

ファイルを編集する権限があるように、そこにsudoを使用してください。ファイルに、これらの行を追加します。

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

このスクリプトは、スクリプト名を1ドルとすることを忘れないでください。最初に、ファイルが存在するかどうかを確認するか、そうでなければ作成し、最初の行を追加してスクリプトがバッシュであることを宣言し、アクセス許可を変更し、編集し、 /etc /ascriptsに追加して、作成しているスクリプトの名前を保存できるようにします。ファイルが既に存在する場合は、権限を変更して編集するだけです。ファイルを保存すると、次にその権限を変更します。このスクリプトを使用している限り、それをもう一度行う必要はありません。

sudo chmod a+x /usr/bin/ascript

完璧。次に、セットアップというスクリプトを作成しましょう。まず、あなたを圧倒するのではなく、私のセットアップスクリプトがどのように見えるかを見てみましょう。私たちはあなたのプロジェクトでこのスクリプトがどのように見えるべきかを説明します、あなたは私のスクリプト内のすべてを最初から必要とすることはありません。

# !/bin/bash
# sudo chmod a+x scripts/usersetup
# ./scripts/usersetup
# ssh-keygen
# プロジェクトディレクトリ
# ログコマンド
# nano config
# git config
# 更新してインストールします
# クラマブアンチウイルスを有効にします
# ホスト名を設定します
# Postgresをセットアップします
# データベースのバックアップをセットアップします
# iptablesを無効にします
# BitDefenderをインストールします
# ポストフィックスをセットアップします
# 監督を作成します
# virtualenvをセットアップします
# 依存関係を取得して構築します
# ファイアウォールルールを設定します
# PYPI依存関係をインストールします
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIPインストールopencv-python == 4.5.5.64
# PIPインストールopencv-contrib-python == 4.5.5.64
# certbotをインストールします
# certbotを実行します
# メールサーバーをリロードします
# 証明書をコピーします
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# パッチvenv
# ユーザー設定を設定します
# 設定権限
# sudo chown -rチーム:ユーザー/var/run/
# sudo chown root:root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data:ユーザーdb.sqlite3
# 設定をコピーしてアクセス許可を設定します
# データベースのセットアップ
# PAM構成を注入し、故障したSSH構成を削除します
# sudo sed -i '' -e '$ d'/etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /プロファイル
# ビンスクリプトをコピーしてアクセス許可を設定します
# サービスをリロードおよび有効にします
# Apacheモジュールを有効にします
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# デフォルトサイトを無効にします
# 当社のサイトを有効にします
# デーモンをリロードし、アパッチ、ポストフィックス、opendkimを再起動します
# 設定権限
# 構成を交換します
# INITキャプションエンジン
# Gitをセットアップします
# ドメイン構成のIPv6とOpendKimを表示します
# セットアップが完了しました

それはたくさんのセットアップです!要するに、このコードはコマンドを記録し、NANOとGITを構成し、ファイルをコピーし、Ubuntu APTパッケージ、Python依存関係をダウンロードしてインストールし、Postfixを構成し、PostgreSQL(データベースサーバー)を構成し、データベースをロードし、UFW(不正なFirwall)、Inctives Inticas and antiviurusの設置を設定します。サーバーをセットアップし、構成をインストールし、SEVERを開始して有効にし、スワップを割り当て、アクセス許可を設定し、IP、IPv6アドレス、OpenDKIMキーを印刷します。かなり簡単ですが、多くのコードのように見えます。依存関係がないため、セロリ、セロリビート、ダフネを使用していないため、これは多く必要ありませんが、とにかくいくつかをインストールして開始します。このコードにはドメインが数回宣言されていることに注意してください。

また、ドメイン名を購入する必要があります(これは年間少額の料金です)。ドメインを購入するためにSquarespaceをお勧めします。レイアウトは直感的で使いやすいです。お好みのドメインは任意のドメインを購入できますが、この例ではdomain femmebabe.comを使用しています。ドメインを購入したら、Squarespace DNS構成パネルに移動し、IPアドレスでサーバーにドメインを指すレコードを追加します。このように見えるはずです:

@ a xx.xx.xx.xx

@ operatorをホストとして、つまり、このドメインとルートドメインの下のすべてのサブドメインを意味します。すべてサーバーにリダイレクトされます。宣言するレコードはもっとありますが、メールを送信する準備ができたら、これらに進むことができます。サーバーからメールを正常に送信できるようになるまでに数日かかる場合があります。設定しているDNSレコードは、伝播するのに時間がかかります。

とにかく、開始する必要がある唯一のレコードはAレコードです。そのため、プロジェクトに従って以下のスクリプトに記入して実行できます。

より小さなセットアップスクリプトから始めて、基本的な進捗に必要なものをインストールするだけです。まだ多くの依存関係やPostgreSQLを使用することはありません。基本的なHTTPサーバーを起動して、それが完了したときにそれを認証することを心配します。 HTTPS証明書を取得し、サーバーを安全に実行するには、サーバーをレンタルすることとともにドメインを購入する必要があります。今のところ、このファイルの「チーム」をユーザーの名前に置き換え、プロジェクトのディレクトリに「dir」を<>タグに電子メールとドメインを提供します。

さらに、このコードを実行する前に、ホスティングプロバイダーがサポートする場合、設定をファイアウォールに変更する必要があります。通常、これはホスティングプロバイダーの「ネットワーク」タブにあります。また、セルフホスティングの場合は、ルーターの「ポート転送」セクションにあります。また、セルフホスティングを使用している場合は、サーバーマシンのアドレスを使用してルーターを介して静的IPをセットアップする必要があります。読み取り/書き込みアクセスのために、次のポートを開く必要があります。

22(SSH) 25(メール) 587(メール) 110(メールクライアント) 80(http) 443(https)

# !/bin/bash
# ログコマンド
# nano config
# git config
# 更新してインストールします
# クラマブアンチウイルスを有効にします
# ホスト名を設定します
# データベースのバックアップをセットアップします
# iptablesを無効にします
# virtualenvをセットアップします
# certbotをインストールします
# certbotを実行します
# ユーザー設定を設定します
# 設定権限
# sudo chown -rチーム:ユーザー/var/run/
# sudo chown root:root/run/sudo/ts -r
# サービスをリロードおよび有効にします
# Apacheモジュールを有効にします
# デーモンをリロードし、アパッチ、ポストフィックス、opendkimを再起動します
# ドメイン構成のIPv6とOpendKimを表示します

このコードを実行する前に、購入したドメインがサーバーに接続されていることを確認してください。これを行うには、ローカルマシンで端末を開き、ドメインでこのコマンドを実行します。

ping femmebabe.com # pingの後、ここにドメインを挿入します

すべてがうまく見える場合、サーバーが応答を送信している場合、スクリプトを実行してパッケージをインストールし、Apacheサーバーを開始、有効化、証明する準備ができています。

これは、Postfixの構成に必要なすべてのセットアップではありません。後でそのセットアップを詳しく調べます。とりあえず、このセットアップコードを実行すると、サーバーのインストールと証明に数分かかるはずです。もう一度、購入した名前に従ってスクリプト内の名前、電子メール、ドメイン名を必ず置き換えてください。

サーバーがプロビジョニングされたので、任意のWebブラウザのURLに移動し、サーバーがHTTPSを実行していることを確認することができます。そうでない場合は、DNSレコードが追いつくのを少し待ってから、次のコマンドを実行してCertBot認定を再試行してください。

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

すべてを正しく構成している限り、コードが機能していることを知るために、Apacheのデフォルトページにアクセスできるはずです。次に、settings.pyを編集して、デフォルトのデバッグモードを生産に変更しましょう。また、内部IPSだけでなく、設定のドメインも構成します。

nano yourproject/settings.py

設定で、これらの行を変更/追加します。

# サイト構成

これで、apache2を構成する必要があります。この行で展開する構成ファイルを編集しましょう。

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

この構成ファイルには、ドメイン名とユーザーとプロジェクトの名前があります。ドメイン名Femmebabe.com、ユーザー名チーム、およびプロジェクト名Femmebabeを使用しています。

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

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

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

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

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

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

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

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

	TimeOut 60000
	LimitRequestBody 0

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

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

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

サーバーを構成するときは、この例コードのプロジェクト、ディレクトリ、およびドメインの名前を必ず置き換えてください。これで、デフォルトのサイトを無効にする必要があります。これは、bashを使用して実行できます。

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

次に、bashを使用して、デフォルトのサイトを有効にし、apache2をリロードできます。 femmebabeを、/etc/apache2/sites-abaible/で編集するときに宣言したファイルの名前に置き換えることを忘れないでください。

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Navbarのドメインに戻ります。 Webブラウザで構成したサイトが表示されます。おめでとう!表示されない場合は、いくつかの変更を加える必要がある場合があります。プロジェクトの設定、Apache Configurationを慎重に確認し、エラーがないことを確認し、次のコマンドを実行してプロジェクトにエラーを確認します。

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

Pythonプロジェクトにエラーがある場合は、それらをどこにいるかまでトレースして修正します。エラーがどこにあるかに応じて、すべてのエラーが表示されない場合があるため、単に「Lopulateがリエントラントではない」というエラーがある場合は、仮想環境で次のファイルを編集してエラーを公開します。

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

このランタイムエラーが発生する83行目にスクロールし(RuntimeError( "Populate()Reentrant"ではない "))、この行の前にコメントを追加してから、同じインデントでself.app_configs = {}を追加します。これは次のようになります:

                # appconfig.ready()の実行を避けるためにリエントラントコールを防ぐ
                # 方法は2回。
# RuntimeErrorをRaise( "Populate()は再び入手していません")

その後、プロジェクトをもう一度確認して、エラーを公開できます。

python manage.py check

次に、エラーを確認して修正できます。修正して、コードがエラーなしでコンパイルされたら、ファイルを必ず変更して、次のようになります。

                # appconfig.ready()の実行を避けるためにリエントラントコールを防ぐ
                # 方法は2回。
# self.app_configs = {}

サーバーがオンラインである場合、さらに変更を加えると、次のコマンドを使用してサーバーをリロードする必要があります。

sudo systemctl reload apache2

素晴らしい!しかし、メールを送信するのはどうですか?メールの送信を開始するには、最初にドメイン構成を更新する必要があります。これは、SquarespaceのDNSパネル、または選択したドメイン名レジストラにある必要があります。また、設定をインストールして追加し、いくつかのコマンドを実行する必要があります。

まず、サーバーのIPv6アドレスを取得しましょう。その後、DNSを開き、レコードを追加します。

サーバーのIPv6アドレスを取得するには、このコマンドを使用します。

ip -6 addr

これで、次のレコードをDNS設定に追加できます。私のレコードはこのように見えます。ただし、レコードの場合、IPアドレスをIPに置き換える必要があります(75.147.182.214ではなく、それが私のものです)。また、Femmebabe.comの代わりにドメインを追加し、前のコマンドで見つかったIPv6アドレスを追加します(Mine、Fe80 :: 725a:FFF:FE49:3E02を使用できません)。今のところDomainKeyについて心配しないでください。これは、Postfix、Mail Server、OpendKimを使用してキーを印刷するときに作成されます。最後に構成します。

@ 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/femmebabe.svg

_dmarc TXT n/a V = DMARC1; p =なし

sendonly._domainkey TXT n/a

次に、Postfixに持続的な構成を追加する必要があります。必要なのは、ドメイン名、Femmebabe.comを使用しているドメイン名に置き換えることです。すべての構成ファイルを1つずつ見て、OSにインストールするために、プロジェクトのConfig Configというディレクトリにインストールします。

nano config/etc_postfix_main.cf

このテキストをファイルに追加します

# /usr/share/postfix/main.cf.distを参照してください
# Debian固有:ファイル名を指定すると、最初のものが発生します
# そのファイルの行は、名前として使用されます。  Debianデフォルト
# /etc /mailNameです。
# myorigin = /etc /mailName
# appending .domainはMUAの仕事です。
# 次の行を解除して、「遅延メール」警告を生成します
# delay_warning_time = 4h
# http://www.postfix.org/compatibility_readme.htmlを参照してください - デフォルトは3.6オンです
# 新鮮なインストール。
# TLSパラメーター
# Milter構成

次の構成!

nano config/etc_postfix_master.cf

これらの行を追加します:

# 
# Postfixマスタープロセス構成ファイル。  フォーマットの詳細については
# ファイルについては、マスター(5)マニュアルページ(コマンド: "Man 5 Master"または
# オンライン:http://www.postfix.org/master.5.html)。
# 
# このファイルを編集した後、「ポストフィックスリロード」を実行することを忘れないでください。
# 
# ==============================================================================
# サービスタイププライベートUNPRIV Chroot WakeUp MaxProc Command + Args
# (はい)(はい)(いいえ)(決して)(100)
# ==============================================================================
# smtp inet n -y -1ポストスクリーン
# SMTPDパス -  Y-SMTPD
# dnsblog unix-- y -0 dnsblog
# tlsproxy unix -y -0 tlsproxy
# 1つを選択します。Loopbackクライアントのみ、またはクライアントに送信を有効にします。
# 127.0.0.1:submission inet n -y- smtpd
# -o syslog_name = postfix/submission
# -o smtpd_tls_security_level = encrypt
# -o smtpd_sasl_auth_enable = yes
# -o smtpd_tls_auth_only = yes
# -o smtpd_reject_unlisted_recipient = no
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o SMTPD_RELAY_RESTRICTIONS = permit_sasl_authenticated、拒否
# -o milter_macro_daemon_name = originating
# 1つを選択します。Loopbackクライアントのみ、またはクライアントのSMTPSを有効にします。
# 127.0.0.1:SMTPS INET N -Y- SMTPD
# smtps inet n -y- smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = yes
# -o smtpd_sasl_auth_enable = yes
# -o smtpd_reject_unlisted_recipient = no
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o SMTPD_RELAY_RESTRICTIONS = permit_sasl_authenticated、拒否
# -o milter_macro_daemon_name = originating
# 628 inet n -y- qmqpd
# Qmgr unix n -n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ===========================================================================
# 非ポストフィックスソフトウェアへのインターフェイス。必ずマニュアルを調べてください
# 非Postfixソフトウェアのページでは、必要なオプションを確認します。
# 
# 次のサービスの多くは、ポストフィックスパイプ(8)配達を使用しています
# エージェント。  $ {受信者}についての情報については、パイプ(8)のページを参照してください
# その他のメッセージエンベロープオプション。
# ===========================================================================
# 
# メールドロップ。詳細については、postfix maildrop_readmeファイルを参照してください。
# また、main.cf:maildrop_destination_recipient_limit = 1で指定します
# 
# 
# ===========================================================================
# 
# 最近のCyrusバージョンは、既存の「LMTP」Master.CFエントリを使用できます。
# 
# Cyrus.confで指定します:
# lmtp cmd = "lmtpd -a" listen = "localhost:lmtp" proto = tcp4
# 
# main.cfで指定します。
# Mailbox_transport = lmtp:inet:localhost
# virtual_transport = lmtp:inet:localhost
# 
# ===========================================================================
# 
# サイラス2.1.5(Amos Gouaux)
# また、main.cf:cyrus_destination_recipient_limit = 1で指定します
# 
# Cyrus Unix -N N-パイプ
# flags = drx user = cyrus argv =/cyrus/bin/derivial -e -r $ {sender} -m $ {endixt} $ {user}
# 
# ===========================================================================
# サイラスを介した配達の古い例。
# 
# オールドサイラスUnix -n n  - パイプ
# flags = r user = cyrus argv =/cyrus/bin/derivie -e -m $ {endoxt} $ {user}
# 
# ===========================================================================
# 
# 構成の詳細については、Postfix uucp_readmeファイルを参照してください。
# 
# 
# その他の外部配信方法。
# 

およびOpendKim構成。 OpendKimは、ドメインキーを備えた電子メールサーバーを識別して、より安全にします。それがなければ、メールは署名されておらず、受信トレイに登場しない可能性があります。

nano config/etc_default_opendkim

これらの行を追加します:

# 注:これはレガシー構成ファイルです。 OpendKimで使用されていません
# SystemDサービス。対応する構成パラメーターを使用してください
# /etc/opendkim.conf代わりに。
# 
# 以前は、ここでデフォルト設定を編集してから実行します
# /lib/opendkim/opendkim.service.generate systemd override filesを生成します
# /etc/systemd/system/opendkim.service.d/override.conf and
# /etc/tmpfiles.d/opendkim.conf。これはまだ可能ですが、今です
# /etc/opendkim.confで設定を直接調整することをお勧めします。
# 
# daemon_opts = ""
# /var/spool/postfix/run/opendkimに変更して、unixソケットを使用します
# chrootのポストフィックス:
# rundir =/var/spool/postfix/run/opendkim
# 
# 代替ソケットを指定するための障害
# これを設定すると、opendkim.confのソケット値がオーバーライドされることに注意してください
# デフォルト:
# ポート54321のすべてのインターフェイスで聞く:
# Socket = INET:54321
# ポート12345のループバックで聞く:
# socket = inet:12345@localhost
# ポート12345で192.0.2.1で聞く:
# Socket = inet:12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

これらの行を追加します:

# default_process_limit = 100
# default_client_limit = 1000
# サービスプロセスのデフォルトVSZ(仮想メモリサイズ)制限。これは主にです
# 彼らが食事をする前にメモリを漏らすプロセスをキャッチして殺すことを意図した
# すべて。
# default_vsz_limit = 256m
# ログインユーザーは、ログインプロセスで内部的に使用されます。これは最も信頼されていないものです
# dovecotシステムのユーザー。何にもアクセスできないはずです。
# default_login_user = dovenull
# 内部ユーザーは、特権のないプロセスで使用されます。それは別にする必要があります
# ログインユーザーは、ログインプロセスが他のプロセスを妨害できないようにします。
# default_internal_user = dovecot
    # ポート= 143
    # ポート= 993
    # SSL =はい
  # 新しいプロセスを開始する前に処理する接続の数。通常
  # 唯一の有用な値は0(無制限)または1。1の方が安全ですが、0
  # より速いです。 <doc/wiki/loginprocess.txt>
  # service_count = 1
  # 常により多くの接続を待ち続けるプロセスの数。
  # process_min_avail = 0
  # service_count = 0を設定した場合、おそらくこれを成長させる必要があります。
  # vsz_limit = $ default_vsz_limit
    # ポート= 110
    # ポート= 995
    # SSL =はい
    # ポート= 587
  # 上記のUNIXソケットを使用できない場合にのみINETリスナーを作成します
  # inet_listener lmtp {
    # インターネット全体にLMTPを表示しないでください
    # アドレス=
    # port =
  # }
  # ほとんどのメモリは、MMAP()ingファイルに移動します。これを増やす必要があるかもしれません
  # 巨大なメールボックスがある場合は制限します。
  # vsz_limit = $ default_vsz_limit
  # マックス。 IMAPプロセスの数(接続)
  # process_limit = 1024
  # マックス。 POP3プロセスの数(接続)
  # process_limit = 1024
  # マックス。 SMTP提出プロセスの数(接続)
  # process_limit = 1024
  # auth_socket_pathは、デフォルトでこのuserdbソケットを指しています。通常です
  # dovecot-lda、doveadm、おそらくimapプロセスなどが使用しているユーザー
  # このソケットへの完全な権限は、すべてのユーザー名のリストを取得できます。
  # 全員のuserDBルックアップの結果を取得します。
  # 
  # デフォルトの0666モードにより、誰でもソケットに接続できますが、
  # userdbルックアップは、userdbが「uid」フィールドを返す場合にのみ成功します。
  # 発信者プロセスのUIDに一致します。また、発信者のUIDまたはGIDが一致する場合
  # ソケットのuidまたはgid lookupが成功します。他のものは失敗を引き起こします。
  # 
  # すべてのユーザーを検索するために発信者に完全な権限を与えるには、モードをに設定します
  # 0666以外の何かとdovecotを使用すると、カーネルが強制されます
  # 権限(たとえば、0777を使用すると、全員が完全な権限を許可します)。
  # Auth Workerプロセスはデフォルトでルートとして実行されるため、アクセスできるように
  # /など/影。これが不要な場合は、ユーザーをに変更する必要があります
  # $ default_internal_user。
  # user = root
  # DICTプロキシを使用する場合、メールプロセスはソケットにアクセスできるはずです。
  # 例:mode = 0660、group = vmail、およびglobal mail_access_groups = vmail
    # モード= 0600
    # ユーザー=
    # グループ=

もう一度、これらのすべてのファイルのドメイン、Femmebabe.comを選択したドメインに置き換えるようにしてください。次のファイル、dovecotの構成を編集します。

nano config/etc_dovecot_dovecot

これらの行を追加します

## dovecot構成ファイル
# 急いでいる場合は、http://wiki2.dovecot.org/quickconfigurationを参照してください
# 「doveconf -n」コマンドは、変更された設定のクリーンな出力を提供します。使用してください
# dovecotメーリングリストに投稿するときにファイルをコピーして貼り付ける代わりに。
# '# 'キャラクターとそれがコメントとして扱われた後のすべて。余分なスペース
# タブは無視されます。これらのいずれかを明示的に使用したい場合は、
# value inside quotes, eg.: key = "# チャーとトレーリングホワイトスペース」
# ほとんどの(すべてではありませんが)設定は、異なるプロトコルおよび/または
# セクション内に設定を配置して、ソース/宛先IPSなど:
# プロトコルIMAP {}、ローカル127.0.0.1 {}、リモート10.0.0.0/8 {}
# 各設定のデフォルト値が表示され、除外する必要はありません
# それらの。これらはこれの例外です:セクションなし(例:名前空間{})
# または、プラグインの設定がデフォルトで追加され、それらは例としてのみリストされています。
# パスは単なる例であり、実際のデフォルトは構成に基づいています
# オプション。ここにリストされているパスは、configure  -  -prefix =/usrです
# -sysconfdir =/etc -localStatedir =/var
# インストールされたプロトコルを有効にします
# 接続のために耳を傾ける場所またはホストのコンマ分離されたリスト。
# "*"すべてのIPv4インターフェイスで聴きます "::"すべてのIPv6インターフェイスで聴きます。
# 非デフォルトポートなどを指定する場合は、より複雑なものを指定したい場合は、
# conf.d/master.confを編集します。
# 聞く= *、::
# ランタイムデータを保存するベースディレクトリ。
# base_dir =/var/run/dovecot/
# このインスタンスの名前。 Multi-InstanceのセットアップDoveadmおよびその他のコマンド
# -i <intance_name>を使用して使用するインスタンスを選択できます(代替案
# -c <config_path>へ)。インスタンス名もdovecotプロセスに追加されます
# PS出力で。
# instance_name = dovecot
# クライアントへの挨拶メッセージ。
# login_greeting = dovecot ready。
# 信頼できるネットワーク範囲のスペース分離リスト。これらからの接続
# IPはIPアドレスとポートをオーバーライドすることができます(ロギング用と
# 認証チェック用)。 disable_plaintext_authも無視されます
# これらのネットワーク。通常、ここでIMAPプロキシサーバーを指定します。
# login_trusted_networks =
# ログインアクセスチェックソケットのスペース分離リスト(TCPWRAPなど)
# login_access_sockets =
# proxy_maybe =はい、プロキシ宛先がこれらのipsのいずれかに一致する場合、しないでください
# プロキシ。これは正常に必要ではありませんが、目的地の場合は便利かもしれません
# IPは例えばロードバランサーのIP。
# auth_proxy_self =
# より多くの冗長プロセスタイトル(PS)を表示します。現在、ユーザー名と
# IPアドレス。誰が実際にIMAPプロセスを使用しているのかを見るのに便利です
# (たとえば、共有メールボックスまたは複数のアカウントに同じUIDが使用されている場合)。
# verbose_proctitle = no
# DoveCotマスタープロセスがシャットダウンすると、すべてのプロセスが殺される場合。
# これを「いいえ」に設定することは、dovecotをなしでアップグレードできることを意味します
# 既存のクライアント接続を強制することを強制します(ただし、
# アップグレードがたとえばの場合の問題セキュリティ修正のため)。
# shutdown_clients =はい
# ゼロ以外の場合は、DoveAdMサーバーへのこの多くの接続を介してメールコマンドを実行します。
# 同じプロセスで直接実行する代わりに。
# doveadm_worker_count = 0
# UNIXソケットまたはホスト:DOVEADMサーバーへの接続に使用されるポート
# doveadm_socket_path = doveadm-server
# dovecotに保存されている環境変数のスペース分離リスト
# スタートアップとそのすべての子プロセスに渡されました。あなたも与えることができます
# key = valueペア常に特定の設定を設定します。
# import_environment = tz
## 
## 辞書サーバー設定
## 
# 辞書は、key = valueリストを保存するために使用できます。これはいくつかで使用されます
# プラグイン。辞書には直接または
# 辞書サーバー。次のDICTブロックマップ辞書名はURISに
# サーバーが使用されるとき。これらは、urisを使用して形式で参照できます
# 「プロキシ:: <Name>」。
  # quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
# 実際の構成のほとんどは以下に含まれます。ファイル名はそうです
# 最初にASCII値でソートされ、その順序で解析されます。 00-prefixes
# ファイル名では、注文を理解しやすくすることを目的としています。
# 設定ファイルは、エラーを与えずに含めることもできました
# 見つかりません:
# dovecotがすべての入力接続を聴くことができます(IPv4 / IPv6)

dovecotユーザーのパスワードを追加します。

nano config/etc_dovecot_passwd

コロンの前のファイルの最初の部分はユーザー名です。最後の部分「YourPassWord」は、メールサーバーを提供するパスワードを示します。

team:{plain}yourpassword

次に、opendkim config

nano config/etc_opendkim.conf

これらの行を追加します:

# これは、署名と検証のための基本的な構成です。簡単にすることができます
# 基本的なインストールに合わせて適応します。 opendkim.conf(5)および
# /usr/share/doc/opendkim/examples/opendkim.conf.sampleを完全に
# 使用可能な構成パラメーターのドキュメント。
# logwhy no
# 一般的な署名と検証パラメーター。 Debianでは、「From」ヘッダーです
# それは多くの場合、評判システムが使用するアイデンティティキーであるため、オーバー署名しました
# したがって、ややセキュリティに敏感です。
# 署名ドメイン、セレクター、およびキー(必須)。たとえば、署名を実行します
# セレクター「2020」(2020.domainkey.example.com)を備えたドメイン「embler.com」
# /etc/dkimkeys/example.privateに保存されている秘密鍵を使用します。もっと粒状
# セットアップオプションは/usr/share/doc/opendkim/readme.opendkimにあります。
# domain emple.com
# セレクター2020
# keyfile /etc/dkimkeys/example.private
# Debianでは、OpendKimはユーザー「OpendKim」として実行されます。 007のumaskが必要です
# SocketにアクセスしていないMTAを備えたローカルソケットを使用していない
# ユーザー(たとえば、postfix)。ユーザー「Postfix」をグループに追加する必要がある場合があります
# その場合の「Opendkim」。
# MTA接続用ソケット(必須)。 MTAがChroot刑務所の中にある場合、
# ソケットにアクセスできるようにする必要があります。 Debianでは、Postfixが実行されます
# /var/spool/postfixのchroot、したがって、unixソケットは
# 以下の最後の行に示されているように構成されています。
# ソケットローカル:/run/opendkim/opendkim.sock
# Socket Inet:8891@localhost
# ソケットINET:8891
# 検証するのではなく署名するホスト、デフォルトは127.0.0.1です。を参照してください
# 詳細については、OpendKim(8)の操作セクション。
# 内部ホスト192.168.0.0/16、10.0.0.0/8、172.16.0.0/12
# トラストアンカーはDNSSECを有効にします。 Debianでは、Trust Anchorファイルが提供されます
# パッケージDNS-ROOT-DATAによって。
# 名前サーバー127.0.0.1
# アドレスからメッセージに署名するために使用されるキーまでのドメインをマップする
# メールに署名すべき内部ホストのセット
nano config/etc_default_opendkim

これらの行を追加します

# 注:これはレガシー構成ファイルです。 OpendKimで使用されていません
# SystemDサービス。対応する構成パラメーターを使用してください
# /etc/opendkim.conf代わりに。
# 
# 以前は、ここでデフォルト設定を編集してから実行します
# /lib/opendkim/opendkim.service.generate systemd override filesを生成します
# /etc/systemd/system/opendkim.service.d/override.conf and
# /etc/tmpfiles.d/opendkim.conf。これはまだ可能ですが、今です
# /etc/opendkim.confで設定を直接調整することをお勧めします。
# 
# daemon_opts = ""
# /var/spool/postfix/run/opendkimに変更して、unixソケットを使用します
# chrootのポストフィックス:
# rundir =/var/spool/postfix/run/opendkim
# 
# 代替ソケットを指定するための障害
# これを設定すると、opendkim.confのソケット値がオーバーライドされることに注意してください
# デフォルト:
# ポート54321のすべてのインターフェイスで聞く:
# Socket = INET:54321
# ポート12345のループバックで聞く:
# socket = inet:12345@localhost
# ポート12345で192.0.2.1で聞く:
# Socket = inet:12345@192.0.2.1

Postfixサーバーをセットアップする準備ができたら、適切なドメイン名が組み込まれて以下のコードを実行します。スクリプトを作成することから始めます

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

現在、テキストエディターのNanoで、このファイルを編集して、femmebabe.comの代わりにドメイン名を含めます。

# !/bin/bash
# ポストフィックスをセットアップします

次に、完了したスクリプトを実行して、Postfix、OpendKim、DoveCotを構成します。

./scripts/postfixsetup

このスクリプトが実行されたら、最後に印刷する行をコピーして、sendonly._domainkeyの値としてDNS構成に貼り付けます。これは、安全なメールを送信するときにドメインを識別するために使用されるOpendKimキーです。

素晴らしい!数日以内に、すべてが正しく構成されている場合、サーバーからメールを送信できるはずです。

メールサーバーのDNSを構成しただけで、レコードが更新されるまで72時間未満かかるはずです。通常、はるかに速いです。このコマンドを使用してサーバーが機能しているかどうかを確認でき、メールを提供しました。

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

すべてが正しく機能しているように見える場合は、サーバーで電子メールを送信できるはずです。動作していない場合は、ログを見て、エラーが何であるかを確認してください。

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

これにより、サーバーによって送信されているメールに関する冗長な情報と、適切に機能しているかどうかが提供されます。受信トレイに電子メールも表示できるはずです。そこにない場合は、スパムフォルダーを確認してください。

また、電子メールサーバーがDjangoアプリ、プロジェクトに通信できるように、設定で設定を設定する必要があります。これらの行を設定に追加または交換します

EMAIL_HOST_USER = 'team' # 「love@mamasheen.com」

パスワードを取得するために構成ファイルを使用していることに注意してください。ファイルの最初に、このファイルを設定にロードしましょう。

# 設定を開いてロードします

このファイルを作成して、秘密の鍵とメールのパスワードを追加しましょう。秘密の鍵を生成するには、最後に好きな長さでこのコマンドを使用してください。

openssl rand -base64 64

ここで、openSSL生成されて編集されたテキストをコピーして /etc/config.json

sudo nano /etc/config.json

OpenSSLが秘密の鍵として生成されるキーを使用して、次の行をファイルに追加します。

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

JSON形式はシンプルで使いやすいです。このようにしてプロジェクトで使用したい他のキーを宣言し、他のユーザーがそれらに書き込むことができないため、プロジェクトディレクトリだけから読み取ることができないようにプロジェクトディレクトリから分離しておくことができます。これは、APIキーに推奨される練習です。この練習では、ここではいくつか使用します。

また、プロジェクトをバックアップして、すべてが保存されていることを確認し、サーバーをレンタルしたくない場合でも、後で作業を回復できるようになります。

sudo backup

次に、コマンドラインから送信している場合は、WebサーバーからHTMLメールを送信してみてください。シェルでユーザーインスタンスをクエリし、Djangoを介してそのユーザーにHTMLメールを送信します。コードのCharlotteの名前をユーザー名に変更します。

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

最初のコマンドが機能しない場合は、必ず使用してください

source venv/bin/activate

すべてが正しくセットアップされている場合は、Webアプリから送信されたメールボックスに歓迎のメールを受け取るようになりました。よくやった!あなたは長い道のりを歩んできました。

このようなプロジェクトに取り組んでいる間にエラーに苦労している場合は、回答を検索して助けを求めることをheしないでください。 Googleは、他の検索エンジンの中でも、プログラミングヘルプを検索するための優れたリソースです。あなたが得ているエラーを単に検索するだけで、他の人が問題をどのように解決するかを見ることができます。また、私に連絡してください、あなたの教育者(教師、教授、家庭教師)、インターネット上のピアプログラミングヘルプに利用できるか、この本または他のリソースを再度参照して、あなたが経験している問題の解決策を見つけてください。これは簡単ではないことを理解していますが、これまで読んでいて、コードを書いていなくても、Webアプリをゼロから構築することについて多くのことを学んでいます。背中を軽くたたいてください、あなたは素晴らしい仕事をしています。

この第3版のWeb開発ガイドをお読みいただきありがとうございます。将来のエディションでは、ドキュメントの冒頭で説明した重要な例をもっと含め、ソフトウェアとハ​​ードウェア開発の世界をより深く掘り下げます。今後のことをお楽しみに、信じられないほどのソフトウェアを構築する方法を教えてくれることを楽しみにしています。次のエディションでお会いしましょう!






近い
ページ 1
ジャンプ
完全な記事を参照してください
読み続けます

による Daisy / ビュー | 買う | 暗号通貨で購入します



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

による Daisy / ビュー | 買う | 暗号通貨で購入します


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


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


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


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


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


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


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


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


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します


what's the best way to boil eggs?


here is a simple method to boil eggs:


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

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

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

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

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


.

による Daisy / ビュー | 買う | 暗号通貨で購入します


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


the most common side effects of birth control pills include:


1. Nausea

2. Breast tenderness

3. Headaches

4. Weight gain

5. Mood changes

6. Spotting or breakthrough bleeding

7. Changes in libido 

8. Acne 

9. Bloating 


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

.

による Daisy / ビュー | 買う | 暗号通貨で購入します


How do I host a web server from my home?


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


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


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


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


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


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します


How do I write a professional blog post?


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

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

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

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

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

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

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

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

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

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

による Daisy / ビュー | 買う | 暗号通貨で購入します



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


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


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


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


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


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


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


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


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


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


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


What are the benefits to having a security camera?


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します


why is it safer to wear a mask in public?


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


.

による Daisy / ビュー | 買う | 暗号通貨で購入します


is sugar really unhealthy?


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


.

による Daisy / ビュー | 買う | 暗号通貨で購入します


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


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


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


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


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


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


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


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


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します


How do I write a good book?


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


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


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


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します


What causes migraine and how are they treated?


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


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


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

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

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

4. Practicing relaxation techniques such as deep breathing or meditation

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

6. Getting regular exercise and maintaining a healthy diet


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


How do I build a mail server with postfix?


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


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


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


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


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


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


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


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

による Daisy / ビュー | 買う | 暗号通貨で購入します



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


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


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


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

.

による Daisy / ビュー | 買う | 暗号通貨で購入します


How do i wear deadlock?


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


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


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


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


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


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


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


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


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


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


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


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


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


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


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


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

による Daisy / ビュー | 買う | 暗号通貨で購入します


Why do people implant nfc implants in their hands?


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


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


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


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


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


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


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


買う

による Daisy / ビュー | 買う | 暗号通貨で購入します


How is the crypto market growing so quickly?


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


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


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


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


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


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


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


による Daisy / ビュー | 買う | 暗号通貨で購入します




https://glamgirlx.com -


(クリックまたはタップして画像をダウンロード)
プロのエンターテイメント、写真、ビデオ、オーディオ、ライブストリーミング、カジュアルなゲームプレイ、IDスキャン、Web開発、代理出産サービス。

このアドレスを使用して、ビットコインにヒントを残してください。 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

利用規約