Python Flask

本章內容:css

 

 

 Flask 基本應用

 

from flask import Flask,render_template,request,redirect,session
import time
import subprocess


app = Flask(__name__)
app.secret_key='abcdefghigklmnopgistuvwxyz'

#直接用render_template來渲染html,能夠傳遞一下變量到html文件中
@app.route('/')
def index():
    return render_template('index.html')

#若是是打開login目錄,第一次是get,那就返回login.html
#若是已經打開了,輸入信息登陸,那就是post,會針對用戶名和密碼來判斷
@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        user = request.form.get('username')
        pwd = request.form.get('pwd')
        if user and pwd:
            if user == 'admin' and pwd == 'admin':
                #用seesion來記錄是那個用戶登陸的,
                session['user'] = 'admin'
                #302重定向
                return redirect('/userlist')
            else:
                #用來判斷用戶名和密碼是否正確
                with open('a.txt','r') as foo:
                    for line in foo.readlines():
                        #這裏有個strip,測試中有個這個問題,pwd匹配不上
                        if user == line.split(':')[0] and pwd == line.split(':')[1].strip():
                            session['user'] = user
                            return redirect('/nomaluserlist')
                    return '----------------------- not correct!!!'
                          
        else:
            return 'you need input your username or passwd!!!!!!!!!!!!!!'

@app.route('/logout')
def logout():
    #刪除session
    del session['user']
    return redirect('/login')

@app.route('/userlist')
def userlist():
    #產看登陸的用戶session
    print session.get('user')
    if session.get('user') == None:
        return 'please login first!!'
    
    userlist = []
    with open('a.txt') as f:
        for line in f:
            userlist.append(line.split(':'))
        #告知html端session的信息
        return render_template('userlist.html',userxxx=userlist,user=session.get('user'))

@app.route('/nomaluserlist')
def nomaluserlist():
    print session.get('user')
    if session.get('user') == None:
        return 'please login first!!'
    else:
        userlist = []
        with open('a.txt') as f:
            for line in f:
                userlist.append(line.split(':'))
            return render_template('nomaluserlist.html',userxxx=userlist,user=session.get('user'))

@app.route('/adduser',methods = ['GET','POST'])
def adduser():
    print session.get('user')
    print '*'*50
    #if session.get('user') != 'admin':
    #    return 'you need login or not allowed this user'
    if request.method == 'GET':
        return render_template('adduser.html')
    elif request.method =='POST':
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        with open('a.txt','a') as f:
            f.write(user+':'+pwd+'\n')
    return redirect('/userlist')

@app.route('/deleteuser/',methods=['GET','POST'])
def deleteuser():   #刪除用戶
    user = request.args.get('user', '')
    print user
    print '*'*50
    with open("a.txt","r") as f:
        lines = f.readlines()
        #print(lines)
    with open("a.txt","w") as f_w:
        for line in lines:
            if user in line:
                continue
            f_w.write(line)
    return redirect('/userlist')

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=7799,debug=True)

 

連接mysql

鏈接數據庫的5個步驟html

    conn = MySQLdb.connect(host=DB_HOST, port=DB_PORT, user=DB_USER, passwd=DB_PASSWD, db=DB_DBNAME, charset=DB_CHARSET)
    cur = conn.cursor()
    cur.execute(SQL_USER_UPDATE, (clazz, tel, addr, age, uid))
    conn.commit()
    cur.close()
    conn.close()


con.autocommit(True) #能夠添加這一行,自動提交修改的內容到數據庫

 

pip 配置

  使用豆瓣的源python

 vim /etc/pip.conf 

[global]                                                                                                                                                     
trusted-host = pypi.douban.com 
index-url = http://pypi.douban.com/simple 

[list]
format=columns

  pip 批量安裝包mysql

  把報的名字寫入一個py的文件中(requirement.py)nginx

  pip install -r requirement.pyweb

 

Flast的多進程啓動

  nginx + gunicorn + supervisor + flasksql

  nginx+gunicorn+flask數據庫

  gunicorn w4 -b 0.0.0.0:33333 flask_web:appflask

如今咱們使用 flask 自帶的服務器,完成了 web 服務的啓動。生產環境下,flask 自帶的 服務器,沒法知足性能要求。咱們這裏採用 gunicorn 作 wsgi容器,用來部署 python。

1:安裝 gunicorn

 pip install gunicorn

2:單py文件的啓動方式

當咱們安裝好 gunicorn 以後,須要用 gunicorn 啓動 flask,注意 flask 裏面的__name__裏面的代碼啓動了 app.run(),這個含義是用 flask 自帶的服務器啓動 app。
這裏咱們使用了 gunicorn,myapp.py 就等同於一個庫文件,直接被 gunicorn 調用即下面__name__部分就能夠不用了。
 gunicorn -w4 -b0.0.0.0:8000 myapp:app -D
此時,咱們須要用 8000 的端口進行訪問,原先的5000並無啓用。其中 gunicorn 的部署中
-w 表示開啓多少個 worker,
-b 表示 gunicorn 開發的訪問地址。
myapp 表示包含Flask(__name__) 對象的模塊或者包
app 表示實例化Flask(__name__) 的對象
-D 在後臺運行

3:包結構和藍圖結構的啓動方式(以包結構爲例)
A:項目目錄結構
$ tree
.
├── app
│ ├── admin.py
│ ├── __init__.py
│ ├── static
│ │ └── test.css
│ ├── templates
│ │ ├── admin.html
│ │ └── views.html
│ └── views.py
├── config.py
├── requirement.py
└── run.py
啓動文件
cat run.py
from app import app

if __name__=="__main__":
app.run(host='0.0.0.0',port=9898,debug=True)

包文件
$ cat app/__init__.py
from flask import Flask

app = Flask(__name__)

import views,admin

視圖文件
cat app/views.py
from flask import render_template
from . import app

@app.route('/views')
def views():
return render_template('views.html')

B:flask開發模式下的啓動方式
python run.py

C: gunicorn啓動
gunicorn -w4 -b0.0.0.0:8089 app:app
gunicorn -w4 -b0.0.0.0:9090 app:app --access-logfile /tmp/gunicorn.log --error-logfile /tmp/gun_error.log -D


備註:
第一個app: 表示app這個包名
第二個app: 表示app包中 Flask(__name__)實例化的對象


四:安裝 supervisor

上面想要結束 gunicorn 只需執行 pkill gunicorn,有時候還的 ps 找到 pid 進程號才能 kill。但是這對於一個開發來講,太過於繁瑣,所以出現了另一個神器---supervisor,一個專門用來管理進程的工具,還能夠管理系統的工具進程。
pip install supervisor
echo_supervisord_conf > supervisor.conf   # 生成 supervisor 默認配置文件
vim supervisor.conf                       # 修改 supervisor 配置文件,添加 gunicorn管理 
在myapp supervisor.conf 配置文件底部添加
[program:myapp]
command=/home/lzp/venv/bin/gunicorn -w4 -b0.0.0.0:8000 myapp:app    ;supervisor啓動命令
directory=/home/lzp/myproject                                       ;項目的文件夾路徑
startsecs=0                                                         ; 啓動時間
stopwaitsecs=0                                                      ; 終止等待時間
autostart=false                                                     ; 是否自動啓動
autorestart=false                                                   ; 是否自動重啓
stdout_logfile=/tmp/myproject/log/gunicorn.log                      ; 平常輸出日誌
stderr_logfile=/tmp/myproject/log/gunicorn.err                      ; 錯誤日誌 
supervisor的基本使用命令
supervisord -c supervisor.conf                             經過配置文件啓動supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的狀態
supervisorctl -c supervisor.conf reload                    從新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     啓動指定/全部 supervisor管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname]      關閉指定/全部 supervisor管理的程序進程 
supervisor 還有一個web的管理界面,能夠激活。更改下配置
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))

如今可使用 supervsior 啓動 gunicorn啦。
運行啓動命令 supervisord -c supervisor.conf
訪問 http://127.0.0.1:9001 能夠獲得 supervisor的web管理界面,
訪問 http://127.0.0.1:2170 能夠看見gunciron 啓動的返回的 hello world
五:安裝配置 nginx代理

server {
listen 80;
server_name www.xxx.com
location /static {
alias /usr/local/www.xxxx.com/static;
}
location / {
proxy_pass http://127.0.0.1:9001;
}
}
相關文章
相關標籤/搜索