FLASK
標(biāo)簽(空格分隔): python flask web
[TOC]
計(jì)劃
- [ ] python學(xué)習(xí)
- [ ] 數(shù)據(jù)庫(kù)安裝
- [ ]
架構(gòu)
client(HTTP請(qǐng)求)
模板
JinJa2
模板的簡(jiǎn)單使用
條件語(yǔ)句
{% if xxx%}
{% else %}
{% endif %}
循環(huán)語(yǔ)句
{% for user in users%}
{{user.id}} {{user.name}}
{% endfor %}
模板的繼承
#基類(lèi) base.html文件
<html>
xxxx
{% block content %}
{% end block %}
xxxxx
</html>
#子類(lèi)
{% extends "base.hmtl" %} #擴(kuò)展基類(lèi)
{% block content %} #實(shí)現(xiàn)子類(lèi)獨(dú)有部分
xxx
{% end block %}
class User(object):
def __init__(self, name, id):
self.name = name
self.id = id
from flask import render_template
#module.py文件導(dǎo)入user類(lèi)
from module import User
app = flask(__name__)
@app.route('/user')
def user():
user = User("brezen",1)
return render_template('user_index.html', user=user)
<h1>{{user.name}}</h1>
MVC
module
view
control
Files DB
nginx
nginx是web服務(wù)器
安裝
使用
- 1, 查看狀態(tài)
sudo service nginx status
WSGI
WSGI(python web server getway interface)
定義了web服務(wù)器和web應(yīng)用之間的接口規(guī)范
clinet<----------->server<=WSGI=>APP
FLASK框架就是一個(gè)WSGI的app應(yīng)用
WSGI Server有哪些:
比如 Flask,webpy,Django、CherryPy 都帶著 WSGI server 。當(dāng)然性能都不好,自帶的web server 更多的是測(cè)試用途, 發(fā)布時(shí)則使用生產(chǎn)環(huán)境的 WSGI server或者是聯(lián)合nginx做uwsgi 。
常用的WSGI服務(wù)器器
- Gunicorn
- uWSGI
- CherryPy
- Tornado
- Gevent
- mod_wsgi
gunicorn
flask 自帶的服務(wù)器,完成了 web 服務(wù)的啟動(dòng)。生產(chǎn)環(huán)境下,flask 自帶的 服務(wù)器,無(wú)法滿足性能要求。我們這里采用 gunicorn 做 wsgi容器,用來(lái)部署 python。
前端Nginx負(fù)載,幾個(gè)核就跑幾個(gè)Gunicorn進(jìn)程,gunicorn相對(duì)后面的app又可以給出幾個(gè)進(jìn)程。
virtualenv
解決問(wèn)題:
1,python版本問(wèn)題
2,依賴(lài)問(wèn)題
3,權(quán)限問(wèn)題
linux系統(tǒng)權(quán)限要求高,安裝文件比較麻煩,但是
安裝
sudo pip install virtualenv
創(chuàng)建虛擬環(huán)境
virtualenv venv(名字,隨便寫(xiě)的)
啟動(dòng)虛擬環(huán)境
source venv/bin/activate
關(guān)閉虛擬環(huán)境
deactivate
POSTMAN
測(cè)試HTTP方法
supervisor
管理多個(gè)python web app應(yīng)用,一個(gè)部署在80端口,另外一個(gè)部署在81端口。
安裝
sudo apt-get install supervisor
使用
- 1,通過(guò)配置文件,啟動(dòng)應(yīng)用程序
總的配置文件在/etc/supervisor目錄下,這個(gè)文件通過(guò)包含
/etc/supervisor/conf.d/*.conf
#配置文件內(nèi)容
#應(yīng)用名稱(chēng)
[program: app]
#應(yīng)用命令行
###############通過(guò)python 啟動(dòng)py應(yīng)用
command = python /home/sbin/xxx.py
supervisor配置說(shuō)明
注意:如果有多個(gè)應(yīng)用,可以在目錄下增加多個(gè)conf文件
- 2,使用supervisoctrl控制臺(tái),控制應(yīng)用程序
- 3, 啟動(dòng)supervisor
sudo service supervisor start
- 4,進(jìn)入supervisorctl控制臺(tái)
sudo supervisorctl
會(huì)列出啟動(dòng)的app
#啟動(dòng)應(yīng)用程序
start app
#停止應(yīng)用程序
stop app
#查看應(yīng)用程序狀態(tài)
status
http://local/user?id=xxx
request.args.get('id')
反向路由
from flask import Flask, request, url_for
##視圖
@app.route('/query_user')
##視圖函數(shù)
def query_user():
id = request.args.get('id')
@app.route('query_url')
def query_url():
###反向路由
return 'query_url' + url_for('query_user')
安裝應(yīng)用依賴(lài)包
pip install -r requiment.txt
注意:這個(gè)依賴(lài)包不是指webserver工具或者db工具,而是應(yīng)用依賴(lài)的一些庫(kù)文件。
pip list 查看已經(jīng)安裝的庫(kù)
部署步驟
安裝
vitualenv, supervisor, db,
創(chuàng)建虛擬環(huán)境
激活虛擬環(huán)境
配置nginx服務(wù)器
在/etc/nginix/sites.avaliable下創(chuàng)建配置文件
在/etc/nginix/sites.enable下創(chuàng)建配置文件的軟連接
啟動(dòng)ngnix服務(wù)器
sudo service ngnix reload
如果啟動(dòng)失敗,可以查看ngnix服務(wù)器的日志
配置supervisor
因?yàn)樵谔摂M環(huán)境中,所以配置命令有所改變,通過(guò)虛擬命令來(lái)啟動(dòng)
command = /home/sbin/Todo/venv/bin/gunicorn b 127.0.0.1:9000
其中`/home/sbin/Todo/venv/`表示用戶啟用的虛擬環(huán)境的路徑
進(jìn)入supervisorctl控制臺(tái)啟動(dòng)程序
部署flasky
安裝virtualenv
安裝supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默認(rèn)配置文件
安裝gunicorn
gunicorn -w4 manage:app
安裝nginx
配置nginx
/etc/sites-avaliable下新建一個(gè)配置文件
并建立配置文件的軟連接到/etc/nginx/site-enable/目錄下
啟動(dòng)nginx
sudo service nginx start
sudo service nginx reload
查看啟動(dòng)錯(cuò)誤日志
/var/log/nginx/error.log
CGI
客戶端(提交表單請(qǐng)求)------>服務(wù)器
服務(wù)器<--------------------->外部程序
(服務(wù)器和外部程序交互完成,生成一個(gè)新的HTML)
客戶端<---------------------服務(wù)器(將新的HTML返回給客戶端)
以上這個(gè)過(guò)程發(fā)生在服務(wù)器CGI(common gateway interface)接口上的。
bluePrint(藍(lán)圖)
為什么要使用藍(lán)圖
- 1,程序模塊化
- 2,集中注冊(cè)入口,統(tǒng)一管理
- 3,每個(gè)模塊可以統(tǒng)一使用各自URL前綴
- 4,每個(gè)模塊可以使用各自的模板
如果所有的路由都放到一起,那么對(duì)于大型程序來(lái)說(shuō),將面臨以下問(wèn)題:
- 1)一般情況下,前臺(tái)和后臺(tái)用兩套模板?;蛘咄ㄋ椎闹v,前臺(tái)費(fèi)力弄得好看點(diǎn),后臺(tái)反正自己用,能用就成,丑點(diǎn)無(wú)所謂。那么怎么讓前臺(tái)和后臺(tái)用兩套模板?
- 2)后臺(tái)部分邏輯比前臺(tái)復(fù)雜,還需要導(dǎo)入新的包,如果和前臺(tái)寫(xiě)在一個(gè)文件里,后面修改會(huì)不會(huì)容易出錯(cuò),例如本來(lái)改后臺(tái)部分結(jié)果牽連前臺(tái)出問(wèn)題?
- 3)既然Python力求簡(jiǎn)潔,那代碼能否再簡(jiǎn)潔些?比如新增的路由參數(shù) /admin 重復(fù)寫(xiě)了4遍,能不能對(duì)后臺(tái)定義一個(gè)前綴,后臺(tái)部分的自動(dòng)加這個(gè)/admin ?
- 4)如果這個(gè)博客程序需要多人來(lái)維護(hù),多人編輯同一個(gè)文件去提交時(shí)沖突如何解決?
問(wèn)題4,import …… ,這樣不就模塊化了?
網(wǎng)站
FLASK主頁(yè)
KT-WEB個(gè)人開(kāi)發(fā)的網(wǎng)站
Flasky圖靈圖書(shū)里的例子
flask中文學(xué)習(xí)網(wǎng)
Virtualenv+Gunicorn+Supervisor+Nginx環(huán)境搭建
環(huán)境部署,詳細(xì)說(shuō)明
bluePrint