本章內容:css
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)
鏈接數據庫的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) #能夠添加這一行,自動提交修改的內容到數據庫
使用豆瓣的源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
nginx + gunicorn + supervisor + flasksql
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; } }