• 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+' ')
        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;
    }
    }
  • 相关阅读:
    python处理excel文件
    Python datetime模块
    OrderedDict 有序字典以及读取json串时如何保持原有顺序
    ansible 学习笔记
    nginx的location和rewrite
    实体机重装系统
    热词
    教育
    生活
    1、两数之和
  • 原文地址:https://www.cnblogs.com/nopnog/p/7028261.html
Copyright © 2020-2023  润新知