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

  nginx+gunicorn+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;
}
}

 

posted @ 2017-06-16 16:47  IT小工Joey  阅读(321)  评论(0编辑  收藏  举报