Ubuntu Apache 原生Django Angular 開發(fā)與部署

之前做了一個項(xiàng)目,要求用Angular7做前端,Django做后端。

其實(shí)標(biāo)準(zhǔn)做法是用Django RESTful Framework 做后端,Angular寫WebApp。

然而Django是已經(jīng)現(xiàn)成的,因?yàn)橹熬W(wǎng)站是完全用Django+Jquery做的,所以Django是原生的,要改版還有點(diǎn)小麻煩,所以我就想偷偷懶,直接拿原生Django做Angular的后端接口。

Angular的跨域問題已經(jīng)是個老生常談的問題了,在這里就不做介紹了。

但是以下的問題就不是Angular跨域的問題能解決了,因?yàn)镈jango原生自帶的用戶驗(yàn)證是基于session的,原生網(wǎng)站登錄后,可以按F12打開控制臺看見cookie中含有session key。但是由于瀏覽器的安全限制問題,導(dǎo)致如果是跨域請求,那么這個sessionkey會自動被瀏覽器過濾掉,所以就導(dǎo)致了angular登陸無限失敗。

那么怎么辦呢,苦思冥想后,突然,我發(fā)現(xiàn)在做Angular開發(fā)測試運(yùn)行的時候,可以把npm命令修改,使得后臺地址強(qiáng)行與Angular地址拉在一起,也就是代理。那么既然測試環(huán)境可以做代理,那我想Apache也可以做反向代理。話不多說,上Apache的配置文件代碼:

首先你需要在/etc/apache2/ports.conf 中添加一行,使apache可以監(jiān)聽兩個端口,我這里開的是79端口:


# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Listen 79

然后關(guān)鍵的配置來了,在/etc/apache2/sites-available 文件夾中新建一個文件,我這邊就取名django.conf啦,配置如下:

<VirtualHost *:80>
    DocumentRoot 你的angular路徑
    <Directory 你的angular路徑>
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
    ProxyPass /api http://localhost:79/
    ProxyPassReverse /api http://localhost:79/
</VirtualHost>
<VirtualHost *:79>
    DocumentRoot 你的django路徑
    WSGIDaemonProcess FrontEnd processes=6 threads=2 python-path=你的django路徑
    WSGIProcessGroup FrontEnd
    <Directory 你的django路徑>
        Require all granted
    </Directory>
    Alias /static/ 你的django路徑/store/static/
    WSGIScriptAlias / 你的django路徑/web_settings/wsgi.py
</VirtualHost>

到此部署配置就差不多快完成了,接著輸入:

a2ensite django.conf;\
service apahce2 restart;

應(yīng)用你的配置并重啟apache服務(wù),這樣就完成了所有的部署。
當(dāng)然了,要做這個配置需要啟動apahce的proxy功能,大家可以看一下配置文件
可以看到,我用79端口配置了一個虛擬主機(jī),發(fā)布了Django項(xiàng)目。然后用80端口配置了一個虛擬主機(jī),發(fā)布了Angular項(xiàng)目,同時在這個Angular虛擬主機(jī)上配置了反向代理ProxyPass,設(shè)置/api這個路徑自動轉(zhuǎn)發(fā)給Django的虛擬主機(jī),所以在Angular項(xiàng)目中應(yīng)該避免有/api這個路由配置才能使這個配置生效,當(dāng)然了“/api”這個轉(zhuǎn)發(fā)路徑是可以自定義的,大家可以根據(jù)自己的情況自己改名字。

反思(優(yōu)缺點(diǎn)):
優(yōu)點(diǎn):
可以完全規(guī)避Angular跨域的問題,Django可以不用設(shè)置跨域允許,Angular同樣也不需要設(shè)置跨域頭。因?yàn)锳pache的反向代理已經(jīng)強(qiáng)行將Django和Angular拉在了一個域里;自然而然,瀏覽器的跨域安全規(guī)則也就對這樣的部署方式無效了,原生Django做API的后臺驗(yàn)證的Session key可以正常傳給Angular前臺。

缺點(diǎn):
由于做了反向代理的操作,所以在高并發(fā)性能方面可能要大打折扣了,不過Django本來就不是用來處理高并發(fā)的框架,它本身是用來做管理系統(tǒng)的,所以這個缺點(diǎn)似乎可以忽略。
配置可能麻煩了點(diǎn),做成Dockerfile或者.sh可執(zhí)行配置文件會好一點(diǎn)應(yīng)該。

這是開發(fā)過程中的奇思妙想,有不中聽的不專業(yè)的還請各位海涵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 很多人反應(yīng)很難訪問 Github Page,所以 ng-alain.com 轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整...
    cipchk閱讀 4,184評論 1 14
  • 1.Linux下如何用命令查看實(shí)時日志(完整命令) tail -f 路徑.log查看前多少行 tai-200f 路...
    qianyewhy閱讀 2,558評論 0 11
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,778評論 0 5
  • 近年來,素有“六國五味”“眾香之首”的沉香,因其迷人的香味與稀少的數(shù)量,價格越漲越高。而近日,卻有香友咨詢,自己入...
    沉香文化閱讀 1,552評論 0 0
  • 一、浮動布局1.給兒子加上float:left2.給父元素加clearfix時刻記住這一點(diǎn)??! 二、flex布局1...
    阿龍喲閱讀 719評論 0 0

友情鏈接更多精彩內(nèi)容