亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django怎么部署

發布時間:2022-01-12 09:35:26 來源:億速云 閱讀:196 作者:iii 欄目:網絡安全

這篇“Django怎么部署”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Django怎么部署”文章吧。

PART 1. 安全第一

修復漏洞的最佳時機便是開發的時候。

1.1 CSRF TOKEN

CSRF TOKEN是Django安全體系中的一項非常重要的安全措施。但是很多情況下,一些剛剛接觸Django的同學會發現自己好不容易寫出來的表單,在POST的時候報錯了,經過一番查找發現是CSRF TOKEN的問題,然后按照網上的方法三下五除二將settings.py中的CSRF TOKEN配置全部移除了,代碼正常跑起來了。熟不知這種操作將極大的影響網站的安全性,且提高了后期修補漏洞的成本;而在開發階段消滅安全問題,是成本最低的時候。

關于CSRF TOKEN的相關內容,官方文檔上有十分詳細的說明,具體用法這里不再闡述了。這里推薦一種比較方便的用法,在開發的時候對開發人員的感知較小,不用特別去關心Token是否已經發送成功了。

在總的父模板頁面中添加{% csrf_token %},并且在<script>部分進行如下設置:

Django怎么部署

這樣所有通過JQuery中的的AJAX發起的非GET|HEAD|OPTIONS|TRACE請求都會自動包含CSRF TOKEN(獲取CSRF TOKEN的部分代碼未列出),如果使用的是其他HTTP庫或Fetch,進行對應的設置即可。

1.2 API安全設計

某些情況下,我們的Web服務還會對外提供一些API服務,供其他系統調用,對于這些API接口,CSRF是一定要關閉的,不然根本無法正常使用。除此之外,我們還應當做一些其他的安全措施,防止API接口被濫用。除了正常的傳遞參數外,我們應當保證這些參數不被中間人篡改,并且只允許有權限的人調用對應的接口,為此我們需要額外引入幾個傳遞的參數:timestamp, sign, access_key, access_token。

access_key和access_token,這是一對參數。access_key相當于標識調用方是誰,access_token則是相當于調用方的秘鑰,access_token內容不應該能被簡單的預測到,而access_key可以為了方便記憶選擇較為簡單的字符串。只有當兩個參數匹配后,才認為本次API的調用是合法的。

timestamp時間戳,根據自己的業務情況選擇精確到秒或是毫秒。添加時間戳主要是為了防止本次調用被重放攻擊,服務端應當校驗客戶端傳遞的時間戳是否在一個時間范圍內,超時的時間戳都應當被認為是非法的請求。但是時間戳在重放的時候還是有被篡改的風險,所以就需要引入下一個參數sign來保證參數的真實性。

sign是所有參數的簽名值,是所有參數值參與hash計算產生的,參數每變動一點,sign都需要重新生成,借此保證參數的真實性。常用的一套算法是:根據參數key的字母序,將參數value進行排序,并且使用特定的分隔符連接起所有的參數,然后進行hash計算,并將sign參數一同傳遞給服務端。舉個例子,現有參數ak=2222&at=1111&amptimestamp=3333&key1=aaa,根據字母序排序完成后為22221111aaa3333,加入分隔符(|)后為2222(|)1111(|)aaa(|)3333,然后將這個字符串計算sha1,生成sign值。用Python代碼寫的話比較簡單:

Django怎么部署

1.3 一些雜項

除了上面兩個比較重要的點之外,還有一些地方需要額外關注一下。

在生產環境關閉DEBUG模式;

不要將settings.py添加到版本管理中,并且保護好SECRET_KEY;

設置好ALLOWED_HOSTS;

盡可能的使用Django提供的ORM,避免通過.raw()等方法直接執行SQL語句,如果無法避免,一定要將參數正確轉義以避免出現SQL注入漏洞;

盡可能的禁用Django Admin,如果一定需要使用,請修改掉默認的Admin URL;

PART 2. 如何部署

從git上拉下代碼,使用pip安裝項目依賴,通過manage.py運行服務,這一切看起來很美好,可是你真的打算在生產環境中這樣做嗎?

2.1 隔離環境

一般情況下,我們的服務器上都只會有一個Python環境,部署的時候一般都是通過pip來安裝項目所需要的依賴,這些包都會被安裝到全局的site-packages目錄中。

但是當我們部署多個項目的時候,這種安裝依賴的方式很容易出現依賴沖突。舉個簡單的例子,我們現在有Project-A和Project-B兩個項目,A和B都依賴第三方包third-A的不同版本,當我們通過pip install -r requirements-a.txt的時候,依賴third-A被安裝到了全局的Python環境中,當我們再次安裝pip install -r requirements-b.txt的時候,也會再次安裝third-A,這個時候,如果兩個項目依賴的版本不一致,譬如A項目需要1.0版本,而B項目需要2.0版本,就會產生依賴沖突,進而導致安裝依賴失敗。

那么如何解決這個問題呢?我們很容易想到的就是,如果我們有多個互不相干的隔離環境,每個項目部署在一個獨立的環境中,那么這個問題就迎刃而解了。virtualenv正是為了解決這個問題而誕生的,它可以為每個項目創建一個單獨的運行環境,從而避免依賴沖突的問題。

2.2 版本管理

前面我們知道了如何創建隔離環境并且在不同的環境中部署不同的項目,但是這里有個問題,所有環境使用的Python版本是一樣的。如果恰好你需要部署多個不同版本的Python項目,例如Python2.7(我知道這個版本即將不維護了,但是我在這里舉個例子)、Python3.6和Jython項目,一個一個安裝就顯得有些復雜,甚至編譯安裝的時候一不小心少了某個編譯參數而需要重新編譯,都在某種程度上加大了部署工作量。

我們可以通過使用pyenv來管理多個Python版本的問題,進一步通過pyenv的插件pyenv-virtualenv來管理多Python版本、多虛擬環境的問題。

2.3 網關接口

當我們解決了各種環境的問題后,是時候來考慮如何將項目跑起來了,如果你想的是python manage.py runserver 0.0.0.0:80,那就有點太過于簡單了。

Django中已經內置了一個簡單的WSGI實現來供我們通過上述方式啟動Web服務,如果你只是想調試或者只提供服務給幾個人用的小程序,那也不失為一種可選擇的方案,雖然這種方案看上去并不是那么優雅。

如果你真的想將應用部署到實際的生產環境中,那么你還需要一個高性能的WSGI Server,而不是django提供的簡單的WSGI Server。Gunicorn和uWSGI兩種都是比較主流的WSGI Server,根據實際部署環境,從中選擇一個就好。

不過我個人比較偏向于Gunicorn,雖然在眾多的性能測試中uWSGI都占了上風,選擇Gunicorn的理由是它與uWSGI相比十分簡單,沒有非常復雜的極少用到的功能,并且uWSGI中的一些功能已經逐步被Nginx所支持,且Gunicorn配置起來也較為簡單方便。順帶一提,如果你在Windows上部署,你可能需要使用Apache+mod_wsgi。

2.4 反向代理

當我們的WSGI Server啟動就緒后,就要考慮一下反向代理的問題了,之所以前面再擋一層Nginx進行反向代理,有以下幾點原因:

需要Nginx來處理靜態資源。如果你將Django的DEBUG模式設置為False,就會發現很多CSS以及JS等靜態資源加載不到了,這是因為Django并不會主動去處理這些請求,這些都需要Nginx來幫忙處理;

通過Nginx來進行多個backend的負載均衡。如果你的服務部署在多臺服務器上,或是進行了一主一備的部署,這些都可以通過在Nginx上進行簡單的設置來實現;

直接將uWSGI或Gunicorn暴露出來存在一定的安全隱患,使用Nginx處理HTTP的問題會更加方便;

除此之外,還有一些理由就不在此列舉了,還是上面的那句話,如果你的服務很簡單,只有幾個人訪問,是不需要做這么復雜的設置的。

2.5 進程守護

到現在為止,我們的服務已經部署成功了,并且可以開始提供正常的服務了。但是我們少考慮了一點,如果我們的Django不幸因為一些未知的原因退出了,那么我們的Web服務就會變成502了。為了保證服務的穩定性,我們需要對Django進程進行守護,當其出現未知問題而導致異常退出的時候,需要自動將需要的進程拉起來。

我們可以使用supervisor來守護Django進程,保證其穩定存活。但是有一點需要注意,小心不要出現Supervisord的遠程命令執行漏洞,從而造成更大的事故。

PART 3. 后臺服務

通常來講,如果想啟動后臺服務的話,celery是一個萬能的選擇,但是很多時候我們并不想引入這么重的依賴,就需要自己想辦法來啟動后臺服務了。

一個簡單的方法就是做成manage.py的command,通過./manage.py runcommand的方式來啟動我們的后臺服務,并且通過編寫shell腳本控制服務的啟動與停止,或者通過supervisor進行管理。

如果你想讓后臺進程隨著Web服務同時啟動和停止,那么放到wsgi.py中是個不錯的選擇,在wsgi.py中初始化相關的后臺服務,并且啟動。但是這樣的做法不夠靈活,當需要單獨更新Web服務或后臺服務時,需要將二者全部重啟,而采用第一種方式的情況下可以單獨更新其中的某個服務。

以上就是關于“Django怎么部署”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

合肥市| 类乌齐县| 金秀| 临西县| 司法| 汉源县| 琼结县| 松滋市| 鄂州市| 胶州市| 新野县| 铜山县| 密云县| 深水埗区| 肇源县| 福清市| 金坛市| 昌黎县| 贵南县| 青铜峡市| 阿拉善右旗| 合阳县| 桦南县| 社旗县| 南乐县| 正阳县| 连平县| 都昌县| 延寿县| 泊头市| 凌海市| 巴青县| 资源县| 栾川县| 天峨县| 福泉市| 靖江市| 和硕县| 龙游县| 古浪县| 辽阳县|