Flask

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

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

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

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