1-1 主要內(nèi)容
? Django項目部署
? uwsgi部署
? uwsgi+nginx部署
? uwsgi + nginx 分布式項目部署
? tornado快速入門
1-2 課程內(nèi)容
- Django項目部署-uwsgi
a. 確定遠程主機IP地址,登錄賬號,登錄密碼
FTP登錄賬號+密碼
SSH遠程終端登錄賬號+密碼
工作環(huán)境:申請 [郵件申請-> 上級-> 審批回復(fù)郵件(賬號密碼-使用時限)]
b. 確定遠程主機軟件環(huán)境(項目環(huán)境)
python 是否安裝配置完成
django模塊是否安裝配置完成
mysql數(shù)據(jù)庫是否安裝配置完成
確定項目中使用的第三方模塊是否安裝配置完成
(一般情況下,遠程主機中,創(chuàng)建一個給予系統(tǒng)的虛擬環(huán)境,虛擬環(huán)境中運行項目)
新項目部署:以上環(huán)境中的軟件和模塊的版本號,要和開發(fā)環(huán)境一致!
遺留項目更新:一定要確保開發(fā)環(huán)境使用的軟件版本和生產(chǎn)環(huán)境一致!
c. uwsgi項目部署
確認uwsgi是否安裝成功[uwsgi是python的一個模塊]
如果沒有安裝-> pip3 install uwsgi
d. 上傳項目,部署web app
FTP上傳已經(jīng)打包壓縮好的web項目
在服務(wù)器上解壓縮,檢查項目的完整性
e. 創(chuàng)建對應(yīng)的數(shù)據(jù)庫,同步數(shù)據(jù)模型對應(yīng)的數(shù)據(jù)表
初始化導(dǎo)入需要的數(shù)據(jù)
f. 命令行運行django項目
收集Django項目靜態(tài)文件
uwsgi --http=ip:port --file=wsgi_path --static-map=/static=..
問題:命令行盡管方便,但是每次項目啟動操作都比較繁瑣,同時啟動的這個窗口不能關(guān)閉,盡管可以使用[命令 &]后臺執(zhí)行命令
g. 配置所有需要的選項,通過配置文件啟動uwsgi服務(wù)器[推薦使用]
uwsgi官方網(wǎng)站
- uwsgi+nginx項目部署【推薦】
uwsgi:部署web app
nginx:反向代理、靜態(tài)文件服務(wù)器
修改uwsgi配置文件-> nginx反向代理 [nginx接受請求-> 傳遞-> uwsgi]
http=..--> socket=..
為了保證項目的訪問安全性,IP地址-> 本機地址
[uwsgi]
socket=127.0.0.1:800
chdir=..
wsgi-file=..
master=..
proceses=..
static-map=.. 注釋掉靜態(tài)文件映射-> 靜態(tài)文件的操作交由nginx進行處理
確認服務(wù)器是否安裝了 nginx-> apt-get install nginx
下載nginx源代碼(nginx.tar.gz)->解壓->make & make install
修改nginx配置文件:/etc/nginx/nginx.conf
添加虛擬服務(wù)器配置[server]
添加反向代理路由配置[location – uwsgi_pass ]
添加靜態(tài)文件服務(wù)路由配置[location – alias ]
重啟nginx
備注:nginx對于靜態(tài)文件的處理優(yōu)于uwsgi
uwsgi對于動態(tài)請求的操作非常優(yōu)秀[nginx反向代理讓uwsgi處理動態(tài)請求]
- uwsgi+nginx分布式部署
并發(fā)請求數(shù)據(jù)特別巨大情況下,第二種部署方式就不一定滿足!
此時就需要分布式項目部署操作
? 單服務(wù)器模式[偽分布式]
uwsgi改造
將uwsgi的接受請求的方式,修改為http方式[nginx反向代理->請求分發(fā)]
[uwsgi]
http=127.0.0.1:8000
..
nginx配置配置靜態(tài)文件服務(wù)器
location /static {
alias /home/damu/work/shopping/static_file;
}
負載均衡
upstream myweb {
server ip:port;
server ip:port;
..
}
location / {
proxy_pass http://myweb;
}
備注:默認情況下,nginx的負載均衡,請求輪詢分發(fā)給所有后端服務(wù)器
? 多服務(wù)器模式[分布式集群]
tornado web framework
項目場景:Django程序員
項目:tornado 開發(fā)[小白]-mysql->web
項目經(jīng)理:一周[熟悉技術(shù) + 需求分析]
目標(biāo):tornado開發(fā) web項目
web項目的要求:
成型的MVC模式——hello world!
路由怎么定義?
視圖請求怎么處理?
數(shù)據(jù)模型怎么定義?
網(wǎng)頁模板怎么操作?
靜態(tài)文件怎么操作?
網(wǎng)頁參數(shù)->傳遞->視圖處理函數(shù)/類?
視圖處理函數(shù)/類-> 數(shù)據(jù)-> 網(wǎng)頁 展示?
會話跟蹤/狀態(tài)保持:session/cookie怎么操作?
表單操作?
緩存操作?
數(shù)據(jù)庫怎么支持?
學(xué)習(xí)計劃:
tornado是個什么東西?有什么優(yōu)勢?[簡單了解]
程序結(jié)構(gòu),入門程序開發(fā)[hello world]?
網(wǎng)頁-路由-視圖處理
多個路由配置
視圖處理
網(wǎng)頁、靜態(tài)文件放置
參數(shù)傳遞,渲染
表單操作
數(shù)據(jù)模型定義
數(shù)據(jù)庫操作
緩存支持
more..
重要:怎么開始[對比熟悉的技術(shù)Django]
首先了解官方文檔、社區(qū)重要資料
中文文檔——[深入淺出\快速入門\從入門到精通..]
其次:開發(fā)一個入門程序
了解整個框架開發(fā)web app整體結(jié)構(gòu)
第三:開始了解每個步驟的細節(jié)操作
第四:開發(fā)簡單案例項目——攝影、博客
第一步:了解官方文檔和中文文檔
tornado是一個web框架:封裝了web開發(fā)的基本流程處理
tornado是一個非阻塞式的異步IO高性能服務(wù)器,可以部署web項目
? tornado開發(fā)的web項目,就可以直接部署到tornado服務(wù)器中。
import tornado.web
import tornado.ioloop
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write('<h1>hello tornado!</h1>')
def main():
app = tornado.web.Application([
(r'/', IndexHandler)
])
return app
if name == "main":
app = main()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
- tornado核心處理模塊
tornado.web
tornado.ioloop - 視圖處理:類型
自定義視圖處理類:繼承tornado.web.RequestHandler - 請求處理:視圖處理類中的函數(shù):重寫父類RequestHandler中的函數(shù):具備了處理請求的功能
def get(self): .. 處理get請求
def post(self): .. 處理post請求 - web應(yīng)用程序定義[web application]
tornado中,將開發(fā)人員自己開發(fā)的代碼,封裝在tornado.web.Application中創(chuàng)建一個web應(yīng)用程序
app = tornado.web.Application() # 創(chuàng)建web應(yīng)用程序 - 路由定義
通過創(chuàng)建的web應(yīng)用程序,添加url地址和視圖處理類之間的映射配置-> 路由
app = tornado.web.Application([
(r’/’, IndexHandler) # 定義了請求路徑 / 和視圖處理類 IndexHandler之間的映射
]) - 將web項目,部署到web服務(wù)器中
tornado有內(nèi)置的web服務(wù)器[非阻塞式的異步IO的高性能的web服務(wù)器]
直接可以使用,推薦tornado應(yīng)用程序,最好部署到tornado服務(wù)器中,體現(xiàn)最優(yōu)雅的性能處理
app.listen(8000)-> 部署 + 監(jiān)聽 - 啟動項目
tornado.ioloop.IOLoop.curent().start()
啟動項目-> 啟動IO事件輪詢監(jiān)聽[like unix:epoll like bsd: kqueue]提升服務(wù)器處理性能
tornado vs Django
服務(wù)器性能處理:tornado >> Django
項目開發(fā)效率:Django >> tornado
業(yè)務(wù)數(shù)據(jù)處理:tornado == Django 【業(yè)務(wù)處理模式】
網(wǎng)絡(luò)限制
項目開發(fā):Django > tornado
開發(fā)效率[成本-利潤-性能]
tornado性能 > Django
2. tornado網(wǎng)頁模板和靜態(tài)文件處理
分離架構(gòu) | 耦合架構(gòu)
分離架構(gòu):前端開發(fā)[HTML/CSS/JS]和后端[Python/Java/Php/C#..]
前端和后端數(shù)據(jù)交互:Ajax 異步JSON數(shù)據(jù)交互(xml數(shù)據(jù))
耦合架構(gòu):前端設(shè)計開發(fā)[HTML/CSS/JS/后端提供模板語言(渲染數(shù)據(jù))]
[JAVA-jsp | Python-模板語言DTL/Jinja..]
耦合架構(gòu):前端網(wǎng)頁展示、靜態(tài)文件加載
網(wǎng)頁模板:
在自己的項目中,創(chuàng)建一個任意名稱的文件夾專門用于存放各種網(wǎng)頁文件,但是項目中一般推薦使用templates/作為文件夾的名稱
在Application配置中,添加一個網(wǎng)頁文件夾的定義配置
template_path=os.path.join(os.path.dirname(file), ‘templates’),
在視圖處理類的請求處理函數(shù)中,就可以通過self.render()渲染展示網(wǎng)頁
self.render(‘index.html’) 表示從templates/文件夾中查詢index.html
靜態(tài)文件:
在自己項目中,創(chuàng)建一個任意名稱的文件夾專門用于存放各種靜態(tài)文件[css/images/js/fonts/..],項目中一般推薦static/作為文件夾的名稱
在Application配置中,添加一個靜態(tài)文件位置的定義配置
static_path=os.path.join(os.path.dirname(file), ‘static’)
在其他網(wǎng)頁中,就可以直接通過路徑進行引入
<link rel=’stylesheet’ href=’/static/css/index.css’/>
http://demo.pythoner.com/itt2zh/index.html
3.參數(shù)操作
--| 視圖處理類中,處理完數(shù)據(jù)[和數(shù)據(jù)庫交互完成后的數(shù)據(jù)]傳遞給前端網(wǎng)頁進行展示
--| 前端網(wǎng)頁中,通過超鏈接、表單、Ajax提交數(shù)據(jù)給后端程序,后端程序接受數(shù)據(jù)
(1) 后端程序中的數(shù)據(jù),傳遞給前端頁面
Django-> 通過字典的形式傳遞數(shù)據(jù),前端網(wǎng)頁中,通過DTL語法進行展示
Tornado-> 后端處理函數(shù)中,直接傳遞關(guān)鍵字參數(shù),將數(shù)據(jù)添加到響應(yīng)中即可
self.render(‘path’, k=v, k1=v1, k2=v2..)
前端網(wǎng)頁中,通過jinja模板語法直接渲染[高度類似DTL模板語法]
DTL:Django template language:Django模板語法
(2) 前端數(shù)據(jù)[超鏈接、表單、Ajax- get/post參數(shù)]
get數(shù)據(jù)
前端網(wǎng)頁:超鏈接、表單、Ajax、RESTful傳遞數(shù)據(jù)
post數(shù)據(jù)
前端網(wǎng)頁:表單、Ajax
后端處理:
self.get_query_argument()獲取GET方式提交的數(shù)據(jù)
self.get_body_argument()獲取POST方式提交的數(shù)據(jù)
self.get_argument()獲取提交的數(shù)據(jù)【在不同的請求處理中接受對應(yīng)的數(shù)據(jù)】
self.get_argumnets()獲取提交的多個數(shù)據(jù)【如:復(fù)選框】
4. 會話跟蹤[cookie(session)]
什么是會話:瀏覽器和服務(wù)器之間一次完成的數(shù)據(jù)交互過程,包含多次請求和響應(yīng)。
會話跟蹤:在瀏覽器客戶端訪問服務(wù)器進行業(yè)務(wù)處理的的過程中,對于重要的數(shù)據(jù)進行臨時存儲記錄,在后續(xù)客戶端的操作過程中提供更加便捷的服務(wù)的過程。會話跟蹤最典型的的應(yīng)用如狀態(tài)保持[登錄狀態(tài)保持,視頻播放進度記錄等等],主要通過存儲在服務(wù)器端的session對象和存儲在客戶端的cookie數(shù)據(jù)完成跟蹤操作。
session:主要是存儲在服務(wù)器空間中,所以一般情況下不要存儲大量數(shù)據(jù)[如果存儲大量數(shù)據(jù)/大型對象,在高并發(fā)的情況下,很容易讓服務(wù)器空間吃緊],一般存儲重要的占用空間比較小的數(shù)據(jù)進行一個簡單的狀態(tài)記錄即可
cookie:主要是存在客戶端計算機中,只能存儲字符串[不能包含中文],存儲的大小也受到限制;一般主要是用來記錄用戶歷史操作重要數(shù)據(jù)。
tornado中操作cookie:
self.set_cookie(name, value, expire_days)
在cookie中存放一個數(shù)據(jù),設(shè)置過期時間[value中不能包含中文和空格]
self.get_cookie(name)
cookie中的數(shù)據(jù):明文顯示——不安全
self.set_secure_cookie(..)
self.get_secure_cookie(..)
tornado中操作session: