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