flask上传文件及上传zip文件实例

from flask import Flask, render_template, redirect, session, request
from flask_session import Session
import redis
import pymysql
import os
from werkzeug.utils import secure_filename
import functools
import shutil
import datetime
import time
base_dir  = os.path.abspath(os.path.dirname(__file__)) # 获取当前项目路径
print(base_dir)
ALLOWED_EXTENSIONS = set(['zip'])#允许文件上传的格式


app = Flask(__name__)
# 设置上传文件的路径
app.config['UPLOAD_FOLDER'] = base_dir

def allowed_file(filename): # 判断上传文件的格式
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

# session 存储到redis中
app.config['SESSION_TYPE'] = 'redis'
# 建立redis连接
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)
# session存储到redis注册到flak中
Session(app)
# 建立pymysql连接
db = pymysql.connect(host="localhost", user="root", db="day118", port=3306)
# 使用cursor()方法创建一个游标对象
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

# 登录装器

def auth(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        if not session['user']:
            return redirect('login')
        ret = func(*args, **kwargs)
        return ret

    return inner


@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    sql = "select * from user where user='" + user + "'and pwd='" + pwd + "'"
    cursor.execute(sql)

    # 使用fetchall()获取全部数据
    data = cursor.fetchall()
    print(data)
    if data:
        session['user'] = user
        return redirect('index')
    return render_template('login.html', error='用户名或密码错误')


@app.route('/index')
def index():
    cursor.execute("SELECT * FROM user")
    user=session.get('user')
    # 使用fetchall()获取全部数据
    data = cursor.fetchall()

    return render_template('index.html', data=data,user=user)


@app.route('/detail/<nid>')
def detail(nid):
    cursor.execute(
        "select detail.id,detail.user_id ,user.name,detail.data,detail.lens from detail inner join user on detail.user_id = user.id WHERE detail.user_id='" + nid + "'")
    # 使用fetchall()获取全部数据
    data = cursor.fetchall()

    print(data)
    if data:
        return render_template('detail.html', data=data)
    return redirect('index')


@app.route('/upload',methods=['POST','GET'])
@auth
def upload():
    if request.method=='POST':
        file = request.files.get('files')

        print(file.filename)
        print(file.filename.rsplit('.')[-1])
        if file.filename.rsplit('.')[-1] not in ['zip',]:
            path=os.path.join(base_dir,file.filename)
            with open(path,'w')as f:
                for line in file:
                    f.write(line.decode('utf-8'))
            with open(path,'rb')as f:
                count=0
                while True:
                    line = f.readline()
                    if line:
                        count+=1
                    else:
                        break
            print(count)
            sql='select id from user where user.user="'+session.get('user')+'"'
            cursor.execute(sql)
            data = cursor.fetchall()
            print(data[0])
            ctime=datetime.datetime.now()
            cursor.execute("INSERT into detail(user_id,lens) VALUES('"+str(data[0]['id'])+"','"+str(count)+"')")

            db.commit()

        # 处理压缩文件
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 压缩文件保存在项目路径下
            local_dir = os.path.join(base_dir, '11')  # 新创建一个路径,用来放压缩后的文件
            hh = os.path.join(base_dir, filename)  # 这个是找到压缩文件路径-------C:/Code/haha.zip
            print(hh)
            print(local_dir)
            shutil.unpack_archive(filename=hh, extract_dir=local_dir)# 把文件保存在刚刚设定好的路径下

            os.remove(hh) # 最后把压缩文件删除

            filename = filename.split('.')[0]
            print(filename)  # 此处为验证信息
            host_path = os.path.join(local_dir, filename+'.py')  # host.txt的路径
            print(host_path)
            with open(host_path, 'r',encoding='utf-8') as f:  # 把host文件打开
                key, values = [i.replace('\n', '').split(',') for i in f.readlines()]  # 列表推倒式,生成一个由键组成的列表,一个由值组成的列表
                hostvalue = dict(zip(key, values))  # 把两个列表组成字典
                print(hostvalue)
            ip = hostvalue['host_os_ip']  # 开始读取里面的信息
            systemname = hostvalue['host_database_bussines']
            databasename = hostvalue['host_database_instance']
            uploadtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            print(ip, systemname, databasename, uploadtime)


    return render_template('upload.html')


if __name__ == '__main__':
    app.run()

 第二版

from flask import Blueprint, render_template, Flask, request, redirect,session
import os
import uuid
from ..utils import helper


ind = Blueprint('ind', __name__)

@ind.before_request
def process_request():
    if not session.get("user_info"):
        return redirect("/login")
    return None


@ind.route('/home')
def home():
    return render_template('home.html')

@ind.route('/user_list')
def user_list():
    # import pymysql
    # conn = pymysql.Connect(host='127.0.0.1', user='root', password='123456', database='s9day118', charset='utf8')
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # cursor.execute("SELECT id,user,nickname FROM userinfo")
    # data_list = cursor.fetchall()
    # cursor.close()
    # conn.close()
    data_list = helper.fetch_all("SELECT id,user,name FROM user",[])

    return render_template('user_list.html',data_list=data_list)

@ind.route('/detail/<int:nid>')
def detail(nid):
    # import pymysql
    # conn = Config.POOL.connection()
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # cursor.execute("SELECT id,line,ctime FROM record where user_id=%s",(nid,))
    # record_list = cursor.fetchall()
    # cursor.close()
    # conn.close()
    record_list = helper.fetch_all("SELECT id,lens,data FROM detail where user_id=%s",(nid,))

    return render_template('detail.html',record_list=record_list)

@ind.route('/upload',methods=['GET','POST'])
def upload():
    if request.method == "GET":
        return render_template('upload.html')
    from werkzeug.datastructures import FileStorage
    file_obj = request.files.get('code')

    # 1. 检查上传文件后缀名
    name_ext = file_obj.filename.rsplit('.',maxsplit=1)
    if len(name_ext) != 2:
        return "请上传zip压缩文件"
    if name_ext[1] != 'zip':
        return "请上传zip压缩文件"

    """
    # 2. 接收用户上传文件,并写入到服务器本地.
    file_path = os.path.join("files",file_obj.filename)
    # 从file_obj.stream中读取内容,写入到文件
    file_obj.save(file_path)

    # 3. 解压zip文件
    import shutil
    # 通过open打开压缩文件,读取内容再进行解压。
    shutil._unpack_zipfile(file_path,'xsadfasdfasdf')
    """

    # 2+3, 接收用户上传文件,并解压到指定目录
    import shutil
    target_path = os.path.join('files',str(uuid.uuid4()))
    shutil._unpack_zipfile(file_obj.stream,target_path)

    # 4. 遍历某目录下的所有文件
    # for item in os.listdir(target_path):
    #     print(item)
    total_num = 0
    for base_path,folder_list,file_list in os.walk(target_path):
        for file_name in file_list:
            file_path = os.path.join(base_path,file_name)
            file_ext = file_path.rsplit('.',maxsplit=1)
            if len(file_ext) != 2:
                continue
            if file_ext[1] != 'py':
                continue
            file_num = 0
            with open(file_path,'rb') as f:
                for line in f:
                    line = line.strip()
                    if not line:
                        continue
                    if line.startswith(b'#'):
                        continue
                    file_num += 1
            total_num += file_num
    
    # 获取当前时间
    import datetime
    ctime = datetime.date.today()
    print(total_num,ctime,session['user_info']['id'])

    # import pymysql
    # conn = pymysql.Connect(host='127.0.0.1', user='root', password='123456', database='s9day118', charset='utf8')
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # cursor.execute("select id from record where ctime=%s and user_id=%s",(ctime,session['user_info']['id']))
    # data = cursor.fetchone()
    # cursor.close()
    # conn.close()
    data = helper.fetch_one("select id from record where ctime=%s and user_id=%s",(ctime,session['user_info']['id']))
    if data:
        return "今天已经上传"


    # import pymysql
    # conn = pymysql.Connect(host='127.0.0.1', user='root', password='123456', database='s9day118', charset='utf8')
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # cursor.execute("insert into record(line,ctime,user_id)values(%s,%s,%s)",(total_num,ctime,session['user_info']['id']))
    # conn.commit()
    # cursor.close()
    # conn.close()
    helper.insert("insert into record(line,ctime,user_id)values(%s,%s,%s)",(total_num,ctime,session['user_info']['id']))

    return "上传成功"

 数据库连接池使用

from DBUtils.PooledDB import PooledDB, SharedDBConnection
import pymysql

class Config(object):
    SALT = b"gadsg"
    SECRET_KEY = 'asdf123sdfsdfsdf'
    MAX_CONTENT_LENGTH = 1024 * 1024 * 7


    POOL = PooledDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
        mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
        maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
        maxshared=3,
        # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
        blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
        maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
        setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
        ping=0,
        # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
        host='127.0.0.1',
        port=3306,
        user='root',
        password='',
        database='day118',
        charset='utf8'
    )

 连接连接池

import pymysql

from settings import Config

def connect():
    conn = Config.POOL.connection()
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    return conn,cursor


def connect_close(conn,cursor):
    cursor.close()
    conn.close()

def fetch_all(sql,args):
    conn,cursor = connect()

    cursor.execute(sql, args)
    record_list = cursor.fetchall()
    connect_close(conn,cursor)

    return record_list


def fetch_one(sql, args):
    conn, cursor = connect()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    connect_close(conn, cursor)

    return result


def insert(sql, args):
    conn, cursor = connect()
    row = cursor.execute(sql, args)
    conn.commit()
    connect_close(conn, cursor)
    return row
View Code

 

posted on 2018-11-17 19:44  咳~  阅读(1572)  评论(0编辑  收藏  举报