之前做了一個項(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è)的還請各位海涵。