Python Flask
本章内容:
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个步骤
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 配置
使用豆瓣的源
vim /etc/pip.conf [global] trusted-host = pypi.douban.com index-url = http://pypi.douban.com/simple [list] format=columns
pip 批量安装包
把报的名字写入一个py的文件中(requirement.py)
pip install -r requirement.py
Flast的多进程启动
nginx + gunicorn + supervisor + flask
gunicorn w4 -b 0.0.0.0:33333 flask_web:app
现在我们使用 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; } }
no pain no gain