實用的基於Web的深度學習和安全

經過 Daisy
實用的基於Web的深度學習和安全 第三版 夏洛特·哈珀 2024年7月3日 2025年6月3日更新/轉換
前言:
為網絡構建軟件的安全考慮因素是任何Web開發人員計劃和執行的重要組成部分,同時設計了可靠,穩定且用於實際目的的原型。 DOM(文檔對象標記)及其實施HTML,JavaScript和CSS以及實施Python,C/C ++,Java和Bash的後端軟件,為Web開發人員提供了自由和力量,以創造各種各樣的項目,這些項目表現出表現力,為使用和功能的均勻性和功能提供了既定性,並提供了既便宜''and Comece and Comece and Come and Come and Come ance exece,又可以享有良好的效果,並且既適合又有既定的,並且可以很好地使用,並且既適當又有範圍,並且既適當又有範圍,並且既適當又有範圍,並且既適當又有範圍,並且既適合又有既定的又有範圍。希望殺死時間或在互聯網上完成某件事,通常是在觸摸屏智能手機設備上。大多數人甚至都不知道想從頭開始構建網站時從哪裡開始,他們會在他人的網站上啟動,並在功能,可靠性,易用性,易用性,尤其是創造力方面構建某些東西,可以使用所有最新的功能強大工具,以便為其提供所有有用的有用的東西,以建立一些有用的東西,而不必浪費時間來浪費昂貴的訂閱來浪費貴重的用途,以便將其用於使用限制,並且可以使用限制,並且可以使用限制。如果您有幾分鐘的時間閱讀本書並了解我想教您的內容,甚至與我個人談論您的目標,並以正確的方向獲得一些指導,並有動力去學習編碼和編寫自己的軟件,將這本書帶回家,並預留一些時間來學習下一個有影響力的,強大的,功能強大的,功能強大,精簡和重要的網絡應用程序,在您身上和所有需要的網站,可以滿足您的需求,並滿足您的需求和您的需求。
關於我: 我是一名軟件開發人員,在C/C ++,Java,Python,HTML,CSS和JavaScript方面具有廣泛的經驗。我建立了人們想要使用,想要訪問的網站,甚至沉迷於僅僅學習,重新創造和殺死時間,最重要的是,我出售軟件。如果您有一個想法確切希望您希望網站的外觀和功能,那麼您願意支持我,以便我在滿足您的網站時可以滿足自己的需求,並且您願意自己承擔自己運行網站的成本,我會為您建立下一個YouTube,Tiktok,Twitter,Twitter,Google,甚至只能訪問高級技術安全應用程序。我沒有試圖為您出售我的時間,而是要購買您的時間:我想與您聯繫,以構建一個已經存在的信息,並教您成為獨立軟件開發人員所需的內容,以實現您想要的任何領域的成功職業。讓我清楚,我給您的教育將是非正式的。您可以上學並通過正規教育學習所有這些,甚至可以在學校閱讀這本書,完成任務,並從您的教育中獲得很多東西,但是我不會正式地將您放在熱地座位上,並要求您完成任務。我不是你的教授,你可以像一個朋友一樣想到我,他想指導您從自己的個人成功所驅動的職業。而且我也不會讓您成功,您將需要花時間購買它。學習編碼具有陡峭的學習曲線,而且從來都不是一件容易的事,甚至應該是。您需要盡可能地努力工作,並繼續嘗試失敗並重試,即使您感到沮喪,才能自己學習和構建應用程序。這是代碼本身的性質。代碼是由旨在給程序員錯誤消息的編譯器運行的,即使您只是將錯誤複製到搜索引擎並閱讀其他人的示例中,這些代碼也會教您如何編碼。而且我必須說,您不需要非常富有,聰明,成功,甚至是細節或有組織的來構建應用程序。計算機為您照顧該組織。您只需要在反複試驗和錯誤中堅持不懈,保持專注並努力工作,您將在整個工作中擁有非常成功的職業生涯。
我是誰: 我意識到,最後一部分更多是關於學習,而您從這本書中採取了一些方法。我到底是誰?這是一個複雜的問題。我本人還不清楚,因為我患有醫療狀況,這可能使我很難進行編碼或撰寫本書,同時在社交和身份問題上提出挑戰,這使我的生活在介紹自己時變得更加困難。簡而言之,如果您正在讀這本書,則將其帶回家是因為您翻閱了它並認為它很有用,或者即使您只是讀了這本書,我還是一個志趣相投的人,希望看到您在您所做的一切中都取得成功。我本人是工程師,軟件開發人員和學生,並且我正在為其他想要通過提供所需軟件的手冊來使自己的生活更輕鬆的學生寫這本書,這是通過給出示例來使生活更輕鬆的手冊,例如將諸如大型難題的示例複製到一個工作,有用的,大型,功能,功能,凝聚力,凝聚力和吸引人的應用程序中,這些應用程序無關緊要。在很大程度上,這就是我要做的:我構建應用程序來幫助自己和其他人取得成功。我也是作家,儘管這是我打算完成的第一個出版物,以便將我的投資組合放在有用的文檔中,而且我也是藝術家。 我會向你承認,我有點陌生的人。我並不完美,我已經與法律競選,甚至導致我離開大學,離開州,以便為自己取得更大的成功。我是一個女人,出生時,我穿化妝,給自己拍照,穿衣服和其他女裝衣服,並且我天生就會意識到自己是女性。過去,我與其他人遇到了問題,導致寫作和構建WebApps掙扎,很抱歉,我無法盡快將這本書掌握在您的手中:您需要這個。您將需要讀取和編寫看起來像我的,像我一樣工作的代碼,而且做同樣的事情,但甚至更好,因為如果您有能力購買這本書而不是像我為自己創建一本書要為此賺錢的那樣搗碎您的鍵盤,那麼您就擁有一生中需要成功的資源。我在家庭成長,健康狀況,醫生,媒體和法律方面都有各種各樣的問題,而我的守則深深地反映了在一個分裂和沮喪的世界中的女權主義和女性的鬥爭。但是,這本書是我深切關心的,我的孩子,我的投資組合和我的生計,因此,我感謝您在將文字帶回家並仔細地仔細回家以向我學習時的考慮。請記住,我並不完美,這本書將有錯誤,修訂和新版本,您需要盡力而為,以便在我的寫作上獲得成功的經驗。另外,請理解,即使您在寫作時面對挑戰,我也對您來說很好。這樣考慮這樣做:當您只能租用計算機系統來執行您可能想像的任何事情時,存儲遇到的所有信息,分析和組織它,並理解它時,您將不可避免地遇到困難,而您正在攝入甚至發布的信息。我告訴你這是因為我遇到同樣的困難。使用這本書以自己的風險使用,與您的社區和社區一起在安全的環境中構建軟件,並且在您失敗甚至以錯誤的方式取得成功時,請不要將事情帶到個人身上:這就是我的發展方式:為什麼我能為您帶來這個文本並為您帶來成功而不會在我的瘋狂之路上取得成功的方式,而在我的瘋狂之中,我會在我遇到的範圍內遇到的範圍,這是我在整體上遇到的範圍,因為我會遇到整體範圍,因為我會遇到整體的範圍,而全球範圍的範圍則是在全球上的範圍,這是我的範圍,這是一個全球範圍的範圍。 網際網路.您可能對我只有幾句話不是很熟悉的人,但是我鼓勵您繼續閱讀,當您在建立自己的項目以完成工作的同時繼續閱讀和理解我時,您會認識我。只要您的教授或老師什麼都沒有分配您,這本書就不會有作業,但是我強烈鼓勵您在閱讀時自己構建項目組合,以及一個蓋帽項目,展示瞭如何應用您所學的東西。我的Capstone項目是您將在本書中閱讀的大多數內容的基礎,因為它結合了我以前的項目,我創建和學會的代碼,學習並學會了手工寫的代碼,以及各種各樣的想法和技巧,這些想法和技巧可以幫助我成功,以至於我可以旋轉一個簡單的應用程序,該應用程序可以完整地使用,並且看起來像一個流行的應用程序,您可能會看到您的朋友或家人在互聯網上使用,或者在互聯網上使用,或者在互聯網上使用新聞,或者在您的互聯網上使用。
這本書是什麼: 這本書是一個例子。您可以在此處找到代碼,有關如何學習代碼,有關調試代碼的信息以及解決錯誤的說明,故障排除步驟,有關如何備份和保存代碼的說明,如果有人斷開代碼,保護您的代碼,部署代碼,構建您的交互式網站,構建娛樂性,吸引人的互動網站以及您的娛樂性,以及您的工作,以及您的工作,以及您如何,以及如何,您可以和您的意識,以及如何,您可以和您的融合,以及如何,以及如何,您會構成您的娛樂性,以及如何,您會構成您的意識,以及如何,您會扮演我的意識,以及如何,您會構成您的意識,以及如何,您會構成您的意識,以及如何,您會扮演的方式,以及如何,您會構成自己的意識,以及如何,您會構成自己的意識,以及如何,您可以和您構成的互動網站,以及如何,以及您如何構成自己的意識。您以絕對最佳的光線建造最終用戶,網站的訪問者最吸引人。在本書中,我將演示許多軟件設計示例,重點是網絡作為平台和安全性。我們將使用UNIX Shell建立一個基本項目來啟動學習體驗,並具有備份和腳本功能。然後,我們將檢查一個基本的博客網站,使用照片和視頻功能升級我們的博客,並使用這些功能使用免費軟件使用安全解決方案,並使用可插入的身份驗證模塊(PAM)使用安全服務器。然後,我們將查看文件處理和處理,探索視頻編輯,語音捐贈,條形碼掃描和光學角色識別等概念。在此過程中,我們將檢查API,這將幫助我們通過免費和付費選項使我們的軟件更有用和安全。在此過程中,我們將探索物理安全和武裝工具,例如槍支和彈藥設計和製造,包括槍管和中繼器設計,砲塔和無人機設計以及其他校長,我們將與我們在現有網絡上的軟件集成,以保護我們的軟件並展示自我防禦和自我辯護和誇張性。我們將在構建遊戲,2D和3D渲染引擎的過程中休息一下,並在基本維渲染軟件的研究示例中與嵌入式硬件一起工作,並分別以矽膠橡膠施放的電子振動按摩器。一路上,我們還將採用已經可用的機器學習解決方案,以更好地保護我們的軟件。我們還將採用可用於網絡的庫存工具,以簡化和保護該過程。這本書是您成功構建Web應用程序並將其與專業的計算機和嵌入式機械系統網絡集成的指南,總的來說是構建軟件和嵌入式硬件的指南,沒有背景知識或以前的經驗。
這本書不是什麼: 如果您真的想擁有一個網站,則可以設置一個簡單的商店並出售所需的內容,發布博客,發布照片或視頻,或者以其他方式無需編寫一行代碼。這本書不是那樣。這本書將教您如何構建比您已經找到的任何軟件更有用,功能完整,功能性和安全性的軟件,因為它部署了仍然是原型的最新軟件,在規模較老的公司運營中運營的最新軟件可能很昂貴,並且不吸引倒退,令人費解的是為了為那些沒有真正做任何事情的人賺錢而努力的公司。如果您密切關注本書,您將需要編寫代碼,研究代碼,構建自己的應用程序,並且您將從自己的工作中賺錢。即使在早期,我也會從這本書中賺錢,因為它包含人們需要閱讀的信息,並且在購買或使用我的應用程序時已經購買了。這本書不會為您構建一個應用程序,但是它將指向您的方向正確,並用所需的工具以及技能和技巧來武裝您在為網絡構建軟件方面成功的技能和技巧,在每一條代碼方面,您都需要寫作的每一行,準備將其拼湊成您以及您和支持者,支持者,客人,客戶,朋友,訪客,訪客,承包商,承包商,互聯網以及互聯網和互聯網和互聯網和互聯網和互聯網的使用。
您將學到什麼: 這本書將教您如何構建和銷售軟件,真正功能性,有用的軟件,媒體記錄,諸如面部識別,機器可讀區域條形碼掃描,Web API等安全功能,以對視頻和照片進行身份驗證,錄製和渲染視頻和照片,以及藍牙和附近Field(NFC)通信等交換消息。這本書將教您如何使用網絡計算機,重點關注Debian Linux,如何構建bash代碼以使安裝和備份軟件變得無縫,自動化的微風,如何構建Python代碼作為後端來提供動態信息,並通過boottrap進行諸如bootstrap的COSSS和網絡互動,啟用互動的媒體和其他互動的互動式媒體,並構建與其他互動的互動,並啟用了互動的媒體,並啟用了其他互動媒體,並將其與其他互動互動,並啟用其他互動互動,並與其他互動的媒體進行互動,並與其他互動的媒體進行互動,並與其他互動的媒體進行了交互,並與其他互動的媒體進行了交互,並與其他互動的媒體進行了交互式媒體,並且其他目的,ID掃描,圖像和視頻審核,數據微交易,以確保您的軟件安全,付款處理,加密貨幣交易,異步任務等。您將學習如何使用電池,充電器,微控制器,電路,電動機和傳感器來構建自己的藍牙設備,並使用焊料,電線和3D打印以及鑄件。我將演示適用於增材製造,工具和模具製造的3D設計主體,因此您能夠製造自己的嵌入式,具有集成電池,充電器,電子電路和功能輸出的嵌入式硬件設備。並將它們與藍牙和網絡聯繫。具體來說,我們將檢查兩個案例研究,一個振動的按摩器和一支由OpenSCAD編程的自製槍支,它們可作為圖形接口或命令行實用程序提供,並且可以集成到網絡中以較快。 您將學習如何在沒有以前的經驗的情況下從頭開始建立和部署網站,使其功能性,安全,美麗,有用且最重要的是實用。您將學習如何使用機器學習和計算機視覺使網站安全,更實用,從您的網站上錄製視頻和音頻,捐贈您的聲音,製作音樂並調節音頻以創建有用的示例,以及如何通過利用其他網站來構建可以直接鏈接到您的網站的最佳網站來打破噪音,以便您可以分享所有有用的有用信息,以分享您必須提供更重要的軟件,並使您提供更重要的業務和您的業務。這本書將最重視媒體,安全和機器學習,這是三個主要組成部分,可以通過與合適的用戶互動並以現實,實用,動手的方式啟用錯誤的用戶來幫助您為Web構建有用的軟件,同時自動且既有自動且堅固又堅固。 本書教Unix,特別是Debian(Ubuntu),Bash Shell,Python,HTML,CSS,JavaScript,以及用於Python的許多有用的軟件包,例如請求,以及GIT和FFMPEG(例如Git和ffmpeg)。我還將教您如何自動交易加密貨幣,並從加密貨幣或常規借記卡中付款,同時,如果您選擇這樣做,甚至還會向訪問者支付收入的份額。我將教您如何通過廣告從您的網站上賺錢,如何為搜索引擎準備好應用程序,並使其快速,在客戶中排名第一個排名,以找到您的客戶以找到您,並在盡可能多的常見搜索中排名。我將教您如何出售您的軟件,宣傳它,吸引尋找您服務的客戶,並通過已經存在的途徑在互聯網上為您自己的名字,價格便宜且運作良好。我將教您如何將數據保存在適合您的雲計算機上,並廉價地保存數據,如何計劃和構建一個網站,以執行用戶想要的內容和想要的內容,以及如何通過將您的網站放在網站上,將您的網站放在電腦上,並用通知,短信,短信,打電話,電話,將用戶帶到您的網站上,以將您的網站帶到您的網站上,將您的網站帶到您的點擊率上,只需單擊即可單擊您的單擊。這本書將重點介紹大量發布和分發媒體的實用性,從文本到照片再到視頻再到音頻,對最終用戶(您的客戶群)給人留下深刻印象,並以您所做的任何方式出售自己,以創建一個網站,一個應用程序,一個代表您的應用程序,並且只能代表您,並且使您,您的軟件和公司看起來都很好。您還將從我那裡學到一些技巧和技巧,從編碼技巧,諸如化妝和攝影,建模和表演等實用的虛榮心等,這對於使用所有可用的工具以最佳的方式來描繪自己和您的公司很重要,同時分發了盡可能多的內容,可以在平台上跨越無需更多的努力,而不是需要努力,或者是不需要的工作。 這本書叫做"實用Web Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution enhancement,圖像字幕和其他任務,例如來自圖像的預測指標,例如圖像的本質,作為計算機傳遞的圖像或光學副本(圖像的照片或打印的照片,都非常重要可以使您的計算機(通常要求您使用用戶名和密碼)製作服務器計算機,並為每個新的登錄或新IP地址提供確認令牌,但是,如果您構建大規模的,易於使用,從根本上使用,功能強大的軟件,這可能與其他人的軟件相關聯(您都可以使用您的軟件,或者您可以使用任何網站,否則您就可以使用任何網站。 任何構建無可挑剔的安全軟件的人都對這意味著什麼有所了解。軟件本質上是不安全的,因為我們用來訪問它的設備和帳戶並不總是可供使用,它們可能掌握在對軟件不適的人手中,因此可能會對軟件本身構成風險。這是本書的重點。默認情況下,網絡計算機使用長密鑰令牌,稱為和ssh或Secur shell鍵,否則最好使用Web服務器保護,因為Web服務器提供了開放式訪問以及在服務器本身上運行的最先進的安全工具。 Web服務器可以訪問用戶的Web瀏覽器,這可以說是用戶設備中最強大的部分,因為它是用戶可以訪問網絡軟件的地方。這個工具包可以渲染文本,您看到的網頁,還可以錄製圖像,音頻和視頻(例如面部或狀態ID的照片),可以讀取並寫入到藍牙無線電設備上,並可以讀取並寫入附近的電視帶標籤,廉價的鑰匙卡,FOB,FOB,貼紙,貼紙,貼紙,響聲以及與唯一的網絡驗證的網站和書面驗證的網站和書面驗證以及數據生成和寫入數據和書面上,並將其讀取。使用所有可以使用的工具,在這本書中,您將配備自己的知識來建立一個安全的網站,總的來說是一個安全的網絡計算機系統,適合您,進行競標,外觀和感覺
從哪裡開始: 歡迎您跳過我從本書或任何部分開始的部分,轉到所需的確切代碼,尤其是如果您在本書中要詳細描述的上述工具或任何上述工具經驗,以及記錄用例及其實際示例。如果您沒有編寫代碼的經驗,我強烈建議您閱讀所有本書,尤其是建議您閱讀以前的部分,以確保本書適合您。如果這本書不適合您,請考慮將其贈送給可能有興趣自己學習Web開發的朋友或親戚,甚至考慮借用它並從他們那裡學習,以填補我作為老師或其他老師在我之前做過的我使您失敗的空白。從您開始的位置開始,如果您打算構建有用的應用程序,本書的每個部分都將很有用,並考慮最終用戶構建最佳應用程序:了解您的客戶。現在您知道了我,您知道這本書,您已經準備好開始了。首先,抓住一台計算機(即使是盒裝商店,亞馬遜或舊桌面的最便宜的筆記本電腦,並以適合您的方式進行設置。
如何讀這本書: 文本突出顯示,表示文本屬於命令提示符,您將在其中編寫運行的代碼。命令提示符非常注重鍵盤,幾乎不需要單擊,加快了您的工作流程並使您更容易。
入門: 讓我們潛入。我們將首先在本地機器上構建代碼,然後在不建立連接到Internet的網站的情況下開始。從一開始就更安全,不花錢,對您來說很容易。根據您的操作系統,進入bash殼會有所不同。對於Mac OS,我建議此時安裝虛擬機,因為您將獲得與虛擬機的最大兼容性。諸如VirtualBox和ParaLells之類的各種提供商可以為您運行虛擬機,儘管如果您更喜歡使用建議使用的本機環境來創建快速,簡化的體驗,則也可以直接在計算機上安裝Ubuntu。如果您使用的是Linux或Windows,我建議您很容易創建一個項目。打開終端,調整合適的尺寸,然後開始遵循步驟2。如果您使用的是Windows,請遵循步驟1。
步驟1: - 僅Windows用戶 在Windows中,打開命令提示符作為管理員和鍵入 WSL –INSTALL
步驟2: - 繼續此處,或跳過步驟1,如果您不使用Windows 在開放終端(取決於您的OS,Windows中的Ubuntu,Mac或Linux中的終端或類似名稱),首先創建一個項目。我們使用MKDIR命令來創建目錄。如果您需要創建一個目錄來存儲您的項目(建議使用的項目,請使用CD命令更改為目錄,並且
CD/PATH/TO/DIRECTORY-路徑是您的目標目錄之前的文件夾(文件),默認路徑為〜或/home/home/用戶名(其中用戶名是您的用戶名)。要更改為默認目錄,鍵入CD或CD〜 mkdir示例 - 用目錄的名稱替換"示例"
現在,您有一個項目目錄。如果您需要切換到其他計算機或部署您編寫的代碼,則保存此目錄非常重要,因此我們將在接下來的幾個步驟中構建一個腳本來備份您的目錄。但是,構建腳本需要一些代碼,並且需要自動化代碼以盡可能有用。因此,讓我們構建一個腳本以構建腳本。讓我們從創建腳本並使其可執行。我們將使用sudo,chmod並為此觸摸,並將腳本稱為" Ascript"。
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
現在,我們創建了腳本,使其可執行,並準備對其進行編輯。 Nano是一種文本編輯器,可以讓您無需單擊即可編輯文本,這比使用圖形用戶界面要容易得多。要使用Nano編輯文件,請使用Nano,然後使用該文件的路徑。要製作一個製作腳本的腳本,它與首先製作腳本相似。我們將使用與上述相同的代碼,用參數參數替換腳本的" 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表示我們保存文件,然後點擊返回。現在,我們將能夠鍵入SUDO ASCRIPTION再次編輯腳本,而不是鍵入這三個命令來編輯腳本。這有效!並且任何新腳本都可以通過在外殼中調用。讓我們立即保存工作:讓我們編寫一個備份腳本以保存我們的新腳本,然後在項目目錄中備份它,同時還備份備份腳本。
sudo ascript backup
現在,在納米:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
where/path/to/directory是您使用MKDIR創建的項目的路徑。稍後,我們將學習如何使用循環和列表複製這樣的重複路徑,這是較少的代碼,但現在讓我們保持簡單並有幾行。要運行此腳本並備份您的代碼,請使用控制+x,y和返回將文件保存在nano中
backup
如果您在閱讀本書並在外殼中遵循的過程中完全提示您輸入密碼,請正確輸入您的用戶密碼,您將進行三次嘗試,然後再重新運行該命令。如果需要兩次運行任何內容,則可以使用上下箭頭來重新運行命令並編輯它們。在用右,左箭頭和刪除鍵以及鍵盤上編輯命令之前,簡單地按中間和向上選擇一個命令,然後使用返回運行它。
恭喜!您設法創建了一個很棒的備份腳本,該腳本可以備份工作目錄中的兩個重要的外殼腳本。隨著項目越來越大,我們可能會稍後將事情移動,但現在可以使用。讓我們繼續在雲中備份,我們將使用GitHub為此(儘管還有許多其他git解決方案用於備份,但它們都是相同的。)Git是一個Verision Control軟件,可以使您在將它們備份到服務器上時將其備份到服務器上,同時還可以使您可以在密碼或密鑰後下載整個軟件的整個副本。它有助於保存您的軟件,尤其是當我們遷移到有時會在一行代碼失敗時破裂的有時會破裂的安全性,如果您沒有機會自動備份代碼,則可能無法備份,而我們將不會自動備份它,我們將介紹它們。
如果您目前尚未使用Ubuntu虛擬機,我此時建議使用Ubuntu Virtual Machine使用Ubuntu Virtual Machine,因為在安裝所有必要的軟件包時,它將使您的生活更輕鬆,以構建工作網站並在計算機上進行深度深度學習操作。我們將在不久的將來將代碼移至Web服務器,但是我們要確保我們的Web服務器後面至少有幾層安全性可以抵抗網絡釣魚,並採用許多Linux軟件包來做到這一點。如果您仍然想使用Mac OS,歡迎您在線搜索並安裝必要的軟件包,但是本書或系列的每個軟件包可能沒有其他選擇。
讓我們添加一些命令,通過運行命令sudo ascript備份來使用備份腳本進行工作。
# …
再次控制X要保存。
現在,我們需要為該項目進行一次一次配置。因為它很快將是一個git項目,所以我們不需要每次從git存儲庫中部署時鍵入每個命令,但是當我們編寫部署腳本時,我們會掌握此命令。首先,讓我們確保我們處於正確的目錄中,並初始化GIT存儲庫並生成SSH鍵。
cd /path/to/directory
git init
git branch -m master
ssh-keygen
鍵入SSH-Keygen之後,應將新鍵保存在一個名為.ssh的文件夾下的主文件夾中。它稱為id_rsa.pub。讓我們找到此鍵並複制它。看到它,
cd ~
cat .ssh/id_rsa.pub
在將git提供商(理想情況下是github)與您的git提供商(理想情況下)創建一個帳戶,在將SSH鍵添加到您的帳戶中。擁有帳戶後,請單擊右上角菜單,然後輸入設置,然後在菜單中訪問的ssh和gpg鍵中添加SSH鍵。選擇添加一個SSH鍵,然後通過將其粘貼並給它添加標題,然後保存並返回Github創建新的存儲庫。對於其他GIT提供商來說,這是類似的,您需要閱讀其文檔。在新的存儲庫配置中,為您的存儲庫提供一個描述性名稱,並決定是否要發布它,並確保配置尚未包含的文件。創建存儲庫後,用SSH URL複製克隆,然後將其粘貼到以下命令中。
git remote add git://… (your remote URL)
現在,您可以使用CD回到存儲庫,您將熟悉此。立即嘗試使用備份的備份腳本
偉大的!現在我們真的可以進行編碼。現在,讓我們安裝Django,因為我們對bash和git有很好的掌握。 Django將讓我們自動備份我們的軟件,Bash也可以做到這一點,但是Django應該具有更簡單的實現(可以更輕鬆地禁用和配置)。
要在Ubuntu中安裝軟件,我們將使用sudo apt-get命令。首先,讓我們更新和升級我們已經擁有的軟件。這可以通過sudo apt-get update和sudo apt-get升級-y來完成。接下來,讓我們安裝python和我們的虛擬環境,即代碼的故鄉,並使用以下命令:sudo apt-get install python-is python3 python3-venv
就ubuntu實例中的軟件安裝而言,這就是您需要使用Django的全部。對於Windows和Linux,這應該非常簡單,但是對於MAC,您可能需要使用免費或付費的虛擬環境(例如VirtualBox或Paralells桌面)在其上安裝虛擬機和Linux,並重新創建上述步驟以設置Ubuntu環境。在這種情況下,Ubuntu至關重要,因為它是網站運行的軟件,它使他們能夠託管所有上述軟件的網站。
讓我們挖掘django。
在我們的目錄中再次使用CD:
python -m venv venv # 創建存儲代碼的虛擬環境
source venv/bin/activate # 激活虛擬環境
django-admin startproject mysite . # 我在當前目錄中開始的項目是我所在的項目。
Django剛剛開始啟動,因為Django託管了Web服務器,並且正在竭盡所能,以獲取基本的本地網站啟動和運行。現在,我們已經安裝了Django,讓我們對設置進行一些編輯以使其正常工作。首先,讓我們創建一個新應用
python manage.py startapp feed
您會注意到第一個應用程序稱為feed。無論您喜歡什麼,都應稱呼該應用程序,我們將創建新應用,但是每次在代碼中引用該應用程序時,每個應用程序的名稱都必須保持一致。要添加一個新應用程序,我們將始終在該應用程序創建的其他目錄中編輯settings.py。使用Nano,
nano app/settings.py
在設置中,查找已安裝的_apps,然後將[]分為3行。在空中心線上使用四個空間,添加" feed"或應用程序的名稱。設置的這一部分應該看起來像:
INSTALLED_APPS = [
'feed',
]
在忘記之前,讓我們測試Django正在工作。使用命令python manage.py runserver 0.0.0.0:8000,我們可以運行服務器,然後在計算機上的網絡瀏覽器中導航,將代碼運行到http:// localhost:8000,並查看示例WebPage(它工作!)使用控制C,與其他任何命令相同。
現在,讓我們挖掘寫一些Python代碼。 Django具有三個主要組件,所有這些組件都完全由代碼運行。組件稱為模型,視圖和模板,在將網頁交付給用戶之前,每個組件分別在較高和較低的級別上。
該模型是將信息存儲在數據庫中以進行檢索,分類和渲染的代碼。
該視圖決定瞭如何渲染,操縱和修改模型,幾乎每個視圖都將直接使用模型。
模板是HTML代碼,帶有一些額外的鈴鐺和哨聲,稱為模板語言。該模板是通過從視圖中填充Python代碼和上下文(例如模型和信息)的視圖來渲染的。
Django也有其他組件,包括但不限於:
設置,該設置如我們討論時配置該應用程序。
URL,是用戶遵循的模式,以訪問Web應用程序的特定部分。
表單,該表格定義瞭如何處理髮送到服務器的信息並將其渲染到數據庫以及用戶。這些是在服務器端處理信息的基礎,並且可以接受計算機存儲的任何類型的信息,最著名的是文本字符串,數字和True/false Booleans(通常是複選框)。
模板是HTML代碼和模板語言,並彌合了Python和HTML之間的差距,這意味著Python信息可以用作HTML代碼,任何人都可以訪問並可以使用有限的訪問網站,同時使Python代碼可訪問,同時使Web可訪問python代碼,並且可用於在遠程設備上可用於在遠程設備上,而無需在服務器附近不需要。
靜態文件,通常是JavaScript,是服務器服務並與模板鏈接的庫。
服務器服務或外部託管的媒體文件,或者只是在處理並發佈到服務器之前寫入服務器並將其發佈到另一台服務器(一個存儲桶)託管。
中間件是與每個視圖同時運行的代碼,並被視為"包含"。
上下文處理器,處理每個視圖的上下文,並用於添加額外的上下文。
測試,驗證用戶或請求在呈現視圖之前通過某些要求。
消費者,決定了網絡插款如何處理和響應溝通。
admin,用於註冊模型,以便可以在Django管理頁面中詳細操縱它們,可以通過圖形接口對數據庫進行管理。
定義異步任務的芹菜可以開始運行,然後立即繼續執行下一個任務或代碼行。
Django可以擁有許多其他組件,我們將在此處詳細討論。有很多方法可以使Django更具功能性,並添加Websocket,這些Websocket是快速,簡化的通信渠道,芹菜(芹菜)執行異步任務,以及許多其他用於擴展Django的軟件,尤其是在視圖功能中,尤其是在大多數代碼中執行大多數代碼。查看功能是關鍵的,因為它們通常會聲明特定於特定URL模式或服務器部分的每個代碼。
首先,讓我們探索視圖功能。視圖函數以表示將在視圖中使用的代碼的導入開始,並使用常規功能定義或類定義。最簡單的視圖由函數定義DEF定義,並使用基本模板返回httpresponse。首先,讓我們定義一個基本視圖,以返回文本" Hello World"。請記住,每次您在語句之後添加代碼,例如,如果,何時,等等,您將需要為要應用於函數的每個先前定義添加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
現在,讓我們定義視圖模式。視圖模式具有三個組件,即路徑組件,該組件告訴服務器在服務器內的視圖所在(用戶輸入到導航欄中輸入網頁的URL路徑),即指定視圖的視圖組件,以及視圖的友好名稱,以便在使用模板上更改和更新的命名,以便更改和更新的命名,以便更改和更新。以這種方式做事並保持靈活是有意義的,因為您的代碼庫將是一個不斷變化的環境,需要靈活性和即興創作才能有價值且易於使用。這是您的視圖,您可以將其添加到urlpatterns = [app/urls.py的部分。視圖模式由上述三個組件定義,並稱為路徑。您的URL模式是列表,因此請確保始終用逗號結束每個項目,因為這將每個項目分開。每個項目也應在新線路上再次使用四個空間,就像settings.py中的應用一樣。我們將使用空字符串函數定義視圖的第一個組件,以創建在Web服務器的根目錄上運行的視圖。您的urls.py現在應該看起來像這樣:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
這是與Django創建完全靜態的網站的基礎。為了製作一個更具動態的網站,我們可以開始緩存信息,例如圖像,視頻,音頻等,我們將需要使用模型,我們將接下來探索。現在,讓我們檢查我們的代碼並運行服務器。要檢查代碼是否錯誤,請運行:
python manage.py check
如果有任何錯誤消息,您應該仔細查看對應用程序所做的更改,並查看是否需要修復任何內容,例如外部或缺乏空間,額外的字符,未閉合的字符串,任何錯字,任何意外刪除的字符或其他任何內容。讀取錯誤消息(如果您有),則應該能夠查看您創建或編輯的文件編號的路徑,因此請查看該文件和行,看看是否可以修復那裡的任何內容。如果已解決問題,請再次運行上述命令。當您的軟件準備運行並正在運行時,您會看到輸出"系統檢查無問題"。現在你準備好了。使用以下方式運行服務器
python manage.py runserver 0.0.0.0:8000
現在打開一個Web瀏覽器,並導航到http:// localhost:8000。您應該在視圖中看到httpresponse函數的括號和引號中返回的文本。這只是一個基本示例,但是如果您做到這一點,您就會了解Linux,Bash,Python和Django工作的基礎知識。讓我們深入研究一些數據庫建模,並探索Python類在存儲信息中的功能。然後,在使用JavaScript和機器學習使我們的網站充分,靈活和安全之前,我們將開始對HTML和CSS掌握。
課程存儲在您的應用程序的模型中。使用Nano,編輯App/models.py並添加新類。類定義一個類定義的類,並通過它繼承的超類,在這種情況下,在這種情況下,模型model.model。類的名稱是在類定義之後的,並且在類定義A:(colon)之後,在下面表示與類綁定的屬性和函數定義之前。我們的課程需要一個可以用來檢索並保持獨特的ID,它還需要一個文本字段來存儲一些信息。稍後,我們可以添加時間戳,文件,布爾值(可以幫助我們的代碼來決定如何使用模型,並可以將其用於對其進行排序的情況),該實例將模型與用戶登錄服務器的用戶等等。讓我們解開以下代碼:
from django.db import models # 用於定義我們的班級的導入及其屬性
class Post(models.Model): # 我們班級本身的定義
id = models.AutoField(primary_key=True) # 我們的模型的ID是一種自動生成的密鑰,它將讓我們查詢模型,保持獨特之處並在創建模型後需要與模型進行交互時很有用。
text = models.TextField(default='') # 在這種情況下,我們的類存儲的屬性是一些文本,將默認為空字符串。
關閉並保存文件,就像我們之前完成的。
隨著應用程序的發展,我們將探索許多其他字段和選項,但這是創建應用程序發布文本的基本必需品。但是,該模型不會單獨工作。如前所述,我們將需要一個自定義視圖和自定義URL模式來使該模型起作用,並且我們還需要一個與模板一起進行的表單。讓我們先探索表格。
要定義表單,請使用納米編輯應用程序/表單。 py並添加以下行。我們將需要兩個導入,我們的表單類別以及我們創建的模型(feed.models.post),類似於模型的類定義,以及一個字段以及一個稱為meta的子類,該類別將定義與表單相互作用的模型。該表單還可以具有初始化功能,該功能會根據請求,模型或其他方式中的信息來設置它,我們將稍後探討。
模型表格之所以有用,是因為它們可以創建模型或編輯模型,因此我們將它們都用於兩者。讓我們以形式定義一個。
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並添加以下代碼,如上所述。您無需在#符號之後添加任何內容,該代碼是用來表示有關代碼信息的註釋。我們將首先將我們的模型導入視圖中,然後將其添加到可以在模板中渲染為顯示列表的上下文中。接下來,我們將添加一個模板,可以在其中使用按鈕渲染表單和模型,以根據模型創建新對象並將其發佈到服務器上。這聽起來很複雜,所以讓我們逐步邁出一步。在完成視圖之前,讓我們創建一個模板,該模板只能呈現模型,並確保我們可以通過在外殼中創建新帖子來看到它。這是該視圖的外觀:
posts = Post.objects.all() # 查詢到目前為止數據庫中的所有帖子
這一切看起來都很簡單,直到我們到達底部。渲染,函數返回的值,而不是像上一個示例一樣在http響應中,始終將請求作為其第一個輸入,接受上下文(在這種情況下,在數據庫中的帖子)現在可以在模板中呈現,並返回函數中定義的模板。該模板將是帶有一些名為jinja2的語言的HTML文檔,該語言將Python信息傳達到HTML中。
要開始創建模板,請在feed中製作兩個目錄。
mkdir feed/templates
mkdir feed/templates/feed
接下來,在上面的目錄中編輯模板,feed/feed/feptrates/feed,並為此示例添加代碼。讓我們查看此示例的模板。
這是一個非常簡單的模板。它定義了打開和關閉的HTML標籤,一個文檔類型標籤,一個帶有傳奇標題的車身標籤,一個斷路標籤,屏幕上添加了一條小線路,而循環則將帖子中的每個帖子呈現為模板中的段落。這是渲染帖子所需的全部,但是數據庫中還沒有。讓我們用外殼創建一些。我們可以用manage.py運行外殼
python manage.py shell
現在,讓我們導入我們的帖子模型
from feed.models import Post
接下來,我們將創建一個帶有字符串的簡單帖子並退出外殼。字符串可以是任何事物,只要有效文本即可。
Post.objects.create(text='hello world')
exit()
最後,我們需要在我們的供稿中添加URL模式。因為我們的feed應用程序將使用多個URL,並且我們希望將文件尺寸保持在較小的情況下,所以讓我們在供稿應用中創建一個局部urls.py,看起來像這樣:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
我們還需要在基本應用程序中編輯URLS.PY,無論我們決定稱呼它,這都是我們創建的第一個目錄。編輯app/app.py並將以下內容添加到URL模式
from django.urls import include # 在頂部
# ...以前的代碼在這裡
現在,當我們使用Python Manage.py Runserver運行服務器時,我們將看到我們創建的頁面,因為我們具有模型,視圖和模板以及URL模式以及數據庫中的項目。接下來,讓我們實現我們創建的表格並開始創建自己的帖子。但是,在我們編寫太多代碼之前,讓我們使用之前寫過的腳本進行備份。在外殼中運行此腳本,等待片刻,所有代碼都將備份到我們的git存儲庫中。
backup
實施表單相對簡單。我們將導入我們的表單,將郵政請求處理程序添加到視圖中,並將帖子保存在數據庫中,然後再將其重定向到同一視圖。我們可以使用我們已經導入的重定向函數,以及另一個稱為"反向"的函數以獲取視圖模式的URL。我們將使用字符串" feed:feed"來查詢此問題,因為隨附模式的名稱空間是feed,並且該視圖也稱為feed。
posts = Post.objects.all() # 查詢到目前為止數據庫中的所有帖子
if request.method == 'POST': # 處理郵政請求
form = PostForm(request.POST) # 創建表單的實例並將數據保存到其中
if form.is_valid(): # 驗證表格
form.save() # 保存新對象
return redirect(reverse('feed:feed')) # 通過get請求重定向到同一URL
'form': PostForm(), # 確保將表格傳遞到上下文中,以便我們進行渲染。
現在,我們需要更新模板以說明新表單。我們可以使用
讓我們分解一下。有一個新的表單類,一個令牌,表單本身和提交按鈕。很簡單,但是當我們看一下它時,我們可能希望使它看起來更好。它有效,我們可以發表新的帖子,現在將它們保存在數據庫中。這裡有一些事情發生。我們使用HTML標籤來聲明該文檔是HTML文檔,我們使用模板標籤({%…%})渲染表單的令牌,而另一個{{…}}渲染表單。我們也有一個循環使用塊標籤和模板標籤渲染文本。塊標籤確實很重要,因為我們可以定義模板的部分與它們呈現,模板標籤是我們將變量放入代碼中的基礎。
現在,我們需要使我們的應用看起來更好,因為現在它看起來確實很基本。我們可以使用與文檔中每個對象綁定的CSS或在與每個對象相關的類中進行此操作。 CSS真的很不錯,因為它告訴頁面上的所有內容都應該看起來,並且可以使其看起來非常好。有一些圖書館可以做到這一點,但是我個人去的是Bootstrap。
Bootstrap可以從他們的網站下載getbootstrap.com/。到達那里後,按按鈕讀取安裝文檔,然後從Include Via CDN部分複制代碼。您將在HTML文檔頂部的標籤中需要此代碼。另外,讓我們繼續創建一個基本模板,這樣我們就不需要在每個模板中重新創建這些鏈接。
用MKDIR模板製作一個稱為模板的新目錄,然後編輯模板/base.html。
看起來應該這樣:
確保複製CSS和JavaScript,.css和.js文件,因為我們將需要JavaScript使我們的網站在將來更具功能性。
現在,讓我們返回Bash Shell並運行快速命令。請記住,如果您需要訪問虛擬環境,請鍵入源VENV/bin/Activate。這將使您可以在本地安裝Python軟件包,以使Django訪問它們。為了給出由Django Bootstrap類生成的表格,我們將使用稱為Crispy Forms的Python軟件包。我們可以使用以下命令下載此
pip install django-crispy-forms
安裝此任務後,將其添加到settings.py.py
# …以前的代碼在這裡
現在,回到我們的飼料模板中,我們可以刪除一些東西。讓我們刪除文檔的開始和結尾,並使用擴展和塊定義將基礎模板的繼承替換為基礎模板的繼承。另外,我們將在表單中添加帶有負載和模板過濾器的模板過濾器導入。最後,讓我們在表單上的按鈕中添加一個bootstrap類,以使其看起來更像一個按鈕。看起來應該這樣:
美麗的!這已經有很多代碼了。接下來,我們應該對其進行測試,並確保我們可以看到一切看起來都不錯,並且請確保一切正常。根據以前的說明運行服務器,並確保網站外觀和工作正常。好!您已經準備好進入下一步,我們將使用類似的URL,表單,視圖和模板添加用戶登錄功能。基本模板很重要,我們將繼續對其進行修改並根據需要進行更改,但是現在讓我們專注於使我們的網站更安全,通過使用戶能夠使用用戶名和密碼登錄,最終更重要的信息,這些信息最終將幫助您的應用程序安全,並且您自己的帳戶只能由您訪問。
為此,我們需要使用內置在Django中的用戶模型。用戶模型是像我們的帖子一樣的數據庫模型,可以將用戶登錄到網站中。將來,在我們將站點部署到Internet之前,我們將使用歸因於其的其他模型擴展此模型,並為登錄的其他安全措施構建對網絡釣魚具有抵抗力的安全措施。我們將首先使用Django提供的一些內置登錄表單。首先,讓我們創建一個新應用程序,我們將使用該應用程序來渲染基本登錄頁面的模板和視圖。我們還將創建其他應用程序來代表持續的登錄挑戰以確保應用程序的確保,包括平碼,面部識別,近場通信,外部設備,多因素身份驗證和指紋識別。
我們已經談論過啟動一個應用程序。從我們的目錄中,在虛擬環境中,通過管理。
python manage.py startapp users
現在,我們應該擁有一個新應用程序的目錄。讓我們首先在該目錄中創建與用戶登錄相對應的視圖。 Django內置了用戶登錄的視圖,但是這些不適合我們,因為我們需要自定義視圖,這最好使用一個定義完成。
在此視圖中,我們將首先檢查發布請求,將請求傳遞到從django導入的登錄名,對用戶帳戶進行身份驗證,然後登錄用戶,然後再將其重定向到我們的feed應用程序。
在用戶/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
現在,在模板中,
這是登錄模板的基礎知識。它實際上就像結構上的另一個模板一樣,但是在渲染時看起來有些不同。我們可以復制此代碼以構建另一個非常相似的模板,稱為regisher.html,我們將更改措辭並使用我們構建的新表單。讓我們先製作模板。編輯用戶/模板/users/register.html並添加以下代碼:
現在,讓我們為用戶註冊構建表單,然後在使用模型升級用戶登錄之前回到視圖中。我們將從一開始就將此表格基本化,但將來納入了更多詳細信息和安全功能,例如協議和CAPTCHA。使用nano用戶/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']
因此,我們在這裡有另一種形式,它起作用的很簡單。這是帶有用戶名,電子郵件和密碼以及確認密碼字段的用戶寄存器表單。請注意,此表單不會擴展常規表格。 form類,它是模型表單,這意味著它具有元。一個字段的定義相同,類元標准定義了該表單對應於將寫入表單的其餘信息對應的模型。其中大部分已經存在於Django內置的UserCreationform中,因此我們將其用作類的基礎(通過括號中)。
接下來,我們將檢查註冊用戶的視圖,因為我們有一個表單和模板。這是一個模態,就像新帖子視圖中的一個一樣。編輯用戶/views.py並添加以下代碼:
# …進口
這就是我們需要註冊用戶的全部,但是我們應該擁有更多信息。我們想知道用戶註冊的時間,網站上的最後時間,有關它們的一些信息,例如傳記,時區等。另外,我們將需要更新我們的提要模型,發布,以說明用戶模型並將帖子屬於每個用戶。為了做到這一點,我們將在兩個應用程序中更新Models.py。讓我們從編輯供稿模型開始。現在應該看起來像這樣:
from django.db import models # …進口
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # 加入此行
請注意添加到文件中的第二行。這是一個外鍵,將每個帖子歸因於每個帖子的單個用戶,因此我們可以確保我們以每個用戶的使用者為基礎保存帖子,並且在不歸因於用戶的情況下無法進行帖子。我們使用其代表的類定義此外鍵,刪除參數,以確保帖子被用戶,空和空白參數刪除,以確保我們可以在必要時刪除用戶,並適應我們已經創建的帖子上的用戶缺乏用戶,以及一個相關名稱,我們可以使用這些名稱來引用用戶創建的帖子。與Post.author的作者作者,此相關名稱為我們發布了帖子本身的用戶。現在,我們可以將帖子通過運行user.posts.all()或furs.posts.all()製作的用戶。
現在,讓我們的登錄名更具彈性。我們已經可以通過簡單地限制允許登錄到網站的次數來使我們的網站易受網絡釣魚的影響,這很容易。在我們繼續開發應用程序時,我們還開始在每個用戶之前開始存儲一些有關每個用戶的信息。編輯用戶/models.py,添加以下代碼。
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
account_created = models.DateTimeField(default=timezone.now)
last_seen = models.DateTimeField(default=timezone.now)
can_login = models.DateTimeField(default=timezone.now)
preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
bio = models.TextField(blank=True, default='')
請注意,此模型與郵政模型相似。我們還有一個額外的導入時間,這將使我們能夠在DateTime字段上設置默認值,並且我們還具有像帖子一樣的角色feffield和Textfield。使用所有這些時間戳有助於我們保護網站並了解其使用,並且文本字段使我們在網站上渲染有關每個用戶或作者的信息。 OneToOneField應該是唯一的次要考慮因素,其行為與Foreginkey完全相同,但每個後續模型只有一個。這樣,用戶只有一個配置文件,而他們可能有很多帖子。
現在,讓我們改進登錄名並註冊視圖以說明配置文件。首先,編輯用戶/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使用分鐘,小時,每月,月,一周的一天, *或一個數字代表何時運行命令。使用0分鐘, *在其餘選項中 *,我們可以在分鐘開始時每小時的第一分鐘運行一個命令。這使我們可以自動備份代碼。用sudo執行的所有作業作為root運行時,我們無需每小時輸入密碼。
為了使無需使用密碼備份代碼變得更容易,讓我們禁用備份命令的密碼。我們將通過執行以下命令並輸入密碼來做到這一點:
sudo visudo
現在,讓我們滾動到文件的底部並添加另一行:
ALL ALL=NOPASSWD: /bin/backup
這使我們可以在沒有密碼的情況下運行命令"備份"作為任何用戶。該格式很容易,只需將行的前綴" all = nopasswd:/bin/"和命令結尾,例如/usr/bin/bin/。
現在,讓我們開始使用電子郵件。電子郵件對於網站確實很重要,因為這是一種使網站更安全,驗證用戶是真實的人,甚至向客戶推銷產品或服務的方法。許多經常互聯網的人每天檢查他們的電子郵件,並收到有關他們感興趣的產品和服務的各種營銷電子郵件。在啟用Django網站上啟用電子郵件時,有一些選擇,歡迎您選擇最適合您的電子郵件。
首先,您可以購買電子郵件服務,該電子郵件將使您可以從域中發送電子郵件並需要最少的代碼。有許多服務提供此服務,例如Google Workspace,Sendinblue,Mailgun等。
否則,您將無法從頭開始在服務器中構建自己的電子郵件服務。我建議使用此選項,即使它是更多的代碼,可能需要特殊的託管。您將無法從家用計算機啟動郵件服務器,因此,讓我們繼續檢查配置和代碼以在我們在雲中啟動服務器並在其中創建自己的郵件服務器之前,請發送電子郵件。
首先,使用以下命令編輯設置。 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設置了一個使用config的JSON文件,如下所示。
編輯文件:
sudo nano /etc/config.json
添加以下行:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
我們將繼續編輯配置文件,並添加將在應用程序中使用的所有密碼和密鑰。現在,讓我們快速研究如何使用Python發送電子郵件。首先,讓我們為驗證電子郵件創建模板,可以發送給用戶,然後將其放入用戶模板目錄中。該模板將用HTML編寫。
nano users/templates/users/verification_email.html
這封電子郵件很簡單。它採用用戶的上下文,網站的基本URL以及用於驗證用戶電子郵件的用戶ID和令牌。在編寫一些Python代碼以渲染模板之前,請確保在設置中定義基本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)
這很簡單。我們導入發送電子郵件,使用模板和我們設置的電子郵件所需的功能,然後通過模板名稱定義電子郵件,然後使用函數將其發送給用戶。您會注意到我們尚未定義發送郵件的函數,send_html_email,所以讓我們在已經添加到用戶/email.py的代碼下面寫下此函數。
def send_html_email(user, mail_subject, html_message):
to_email = user.email
username = user.username
if to_email == '':
return None
unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
html_message = html_message + "<p><a href=\"" + unsub_link + "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
msg.attach_alternative(html_message, "text/html")
profile = user.profile
try:
msg.send(fail_silently=False)
if not profile.email_valid:
profile.email_valid=True
profile.save()
except:
profile.email_valid=False
profile.save()
這有點複雜,我們還沒有準備好運行所有這些代碼。請注意,我們定義了UNSUB_LINK,用戶可以使用用戶退訂我們的電子郵件的鏈接。這很重要,因為用戶將需要能夠退出我們的電子郵件,除非他們想隨時看到它們。我們還為我們的消息添加了文本替代方案,即HTML標籤所剝離的HTML消息。最後,我們檢查電子郵件是否發送,如果沒有發送,我們在用戶的個人資料中標記了他們的電子郵件無效。
讓我們回到用戶模型中,以便我們可以使所有工作都起作用。我們需要定義一個函數來生成鏈接以取消訂閱,並定義一個布爾字段以標記用戶的電子郵件無效。
首先,將以下導入添加到用戶/型號的頂部。
nano users/models.py
# …
接下來,讓我們將功能添加到用戶模型中以製造令牌並檢查用於激活電子郵件的令牌以及該字段,以保存用戶是否成功接收其郵件。在用戶/型號中,再次,將以下代碼添加到模型末尾(縮進代碼)
# …
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 有效期30天
這很簡單,我們使用TimestAmpSigner(這是一種基本的加密工具)來創建一個令牌,該代幣將在一定時間之後到期,並且我們還使用另一個功能來檢查其是否有效。我們兩次使用這些令牌,一次驗證電子郵件,然後一次取消訂閱鏈接。
現在我們已經擁有了這些,我們將要做的最後一項工作就是在視圖中。在用戶/views.py中,讓我們添加視圖以驗證電子郵件地址並取消訂閱。
nano users/views.py
首先,添加以下導入。我額外扔了幾個,所以我們以後不必再進口更多物品了。
from .email import send_verification_email # 確保導入驗證電子郵件發送功能
您可能已經有一些這些進口,但是重複它們並沒有什麼壞處。您將需要從用戶導入驗證電子郵件發送函數以及account_activation_token。
現在,在文件的底部,添加以下代碼:
# 取消訂閱
# 否則重定向到登錄頁面
# sendwelcomeemail(請求,用戶)
這是很多代碼。讓我們分解。第一個功能,乾淨,簡單,從郵件列表中取消訂閱用戶。第二個功能激活了他們的電子郵件,您會注意到我添加了評論功能,sendwelcomeemail。歡迎您使用電子郵件模板和功能定義發送歡迎電子郵件,我還沒有。我投擲的最後一個功能很重要,因為激活電子郵件過期。因此,我們需要在某些時候重新發送激活電子郵件。我們可以為此使用基本表單,並致電該功能發送驗證電子郵件。在執行此操作之前,讓我們確保通過在寄存器視圖中添加功能調用來確保它首先發送。在寄存器視圖中的重定向之前,在用戶/views.py中添加此行。
nano users/views.py
# …(之後)DEF寄存器(請求):
# …(之前)重定向(
您無需在該代碼段中添加第一行和最後一行,只需確保寄存器視圖將驗證電子郵件發送給用戶即可。看起來應該這樣:
# …進口
send_verification_email(user) # 確保添加此行!
現在,我們需要添加一個表格來重新發送激活電子郵件。在用戶/表格中。 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標籤,因為當我們添加HTML退訂鏈接時,我們將其添加。這些很重要,但我們不想定義兩次。
那接下來是什麼?我們走了很長一段路。確實,我們應該準備將站點部署到服務器。我們可以添加@Login_Required Decorator,並確保我們的視圖安全,進行用戶註冊,發送合規電子郵件和緩存信息,這是網站保持相關性所需要做的基礎。我們將添加一些有用的功能,然後建立將代碼部署到遠程服務器,設置郵件服務器,域配置和過濾器以使我們的網站安全可靠的基礎。
我們還需要密碼重置視圖,所以讓我們非常快地添加。 Django的內置密碼重置視圖在某些功能中被打破,但是我們將研究如何編寫自己的視圖,電子郵件模板,表單和URL模式。這就是視圖的樣子,在用戶/views.py中
# ...導入
此表單內置到Django,但是我們需要一個模板來確認密碼重置,用戶/templates/users/password_reset_confirm.html
我們還有一個模板來發送密碼重置電子郵件,並使用簡單的表單,用戶/模板/users/passwork_reset.html發送密碼。
電子郵件本身的模板很簡單,它是一個基本的html文件,渲染鏈接以重置密碼,在用戶/模板/users/passwere_reset_email.html中。 Django將自動解釋此文件。
我們還需要兩個模板。首先是確認已發送電子郵件。這些視圖已經在Django中,因此我們只需要在URLS.PY中解決它們。此模板位於用戶/模板/用戶/password_reset_done.html上
最後,要確認密碼重置已完成,用戶/模板/用戶/password_reset_complete.html
現在,我們需要這些觀點的URL模式。在用戶/urls.py中,添加以下URL模式:
# ...以前的URL在這裡
四個模板,很多!但是現在,我們一定能夠從Web瀏覽器中隨時隨地重置用戶的密碼。
我了解這是很多代碼。如果您的頭部似乎有點遠,那沒關係。您將有所改善,理解將有所改善,並且您很快就會變得更加能夠使用代碼。如果您完全迷失了,我建議您在在線學習以學習為課程的自定進度後,稍後再回到此軟件。這些通常可以免費入門,並會指導您回到這個項目時獲得成功所需的一切。如果您覺得自己準備繼續,請繼續閱讀,接下來,我們將介紹將代碼部署到遠程服務器並設置郵件服務器,並使用bash自動部署,以便您始終使用一些簡單的命令來設置一個新項目。
在部署到遠程服務器之前,我們需要做的最後一件事是使我們的網站更加安全。您會注意到登錄視圖僅採用用戶名和密碼,並且沒有多因素身份驗證或一個時間代碼。這是一個簡單的修復,並且使用相同的代碼,我們可以使我們的網站發送短信,甚至可以響應發送給服務器的短信。首先,我們將返回用戶模型,並添加一個將表示每個登錄的時間戳簽名者。我們還將在用戶模型中添加一個唯一的旋轉標識符,該標識符將用於為我們的登錄添加額外的安全性。編輯用戶模型,用戶/型號。 py,添加以下代碼:
# 確保導入UUID,時間戳簽名器和URL發電機(反向)
# 在這裡添加此代碼
# 並添加此功能
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 有效3分鐘
除了註釋(與#的行上的代碼)外,請確保您的用戶/型號看起來像這樣。打破這個,很簡單。我們有一些導入器,一個時間戳簽名器,它是一個加密實用程序,可以生成安全的代碼並進行驗證,以確保其有效,僅使用一次,而不是比一定數量的秒更古老。我們還使用UUID,這是一個唯一的標識符,可以在令牌的簽名中標識我們的用戶,以及在將令牌發送給用戶的URL中。我們將使用此基本密碼學來構建兩個因素身份驗證視圖。在我們做其他任何事情之前,讓我們運行遷移,以便更新我們的用戶模型。在帶有manage.py的目錄中,運行以下命令以進行和完成遷移。
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
這很重要,因為每次我們對模型進行更改時,我們都需要創建表並使用默認值更新數據庫,然後才能實際使用模型。
接下來,讓我們即興創作登錄視圖,以重定向到輔助身份驗證視圖。在用戶/views.py中,刪除登錄功能並將其重定向到我們在用戶模型中生成的URL。
# …進口
if user and user.profile.can_login < timezone.now(): # 請注意,我們現在檢查用戶是否可以登錄
# 刪除此處的auth_login函數
return redirect(user.profile.create_auth_url()) # 注意我們在這裡重定向到新的URL
else: # 如果用戶不使用多因素身份驗證,請將其記錄在其中。
else: # 如果登錄未成功,
user = User.objects.filter(username=username).first() # 這是我們更新用戶配置文件的部分
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # 所以他們不能再登錄幾秒鐘
因此,這很簡單,現在我們可以在創建它時將其重定向到兩個因素身份驗證視圖。如果用戶尚未添加電話號碼,我們也有回退。我們將添加一個基本視圖,以盡快添加電話號碼並儘快登錄短信。
首先,我們需要一種簡單的方法來從我們的代碼發送短信。為此,我們可以從許多API中進行選擇,但我認為最簡單的是Twilio。他們還為較小的項目提供了良好的定價,以及大量折扣。在twilio.com上創建一個帳戶,填寫有關項目的一些詳細信息,購買電話號碼,然後將API鍵複製到您的設置。然後,在新文件(用戶/sms.py)下添加此代碼。
nano users/sms.py
# 導入所有必要的軟件包
# 此代碼與Twilio一起發送文本
# 輔助功能可以獲得一個數字如此多的數字
# 發送文本以驗證用戶
# 向用戶發送此功能的任何文本
# 使用此功能驗證代碼
# 驗證時間
確保適當地更改設置,並使用鍵添加這些行:
# 確保從您的Twilio儀表板複製這些
AUTH_VALID_MINUTES = 3 # TFA頁面有效的分鐘數一旦實例化
首先,我們將需要我們的兩個因素身份驗證視圖的表格。編輯用戶/forms.py,添加以下代碼。
# …進口
# 輸入我們電話號碼的表格
# 認證的形式
接下來,讓我們在用戶/views.py中創建視圖
# …進口
我們還需要這兩種觀點的模板。讓我們先添加MFA模板。
nano users/templates/users/mfa.html
將此HTML代碼添加到模板
這是非常自我解釋的。表格發送代碼或空代碼,如果我們收到空代碼,您會在視圖中註意到我們發送代碼。然後,我們只有兩個提交按鈕,這樣我們就可以使用任何一個按鈕發送代碼。接下來,我們將添加一個簡單的表格來添加電話號碼。
nano users/templates/users/mfa_onboarding.html
添加以下HTML:
此表單要簡單得多,它只是呈現我們創建的電話號碼表單,並讓用戶添加電話號碼。
這看起來真的很好!只要一切都正確設置,我們就應該能夠發送消息,並在添加URL模式後立即將用戶登錄。我們需要設置的最後一件事是配置文件視圖,因此我們可以確保用戶可以更改其電話號碼而不會登錄。此外,我們最終將要添加一個"停止戒菸"選項,因此用戶可以短信"停止"以選擇未來的文本消息。
讓我們將配置文件視圖添加到用戶/views.py。此視圖將更新用戶的簡歷,電子郵件,用戶名和電話號碼,並允許我們啟用多因素身份驗證。首先,我們將需要另外兩種表格/形式。
# ...導入
接下來,我們可以創建一個視圖以使用這兩種形式。編輯用戶/views.py並添加視圖。
# 添加這些導入
我們還需要此視圖的模板。
nano users/templates/users/profile.html
您會注意到這是一個相當簡單的表單,但是其中包含一些JavaScript,它們會在更新時自動發布表單的內容。這對擁有很有用,因此您可以進行編輯而無需每次提交。
接下來,我們需要在用戶URL模式中代表所有這些視圖的URL。編輯用戶/urls.py並添加此代碼:
# …以前的代碼,導入
# …我們先前輸入的URL模式,添加接下來的三行
現在是測試我們項目的好時機。但是首先,讓我們再運行另一個備份。
backup
並運行服務器。在我們部署到Linux服務器之前,最好在帳戶上啟用兩個因素身份驗證。我們將執行此操作,將其轉到我們的個人資料URL,/用戶/個人資料/,並在輸入我們的電話號碼後檢查框以啟用身份驗證,然後提交表格。
python manage.py runserver localhost:8000
訪問您的網頁訪問您的Web瀏覽器,我在此示例中使用Google Chrome,然後輸入url https:// localhost:8000/eaccement/profile/profile/profile/
如有必要,您將能夠登錄並啟用兩個因素身份驗證。
該項目需要服務器運行,因此它可以真正發送郵件。但是首先,我們需要一種查看錯誤的方法。您會注意到,如果您在調試模式下運行服務器,則使用設置。 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'
除了錯誤視圖,模板和一些中間件之外,我們還需要這一切。讓我們將其定義為:
# 在這裡創建您的觀點。
接下來,讓我們定義中間件來處理這些錯誤。我們將首先以中間件的名稱添加到settings.py中的middleware_classes來做到這一點。
# ...以前的中間件
接下來,讓我們添加中間件。
from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin
_error = local()
class ExceptionVerboseMiddleware(MiddlewareMixin):
def process_exception(self, request, exception):
_error.value = traceback.format_exc()
def get_current_exception():
try:
return _error.value
except AttributeError:
return None
def set_current_exception(exception):
try:
_error.value = exception
except AttributeError:
print('Attribute error setting exception.')
我們添加了一個函數來通過使用螺紋本地螺紋來獲取當前異常,這有助於我們跟踪代碼中的任何錯誤。就模板而言,我們只需要一個,因為我們在視圖中動態定義標題。該模板只需要渲染標題和"跟踪",即我們從上下文中的錯誤追溯。
nano errors/templates/errors/error.html
這是我們迄今為止最簡單的模板,但這很容易看到我們項目中的錯誤。接下來,讓我們在設置中禁用調試。
nano app/settings.py
找到將其設置為true的行,然後將其更改為false
DEBUG = False
繼續並立即備份該應用程序。我們準備部署到遠程Linux服務器,並繼續添加功能。
sudo backup
在將此代碼發佈到服務器之前,我們應該考慮代碼可能存在一些問題。根據案例,接受發布給他們的信息的網站將在發布垃圾郵件和刪除垃圾郵件的困難方面存在問題。這不應該立即發生,但是如果發生這種情況,我們稍後將研究如何自動在網站上自動垃圾郵件,並使機器人更難訪問站點,以及如何停用用戶帳戶,並通過使用ID或生物識別掃描(例如指紋或面部識別)來驗證用戶的身份。
查看我們檢查的多因素身份驗證示例,在生產中,情況可能會有所不同。請注意,我們是如何限制登錄和到期令牌的。如果機器人正在訪問站點,則兩個因素身份驗證可能會更加困難,因為它們可能同時輸入代碼。為了解決這個問題,讓我們在用戶模型中使用模型,並在使用多因素身份驗證和電話號碼進行身份驗證時聲明我們如何與站點進行交互。我們還將添加一個通過電子郵件進行身份驗證的選項。首先使用Nano編輯用戶模型。
nano users/models.py
這就是我們要添加的模型的外觀。我們不需要任何方法,只是變量來存儲ID,用戶,時間戳,有效期,長度以及對任何多因素身份驗證的嘗試(發送到電話或電子郵件的123456之類的代碼)。
# 一個用於登錄網站的基本令牌
我們還向用戶添加特權,我們現在將手動設置它,然後最終遷移到自動招募特權用戶。在用戶模型中,在配置文件中添加此行:
vendor = models.BooleanField(default=False)
與數據庫的任何更改一樣,我們需要在Django中編輯Models.py文件時進行遷移並遷移數據庫。請記住,要做到這一點,我們首先使用源(如果終端開放以來還沒有使用)然後python manage.py進行遷移和遷移。
cd project-directory-you-named # (如果需要)
目前,您可以使用Shell來招募您作為供應商創建的任何帳戶。
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
現在,讓我們進化我們的多因素身份驗證視圖以使用此令牌。首先,我們需要修改MFA助手實用程序。使用Nano,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# 使用其電子郵件或電話號碼對用戶進行身份驗證
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): # 如果請求是郵政請求
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(): # 為下一個參數構建Querystring(如果有)
return HttpResponseRedirect(next) # 重定向
elif not token_validated: # 如果令牌無效
if p.mfa_attempts > 3: # 如果嘗試太多
if form.data.get('send_email', False): # 發送電子郵件(或文字)
# 渲染表格(用於獲取請求)
當我們添加此代碼時,請確保導入該函數以發送電子郵件。在文件的頂部,用戶視圖(帶有其他導入),添加
from .mfa import send_verification_email as send_mfa_verification_email
現在,我們需要在任何一個都起作用之前編寫該功能。它應該擴展我們的發送電子郵件功能,並只需通過驗證代碼將電子郵件發送給用戶。
nano users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
因此,這一切都很好,現在我們有了一個多因素身份驗證系統,該系統取決於電話號碼或電子郵件登錄。但是,我們還需要一種刪除或至少隱藏不符合我們條款的用戶的方法。這些可能是垃圾郵件發送者,機器人或任何對我們工作不好的人。看看我在網站上監視用戶的視圖:
# 進口
from .tests import is_superuser_or_vendor # 我們需要創建此測試
# 獲取用戶列表
return render(request, 'users/users.html', { # 在模板中返回用戶
請注意,此代碼使用測試,我們需要在tests.py文件中聲明此測試並導入它。編輯用戶/tests.py,讓我們創建測試。
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
這與用戶/用戶一起結合使用。 html模板,看起來像這樣:
請注意,該模板包含另一個模板,用戶/user.html。當使用具有子測試且不使用擴展的模板時,添加下劃線的好主意()在文件的名稱擴展之前,以區分模板。
請注意,這是很多Jinja,您可能沒有定義所有這些變量。但這就是我的代碼的樣子。
<small># {{user.id}} </small>
我們還需要另一個子板toggle_active.html。該模板應是一種使我們可以切換用戶是否處於活動狀態的表單。
我們還需要添加視圖以切換用戶活動和適當的URL模式。當我們使用它時,讓我們添加一個視圖以刪除用戶,以防我們需要。
# 進口
success_url = '/' # 成功URL的重定向
def test_func(self): # 測試用戶是否是超級用戶,並且有權刪除
儘管在必要時是實用的,但在大多數情況下,刪除用戶不應是必要的,但如果需要解散,我們可以切換訪問網站的用戶的可見性。
我們添加的URL模式看起來像這樣。使用Nano,編輯用戶/urls.py並添加以下行:
nano users/urls.py
這些行應在用戶視圖中的路徑列表中,在結束"]"之前,但是在開始之後" ["。
# …
# …
現在,請確保備份網站,以便您可以在我們將繼續進行的Web服務器上下載它。從命令行,
sudo backup
現在我們的網站已備份。
因此,現在我們有了一些有用的功能。但是這裡的大局呢?該代碼仍然無法從Internet訪問,我們還沒有郵件服務器,我們需要擴展應用程序以包括全面的驗證過程以及平穩的佈局,以幫助我們探索該站點,以及用於認證特權用戶的安全協議。
我們將解決這一切。目前,最重要的事情就是在線獲得此代碼,我們只能在Ubuntu Server上使用幾行BASH來進行。不過,您需要為此租用服務器,除非您在家中有服務器和允許您打開端口的業務互聯網訂閱。我親自在安裝在公寓中的HP Z440上運行我的網站,但通常需要便宜得多的基本租用虛擬專用服務器(VPS)。
請記住,我們現在正在運行的代碼相對較薄,在我們準備好使用所需的產品來構建產品之前,它需要維護和改進。確保小心使用Internet的工作,請確保您是否在Linux服務器上公開部署此網站,您有計劃阻止與網站的不必要的互動。一開始這可能不會是問題,但是我們將研究各種解決方案來打擊這一問題,包括機器學習,人工智能和計算機視覺。當它確實成為問題時,請在本文中進一步尋找解決方案。
在租用VP的方面,您可以去很多地方。 Google Cloud擁有VPS服務器,Ionos,Kamatera,Amazon AWS和更多提供商提供適合我們需求的雲服務器解決方案。
您需要單擊他們的表格,然後選擇一個計劃才能開始。您可以與任何提供商一起使用基本計劃,但是請確保提供商允許您打開端口郵件服務器端口發送電子郵件(這應該是端口587和端口25),一些提供商會阻止這些端口。到目前為止,我在Ionos和Kamatera方面擁有最好的經驗,它們都可以讓我發送無限的電子郵件,並且它們的價格非常便宜。
您將通過稱為SSH或Secure Shell的協議連接到新服務器,該協議使您可以像個人計算機一樣與服務器遠程接口。設置服務器時,託管提供商可能會要求您添加SSH鍵,否則它們會為您提供用戶名和密碼。 SSH鍵是您將如何從命令行登錄到服務器以編輯代碼。使用以下SSH-鍵選項生成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,但是您打算這樣做。通過單擊提供者網站上的表單(kamatera.com,ionos.com或類似)上的表單來創建VP,您將要登錄。要執行此操作,請使用SSH命令使用IP地址(看起來像xx.xx.xx.xx.xx的地址)。您還需要對我們創建的服務器上的默認用戶名敏感,例如Ubuntu。
ssh ubuntu@XX.XX.XX.XX
可能會要求您提供密碼,如果要求您輸入密碼,請輸入。我們不會使用默認用戶名,因此讓我們首先創建新用戶並在其帳戶中添加SSH鍵。
讓我們開始添加一個新的SSHD_CONFIG文件,該文件告訴服務器如何使用SSH。
nano sshd_config
# 這是SSHD服務器系統範圍的配置文件。 看
# SSHD_CONFIG(5)以獲取更多信息。
# 此SSHD與路徑=/usr/local/sbin:/usr/locar/bin:/usr/sbin:/usr/bin:/sbin:/sbin:/bin:/usr/usr/gash
# 默認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默認沒有
# 記錄
# syslogfacity auth
# loglevel信息
# 驗證:
# LogingRaceTime 2m
# 允許Rootlogin禁止使用
# 嚴格模具是
# Maxauthtries 6
# 最大值10
# 期望.ssh/授權_keys2將來默認情況下會被忽略。
# 授權principalsfile無
# 授權keyscommand無
# 授權keyscommanduser沒人
# 為此,您還需要/etc/ssh/ssh_known_host中的主機鍵
# hostbasedAuthentication no
# 如果您不信任〜/.ssh/nown_hosts,則更改為"是"
# hostbasedAuthentication
# 忽略了眾議員霍斯特斯
# 不要讀取用戶的〜/.rhosts和〜/.shost文件
# 無知的主機是
# 要禁用隧道清晰的文本密碼,請在此處更改!
# PliperEmptypasswords no
# 更改為"是"以啟用挑戰響應密碼(當心問題
# 一些PAM模塊和線程)
# Kerberos選項
# Kerberosauthentication
# Kerberosorlocalpasswd是的
# KerberosticketCleanup是的
# kerberosgetafstoken
# GSSAPI選項
# GSSAPIATHENTICATION NO
# gssapicleanupcredentials是的
# GSSAPISTRICTACCEPTORCHECK是的
# gssapikeyexchange no
# 將其設置為"是"以啟用PAM身份驗證,帳戶處理,
# 和會話處理。如果啟用了,PAM身份驗證將
# 可以通過KBDInteractiveAthentication和
# 密碼授權。 根據您的PAM配置,
# 通過KBDInteractiveAthentication進行的PAM身份驗證可能繞過
# 設置"沒有通信的允許原始斑塊"。
# 如果您只希望PAM帳戶和會話檢查即可運行
# PAM身份驗證,然後啟用此驗證,但設置密碼授權
# 和kbdInteractiveAthentication至" no"。
# 是的
# 允許forwarding是的
# Gatewayports no
# X11DISPLAYOFFSET 10
# x11uselocalhost是的
# 是的
# printlastlog是
# tcpkeepalive是的
# 許可證環境號
# 壓縮延遲
# 客戶端Interval 0
# 客戶端Alivecountmax 3
# 二手
# pidfile /run/sshd.pid
# Maxstartups 10:30:100
# 通知號號
# chrootdirectory無
# 版本addendum無
# 沒有默認橫幅路徑
# 允許客戶通過環境環境變量
# 覆蓋無子系統的默認值
# 以每個用戶為基礎的覆蓋設置的示例
# 匹配用戶anoncvs
# x11福爾德編號
# 允許Forwarding no
# 許可證號
# forcecommand cvs服務器
請記住,Ctrl+X和Y保存文件。接下來,讓我們編寫一個名為initialize的基本腳本(所有用戶的默認主目錄中)。
nano initialize
將這些行添加到文件中,更換
# ! /bin/bash
要引導您瀏覽此文件,讓我們逐行開始。第一行告訴編譯器這是一個bash腳本。然後,我們正在安裝依賴項,將sshd_config複製到正確的目錄,重新啟動SSH,為root生成SSH鍵,添加用戶'team'(您可以為此選擇一個名稱,請使用帶有其名稱和禁用密碼的Adduser命令)。我們還將團隊添加到Sudo Group,生成他們的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。首先,它檢查文件是否存在或以其他方式創建該文件,添加了以聲明腳本的第一行是bash,更改其權限,對其進行編輯,並將其名稱添加到 /etc /ascripts中,使我們可以存儲我們創建的腳本的名稱。如果文件已經存在,只需更改權限並將其編輯。保存文件,接下來我們將更改其權限。只要我們使用此腳本,我們就不必再這樣做了。
sudo chmod a+x /usr/bin/ascript
完美的。現在,讓我們創建一個稱為設置的腳本。首先,不要讓您不知所措,而是看看我的設置腳本的樣子。我們將介紹該腳本在您的項目中的外觀,您將不需要我腳本中的所有內容。
# ! /bin/bash
# sudo chmod a+x腳本/usersetup
# ./scripts/usersetup
# ssh-keygen
# 項目目錄
# 日誌命令
# 納米配置
# git config
# 更新並安裝
# 啟用Clamav防病毒軟件
# 設置主機名
# 設置Postgres
# 設置數據庫備份
# 禁用iPtables
# 安裝BitDefender
# 設置後綴
# 創建DIRS
# 設置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''''$ d'/etc/pam.d/sshd
# sudo sed -i''''$ d' /etc /profile
# 複製bin腳本並設置權限
# 重新加載和啟用服務
# 啟用Apache模塊
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# 禁用默認網站
# 啟用我們的網站
# 重新加載守護程序和重新啟動Apache,Postfix和Opendkim
# 設置權限
# 交換配置
# 初始化標題引擎
# 設置git
# 顯示IPv6和OpendKim用於域配置
# 設置完成
那是很多設置!簡而言之,該代碼記錄命令,配置納米和git,通過文件複製,下載和安裝Ubuntu Apt軟件包,Python依賴關係,配置後綴,配置後綴,配置PostgreSQL(數據庫服務器)(數據庫服務器)並加載數據庫並配置UFW(不復雜的firewall),使依賴依賴依賴依賴,依賴依賴性,依賴依賴,置於依賴性,置於依賴性,置於依賴性,置於依賴性,置於依賴性,置於依據,置於依據,並設置服務器,安裝配置,啟動和啟用dever,分配交換,設置權限並打印IP,IPv6地址和OpenDKIM密鑰。相當簡單,但看起來很多代碼。我們不需要很多,因為我們沒有依賴關係,我們不使用芹菜,芹菜或達芙妮,但是無論如何我們都會安裝其中的一些來開始。請注意,此代碼已聲明了幾次域。
我們還需要購買一個域名(這是每年的少量費用)。我建議Squarespace用於購買域,它們的佈局是直觀且易於使用的。您可以購買自己選擇的任何域,但是在此示例中,我使用的是femmebabe.com。購買域後,請前往Squarespace DNS配置面板,並通過IP地址添加將您的域指向服務器的A記錄。看起來應該這樣:
@ a xx.xx.xx.xx
將 @運算符作為主機,這意味著該域下的所有子域和根域都將重定向到服務器。還有更多的記錄要聲明,但是一旦我們準備發送郵件,我們就可以繼續進行這些記錄。請記住,您可能需要幾天才能成功從服務器發送郵件。我們設置的DNS記錄將需要時間進行傳播。
無論如何,我們唯一需要開始的記錄是A記錄。因此,現在我們可以根據項目填寫以下腳本並運行它。
讓我們從一個較小的設置腳本開始,只需安裝我們需要的基本進度所需的內容即可。我們還不使用太多的依賴項或PostgreSQL,我們將只啟動基本的HTTP服務器,並在完成後擔心認證。請記住,要獲得HTTPS證書並安全運行服務器,我們將需要購買域名以及租金服務器。現在,用您的項目目錄中的用戶名稱" DIR"替換此文件中的"團隊",並在<>標籤中提供電子郵件和域。
此外,在運行此代碼之前,我們需要將設置更改為防火牆託管提供商支持(如果有)。通常,這是在您的託管提供商的"網絡"選項卡中,或者如果您是自託管,則在路由器的"端口轉發"部分中。如果您使用的是自託管,您還需要通過服務器計算機的地址通過路由器設置靜態IP。您將需要打開以下端口以進行讀/寫訪問。
22(SSH) 25(郵件) 587(郵件) 110(郵件客戶端) 80(http) 443(https)
# ! /bin/bash
# 日誌命令
# 納米配置
# git config
# 更新並安裝
# 啟用Clamav防病毒軟件
# 設置主機名
# 設置數據庫備份
# 禁用iPtables
# 設置Virtualenv
# 安裝certbot
# 運行certbot
# 設置用戶設置
# 設置權限
# sudo chown -r團隊:用戶/var/run/
# sudo chown root:root/run/sudo/ts -r
# 重新加載和啟用服務
# 啟用Apache模塊
# 重新加載守護程序和重新啟動Apache,Postfix和Opendkim
# 顯示IPv6和OpendKim用於域配置
在運行此代碼之前,請確保您購買的域已連接到服務器。為此,請在本地計算機上打開一個終端,然後使用您的域運行此命令:
ping femmebabe.com # ping之後,在此處插入您的域
如果所有人看起來都很好並且服務器正在發送響應,那麼我們準備運行腳本並安裝軟件包以及啟動,啟用和認證我們的Apache服務器。
這不是配置PostFix所需的所有設置,我們將稍後再查看該設置。現在,運行此設置代碼,需要花費幾分鐘的時間才能安裝和證明您的服務器。再次,請確保根據您購買的名稱在腳本中替換名稱,電子郵件和域名。
現在已經配置了服務器,您可以在任何Web瀏覽器中轉到URL並檢查服務器正在運行HTTPS。如果不是這樣,請嘗試等待一會兒DNS記錄趕上來,然後運行以下命令重試證書認證:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
只要您正確配置了所有內容,就應該能夠訪問Apache的默認頁面,以了解您的代碼正在工作並顯示實時網頁。接下來,讓我們編輯設置。 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啟用默認網站和Reload Apache2。請記住,在/etc/apache2/stite-bailable/budable/insed ins efemmebabe用您聲明的文件的名稱替換。
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
返回您在Navbar中的域。您應該在Web瀏覽器中查看您配置的網站。恭喜!如果您看不到它,則可能需要進行一些更改。仔細查看項目中的設置,Apache配置,並確保您沒有任何錯誤,並運行以下命令以檢查項目是否錯誤。
cd projectname
source venv/bin/activate
python manage.py check
如果您的Python項目中有錯誤,請將其追踪到它們所在的位置並修復它們。您可能無法根據它們的位置看到所有錯誤,因此,如果您有一個簡單地說"填充不是重新進入的錯誤"的錯誤,請在虛擬環境中編輯以下文件,註冊表。 Py,以暴露該錯誤。
nano venv/lib/python3.12/site-packages/django/apps/registry.py
滾動到第83行,在此增加了此運行時錯誤(提高RuntimeRoror(" populate()不重入"),然後在此行之前添加註釋,然後在相同的凹痕中添加Self.App_Configs = {}。看起來像這樣:
# 防止重新進入電話,以避免運行AppConfig.ready()
# 方法兩次。
# 提高RuntimeRor(" pupulate()不是重入")
然後,您可以再次檢查項目並暴露錯誤。
python manage.py check
然後,您可以看到錯誤並修復它。將其修復並沒有錯誤編譯時,請確保將文件重新更改為這樣,這樣看起來像這樣:
# 防止重新進入電話,以避免運行AppConfig.ready()
# 方法兩次。
# 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:FFF:FE49:3E02)。不用擔心域名目前,當我們使用OpendKim設置Postfix,Mail Server,並打印鍵時,這是創建的。我們將進行最後一個配置。
@ 一個 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:fff:fe49:3e02〜
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。讓我們一一查看所有配置文件,然後將它們安裝在我們項目中稱為Config的目錄中,以安裝到OS。
nano config/etc_postfix_main.cf
將此文本添加到文件中
# 請參閱/usr/share/postfix/main.cf.dist,以獲取評論,更完整的版本
# debian特定:指定文件名將導致第一個
# 該文件的行用作名稱。 Debian默認
# IS /etc /mailname。
# Myorigin = /etc /mailname
# 附加域是MUA的工作。
# 輸入下一行,以生成"延遲郵件"警告
# delay_warning_time = 4H
# 請參閱http://www.postfix.org/compatibility_readme.html-默認為3.6 on
# 新的安裝。
# TLS參數
# 小米配置
下一個配置!
nano config/etc_postfix_master.cf
添加以下行:
#
# Postfix Master Process配置文件。 有關格式的詳細信息
# 在文件中,請參閱主(5)手冊頁(命令:" Man 5 Master"或
# 在線:http://www.postfix.org/master.5.html)。
#
# 編輯此文件後,不要忘記執行" Postfix Reload"。
#
# ====================================================================================
# 服務類型私人UNPRIV CHROOT WAKEUP MAXPROC命令 + ARGS
# (是)(是)(否)(從不)(100)
# ====================================================================================
# smtp inet n -y -1後屏幕
# SMTPD PASS - Y-- SMTPD
# DNSBlog Unix-- Y -0 DNSBlog
# tlsproxy unix-- y -0 tlsproxy
# 選擇一個:僅對環回客戶端或任何客戶端啟用提交。
# 127.0.0.1:ubmission inet n -y-- smtpd
# -O syslog_name = PostFix/提交
# -o smtpd_tls_security_level = gentrypt
# -o smtpd_sasl_auth_enable = yes
# -o smtpd_tls_auth_only =是
# -o smtpd_reject_unlisted_recipient = no
# -o smtpd_client_resterrictions = $ mua_client_resterrictions
# -O smtpd_helo_resterrictions = $ mua_helo_restrictions
# -o smtpd_sender_resterrictions = $ MUA_SENDER_RESTRICTIONS
# -o smtpd_recipient_resterrictions =
# -o smtpd_relay_resterrictions = pull_sasl_authenticated,拒絕
# -o milter_macro_daemon_name =始發
# 選擇一個:僅適用於回環客戶端或任何客戶端的SMTP。
# 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_resterrictions = $ mua_client_resterrictions
# -O smtpd_helo_resterrictions = $ mua_helo_restrictions
# -o smtpd_sender_resterrictions = $ MUA_SENDER_RESTRICTIONS
# -o smtpd_recipient_resterrictions =
# -o smtpd_relay_resterrictions = pull_sasl_authenticated,拒絕
# -o milter_macro_daemon_name =始發
# 628 inet n -y-- qMQPD
# QMGR UNIX N -N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# =================================================================
# 與非PostFix軟件的接口。確保檢查手冊
# 非postFix軟件的頁面以查找所需的選項。
#
# 以下許多服務都使用後四個管道(8)交付
# 代理人。 有關$ {收件人}的信息,請參見管道(8)人頁面
# 和其他消息信封選項。
# =================================================================
#
# MailDrop。有關詳細信息,請參見《 Postfix MailDrop_readme文件》。
# 也在main.cf中指定:maildrop_destination_recipient_limit = 1
#
#
# =================================================================
#
# 最近的Cyrus版本可以使用現有的" LMTP" Master.CF條目。
#
# 在cyrus.conf中指定:
# lmtp cmd =" lmtpd -a"聽=" localhost:lmtp" proto = tcp4
#
# 在main.cf中指定以下一個或多個:
# Mailbox_transport = LMTP:INET:localhost
# virtual_transport = lmtp:inet:localhost
#
# =================================================================
#
# Cyrus 2.1.5(Amos Gouaux)
# 也在main.cf中指定:cyrus_destination_recipient_limit = 1
#
# Cyrus unix -n n--管道
# flags = drx user = cyrus argv =/cyrus/bin/deliver -e -r $ {sender} -m $ {extension} $ {user}
#
# =================================================================
# 通過Cyrus交付的舊例子。
#
# 舊卡魯斯unix -n n--管道
# flags = r用戶= cyrus argv =/cyrus/bin/deliver -e -m $ {extension} $ {user}
#
# =================================================================
#
# 有關配置詳細信息,請參見Postfix Uucp_readme文件。
#
#
# 其他外部交付方法。
#
和OpendKim配置。 OpendKim使用域鍵標識電子郵件服務器,以使其更安全。沒有它,郵件沒有簽名,也可能無法進入收件箱。
nano config/etc_default_opendkim
添加以下行:
# 注意:這是一個舊版配置文件。 Opendkim不使用它
# SystemD服務。請使用相應的配置參數
# /etc/opendkim.conf而不是。
#
# 以前,有人會在此處編輯默認設置,然後執行
# /lib/opendkim/opendkim.service.generate以生成Systemd替代文件
# /etc/systemd/system/opendkim.service.d/override.conf和
# /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上的所有接口上聆聽:
# 插座= INET:54321
# 在端口12345上收聽回環:
# 套接字= inet:12345@localhost
# 在港口12345上的192.0.2.1聽:
# 插座= INET:12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
添加以下行:
# default_process_limit = 100
# default_client_limit = 1000
# 默認VSZ(虛擬內存大小)服務過程的限制。這主要是
# 旨在捕捉和殺死在食物吃飯之前洩漏記憶的過程
# 一切。
# DEFAULT_VSZ_LIMIT = 256m
# 登錄用戶內部通過登錄過程使用。這是最不信任的
# Dovecot系統中的用戶。它根本不應該訪問任何東西。
# default_login_user = dovenull
# 內部用戶被無特權的過程使用。它應該與
# 登錄用戶,以免登錄過程無法打擾其他過程。
# default_internal_user = dovecot
# 端口= 143
# 端口= 993
# SSL =是
# 在開始新過程之前,要處理的連接數量。通常
# 唯一有用的值是0(無限)或1。1更安全,但是0
# 更快。 <doc/wiki/loginprocess.txt>
# service_count = 1
# 始終等待更多連接的過程數量。
# process_min_avail = 0
# 如果設置service_count = 0,則可能需要增長此。
# vsz_limit = $ default_vsz_limit
# 端口= 110
# 端口= 995
# SSL =是
# 端口= 587
# 僅當您無法使用上述UNIX插座時創建INET偵聽器
# inet_listener lmtp {
# 避免使LMTP在整個互聯網上可見
# 地址=
# 端口=
# }
# 大多數內存都用於mmap()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返回一個" UID"字段時,UserDB查找才能成功
# 匹配呼叫者進程的UID。另外,如果呼叫者的UID或GID與
# 插座的UID或GID查找成功。其他任何事情都會導致失敗。
#
# 要授予呼叫者的完整權限查找所有用戶,請將模式設置為
# 除了0666以外的其他內容,Dovecot讓內核執行
# 權限(例如,0777允許每個人完全權限)。
# 默認情況下,Auth Works過程作為root運行,以便可以訪問
# /etc/shadow。如果不需要,則應將用戶更改為
# $ default_internal_user。
# 用戶= root
# 如果使用DICE代理,則郵件過程應可以訪問其套接字。
# 例如: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 = "# char和尾隨空格"
# 大多數(但不是全部)設置可以被不同的協議和/或
# 源/目標IPS通過將設置放置在各節內,例如:
# 協議IMAP {},本地127.0.0.1 {},遠程10.0.0.0/8 {}
# 顯示每個設置的默認值,不需要不需要
# 那些。這些是這樣的例外:沒有部分(例如命名空間{})
# 或默認情況下添加插件設置,它們僅列出為示例。
# 路徑也只是基於配置的實際默認值的示例
# 選項。這裡列出的路徑是用於配置-Prefix =/usr
# -sysconfdir =/etc--localstedir =/var
# 啟用安裝的協議
# 逗號分開的IPS或主機列表在哪裡聆聽連接。
# "*"在所有IPv4接口中聽," ::"在所有IPv6接口中聆聽。
# 如果要指定非默認端口或更複雜的任何內容,
# 編輯conf.d/master.conf。
# 聽= *,::
# 基本目錄在哪裡存儲運行時數據。
# base_dir =/var/run/dovecot/
# 此實例的名稱。在多實施設置中DoVeadm和其他命令
# 可以使用-i <senstance_name>選擇使用哪個實例(替代方案
# 到-c <config_path>)。實例名稱也添加到Dovecot進程中
# 在PS輸出中。
# instance_name = dovecot
# 客戶的問候消息。
# login_greeting = Dovecot準備就緒。
# 空間分離的受信任網絡範圍的列表。這些連接
# 允許IP覆蓋其IP地址和端口(用於記錄和
# 用於身份驗證檢查)。 disable_plaintext_auth也被忽略
# 這些網絡。通常,您在此處指定IMAP代理服務器。
# login_trusted_networks =
# 空間分開的登錄訪問列表檢查插座(例如TCPWRAP)
# login_access_sockets =
# 使用protxy_maybe =是,如果代理目標與這些IP匹配,
# 代理。這通常不是必需的,但是如果目的地
# IP是例如負載平衡器的IP。
# auth_proxy_self =
# 顯示更多的詳細過程標題(在PS中)。當前顯示用戶名,
# IP地址。可用於查看誰實際使用IMAP流程
# (例如,共享郵箱或使用相同的UID用於多個帳戶)。
# verbose_proctitle = no
# 當Dovecot總體流程關閉時,所有過程是否應殺死。
# 將其設置為"否"意味著可以升級Dovecot的情況
# 強迫現有的客戶連接關閉(儘管也可能是
# 如果升級是例如,一個問題由於安全修復)。
# shutdown_clients =是
# 如果非零,請通過與Doveadm Server的許多連接運行郵件命令,
# 而不是在同一過程中直接運行它們。
# doveadm_worker_count = 0
# UNIX插座或主機:用於連接到Doveadm服務器的端口
# doveadm_socket_path = doveadm-server
# 空間分離的環境變量列表保存在Dovecot上
# 啟動並傳遞到其所有子過程。你也可以給
# 鍵=始終設置特定設置的值對。
# import_environment = tz
##
## 字典服務器設置
##
# 字典可用於存儲密鑰=值列表。這是幾個
# 插件。字典可以直接訪問或
# 字典服務器。以下dict block地圖詞典名稱為uris
# 使用服務器時。然後可以使用格式使用URI來引用這些
# "代理:: <名稱>"。
# quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
# 大多數實際配置都包含在下面。文件名是
# 首先按其ASCII值分類,並按照該順序進行分析。 00-exefixes
# 在文件名中,旨在使訂購更容易理解。
# 還可以嘗試包含配置文件,而無需給出錯誤
# 找不到:
# 允許Dovecot收聽所有輸入連接(IPv4 / ipv6)
為Dovecot用戶添加密碼:
nano config/etc_dovecot_passwd
在結腸之前,文件的第一部分是用戶名。最後一部分" yourpassword"表示您要提供郵件服務器的密碼。
team:{plain}yourpassword
接下來,opendkim配置
nano config/etc_opendkim.conf
並添加以下行:
# 這是用於簽名和驗證的基本配置。很容易
# 適合適合基本安裝。請參閱opendkim.conf(5)和
# /USR/share/doc/opendkim/examples/opendkim.conf.sample完成
# 可用配置參數的文檔。
# logwhy no
# 常見的簽名和驗證參數。在Debian中,"來自"標題是
# 過度簽名,因為它通常是聲譽系統使用的身份密鑰
# 因此對安全性敏感。
# 簽名域,選擇器和鍵(必需)。例如,執行簽名
# 對於域" example.com",selector" 2020"(2020._domainkey.example.com),
# 使用存儲在/etc/dkimkeys/example.private中的私鑰。更細粒度
# 可以在/usr/share/doc/opendkim/readme.opendkim中找到設置選項。
# domain example.com
# 選擇器2020
# keyfile /etc/dkimkeys/example.private
# 在Debian中,OpendKim以用戶" OpendKim"運行。當需要007的透明
# 使用與MTA的本地插座,該插座可以訪問插座作為非特權
# 用戶(例如,後綴)。您可能需要將用戶的"郵政綴"添加到組
# 在這種情況下," Opendkim"。
# MTA連接的插座(必需)。如果MTA在Chroot監獄內,
# 必須確保可以訪問插座。在Debian,Postfix運行
# /var/spool/postfix中的chroot,因此必須是一個unix插座
# 如下最後一行所示,配置如下所示。
# 插座本地:/run/opendkim/opendkim.sock
# 套接字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中,提供了信任錨文件
# 通過包裝DNS-ROOT-DATA。
# 名稱服務器127.0.0.1
# 從地址到用於簽名消息的密鑰中的地圖域
# 一組應簽署郵件的內部主機
nano config/etc_default_opendkim
並添加這些行
# 注意:這是一個舊版配置文件。 Opendkim不使用它
# SystemD服務。請使用相應的配置參數
# /etc/opendkim.conf而不是。
#
# 以前,有人會在此處編輯默認設置,然後執行
# /lib/opendkim/opendkim.service.generate以生成Systemd替代文件
# /etc/systemd/system/opendkim.service.d/override.conf和
# /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上的所有接口上聆聽:
# 插座= INET:54321
# 在端口12345上收聽回環:
# 套接字= inet:12345@localhost
# 在港口12345上的192.0.2.1聽:
# 插座= 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
該腳本運行後,將其打印的最後一行複制並將其粘貼到您的DNS配置中,作為sendonly._domainkey的值。這是發送安全郵件時用於識別域的OpendKim密鑰。
驚人的!在幾天之內,您應該能夠從服務器發送郵件,前提是所有內容的配置正確。
如果您只是為郵件服務器配置了DNS,則記錄需要少於72小時。通常要快得多。您可以通過使用此命令檢查服務器是否正在工作,提供了您的電子郵件:
echo "test" | mail -s "Test Email" youremail@gmail.com
如果所有內容似乎都正常工作,則應該能夠使用服務器發送電子郵件。如果它不起作用,請嘗試查看日誌以查看可能的錯誤。
tail –lines 150 /var/log/mail.log
這將提供有關服務器發送的郵件以及它是否正常工作的詳細信息。您也應該能夠在收件箱中看到電子郵件,如果不存在,請檢查垃圾郵件文件夾。
您還需要在設置中配置您的設置。 py,以便您的電子郵件服務器可以與您的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電子郵件。在代碼中將我的名字更改為您的用戶名。
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應用程序發送的郵箱中收到一封歡迎電子郵件。好工作!你走了很長一段路。
我想補充一點,如果您在這樣的項目工作時根本遇到任何錯誤,請隨時尋找答案並尋求幫助。 Google除其他搜索引擎外,是尋找編程幫助的好資源。只需搜索您遇到的錯誤,您就可以看到其他人如何解決問題。另外,歡迎您與我,您的教育工作者(老師,教授,教師),互聯網上的任何同行者聯繫,他們可以提供編程幫助,或再次諮詢本書或其他資源,以找到解決您所遇到的問題的解決方案。我了解這並不容易,但是即使您已經閱讀了這麼多的文章並且沒有編寫任何代碼,您也在從頭開始構建Web應用程序很多。拍拍自己的後背,你做得很好。
感謝您抽出寶貴的時間閱讀本第三版網絡開髮指南。在將來的版本中,我將包括文檔開頭討論的更多重要示例,我們將深入研究軟件和硬件開發的世界。請繼續關注即將發生的事情,我期待教您如何構建令人難以置信的軟件。在下一版中見!
https://glamgirlx.com/zh-tw/practical-web-based-deep-learning-and
https://glamgirlx.com/zh-tw/practical-web-based-deep-learning-and -
使用此地址給我留言比特幣中的小費: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE