本章内容:
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的多进程启动
gunicorn w4 -b 0.0.0.0:33333 flask_web:app
现在我们使用 flask 自带的服务器,完成了 web 服务的启动。生产环境下,flask 自带的 服务器,无法满足性能要求。我们这里采用 gunicorn 做 wsgi容器,用来部署 python。1:安装 gunicorn pip install gunicorn2:单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.pyfrom app import appif __name__=="__main__":app.run(host='0.0.0.0',port=9898,debug=True)包文件$ cat app/__init__.pyfrom flask import Flaskapp = Flask(__name__)import views,admin视图文件cat app/views.pyfrom flask import render_templatefrom . import app@app.route('/views')def views():return render_template('views.html')B:flask开发模式下的启动方式python run.pyC: gunicorn启动gunicorn -w4 -b0.0.0.0:8089 app:appgunicorn -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 supervisorecho_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 通过配置文件启动supervisorsupervisorctl -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 defaultport=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.comlocation /static {alias /usr/local/www.xxxx.com/static;}location / {proxy_pass http://127.0.0.1:9001;}}