def remove_token(): #支持两种判断方式 输入邮箱token后验证 #通过邮件里的check标志验证 mail = request.args.get('mail') token = request.args.get('token') check = request.args.get('check') if mail and token: res = database().remove_token(global_config.engine, { "mail": mail, "token": token }) if res: return format_response('ok', '密钥删除成功') else: return format_response('error', '密钥删除失败') elif mail and check: res = database().remove_token(global_config.engine, { "mail": mail, "check": check }) if res: return format_response('ok', '密钥删除成功') else: return format_response('error', '密钥删除失败') else: return format_response('error', '密钥删除失败,信息不全')
def image_delete(): #根据图片的唯一ID删除对应的文件 data = request.json if "namaelist" in data.keys(): database().delete_many(global_config.engine,'image',data["namelist"]) return format_response('ok', '文件删除成功') elif "name" in data.keys(): database().delete(global_config.engine,'image',data["name"]) return format_response('ok','文件删除成功')
def image_list(): #支持按需获取图片列表 用于前端的懒加载 try: token = request.args.get('token') if request.args.get('page'): #分页情况 #默认从第一页开始 if global_config.engine == 'sqlite': try: # pages = count_page(all,global_config.image_page) p = Image.query.paginate(1, 10) #暂未实现 return format_response('ok', 10) except: return format_response('error', '获取图片列表错误') else: pass else: #默认返回全部图片列表 #包含图片总数,计算得到的图片分页数 g.data = [] mail = database().get(global_config.engine, 'token', token) if mail: #仅获取当前用户下的图片列表 if global_config.engine == 'sqlite': img_list = database().get_image_list( global_config.engine, mail) for i in img_list: g.data.append(i.info()) elif global_config.engine == 'mongo': img_list = database().get_image_list( global_config.engine, mail) for i in img_list: g.data.append({ "name": i["name"], "path": i["path"], "url": i["url"] }) else: pass else: pass return format_response('ok', g.data) except Exception as e: print((e.args)) return format_response('error', '图片列表加载失败')
def get_check(address): #生成临时check标志,针对本身不存在的账户生成空信息 #存在 check = str(time.time()) database().update_token(global_config.engine, { "address": address, "check": check }) #请在地址栏填写本站点运行的域名,或者在flask_config里修改server_name参数 server_name = current_app.config['SERVER_NAME'] if current_app.config[ 'SERVER_NAME'] else 'localhost:{}'.format(global_config.port) return 'http://{}/api/remove_token?mail={}&check={}'.format( server_name, address, check)
def update(data): try: body = json.loads(data) if body: response = body.get('response') _id = body.get('id') if not response: print('A RESPONSE não foi informada') conn = None try: params = database() conn = psycopg2.connect(**params) cur = conn.cursor() query = "UPDATE tb_tj_sp SET response = %s WHERE id = %s" cur.execute(query, (response, _id)) conn.commit() cur.close() print('O id {} foi atualizado com sucesso'.format(_id)) except (Exception, psycopg2.DatabaseError) as error: print( 'Erro ao conectar com o banco de dados: {} '.format(error)) finally: if conn is not None: conn.close() else: print('Nenhum dado foi fornecido') except JSONDecodeError as error: print('Os dados informados não é do tipo JSON válido')
def get(self, _id): conn = None try: params = database() conn = psycopg2.connect(**params) cur = conn.cursor() query = "SELECT id, name, response, date FROM tb_tj_sp WHERE id = %s" cur.execute(query, (int(_id), )) data = cur.fetchone() obj = { 'id': data[0], 'name': data[1], 'response': json.loads(data[2]), 'datetime': data[3].isoformat() } cur.close() return self.send_response('', obj, False, 200) except (Exception, psycopg2.DatabaseError) as error: return self.send_response('', str(error), True, HTTPStatus.INTERNAL_SERVER_ERROR) finally: if conn is not None: conn.close()
def mail_to(address): HOST = current_app.config["MAIL_HOST"] PORT = current_app.config['MAIL_PORT'] USER = current_app.config['MAIL_USER'] PASS = current_app.config['MAIL_PASS'] sender = USER receiver = address t = database().get_token(global_config.engine, address) if t: token = t #生成check标志 link = get_check(address) message = MIMEText( '请妥善保管你的认证密钥\n{},如果你的邮箱没有在本站点注册很抱歉打扰您,请点击以下链接删除您的账户,{}'.format( token, link), 'plain', 'utf-8') message['From'] = sender message['To'] = address subject = 'Mgek_ImgBed认证密钥找回服务' message['Subject'] = Header(subject, 'utf-8') try: smtp = smtplib.SMTP_SSL(host=HOST, port=PORT) smtp.login(USER, PASS) smtp.sendmail(sender, receiver, message.as_string()) smtp.quit() return True except Exception as e: print(e.args) return False else: return False
def image_info(): # 根据图片的id获取图片信息 name = request.args.get("name") img = database().get(global_config.engine, 'image', name) if img: return format_response('ok', img) else: return format_response('error', '图片信息获取失败')
def image_upload(): #保持一个上下文的命名变量 #默认的文件列表是file,这应该与前端保持同步 #没有使用安全命名的方式,因为所有文件名会经过hash计算后重命名 #默认需要登录认证 token = request.args.get("token") files = request.files.getlist('file') path = global_config.image_path if global_config.image_path != '' else os.path.join(os.getcwd(),"images") if token and database().get(global_config.engine,'token',token): #账户存在 try: if not os.path.exists(path): os.mkdir(path) #保证目录的创建 #判断是否有上传文件 if 'file' not in request.files: return format_response('error', '空的上传文件') else: res = database().get(global_config.engine, 'token', token) for f in files: if f.filename: name = rename.rename(f.filename) f.save(os.path.join(path, name)) #数据库操作 try: database().set(global_config.engine, 'image', {"name": name, "mail": res, "path": os.path.join(path, name), "url": "{}{}".format(global_config.image_url, name), "time": generate_time()[0] }) except: return format_response('error', '文件上传失败') return format_response('ok', '文件上传成功') except Exception as e: print(e.args) return format_response('error', '文件上传失败') else: return format_response('error', '无文件上传权限')
def image_info(): # 根据图片的id获取图片信息 try: name = request.json["name"] img = database().get(global_config.engine,'image',name) if img: return format_response('ok',img) else: return format_response('error','图片信息获取失败') except Exception as e: return format_response('error', '图片信息获取失败')
def get_token(): try: mail = request.json["mail"] g.token = genernate(mail) """ 在这里添加保存至数据库的函数 #注意如果原本账户存在 不能更新只能找回 """ ifexist = database().get_token(global_config.engine, mail) if not ifexist: res = database().set(global_config.engine, 'token', { "mail": mail, "token": g.token }) if res: return jsonify({"token": g.token}) else: return jsonify({"token": ''}) else: return jsonify({"token": 'already exist'}) except: return jsonify({"token": ''})
def image_delete(): #根据图片的唯一ID删除对应的文件 try: data = request.json if "namaelist" in data.keys(): try: database().delete_many(global_config.engine, 'image', data["namelist"]) return format_response('ok', '文件删除成功') except: return format_response('error', '文件删除失败') elif "name" in data.keys(): try: database().delete(global_config.engine, 'image', data["name"]) return format_response('ok', '文件删除成功') except: return format_response('error', '文件删除失败') except Exception as e: print(e.args) return format_response('error', '文件删除失败')
def image_format(): name = request.json["name"] img = database().get(global_config.engine, 'image', name) res = { "raw": img["name"], "link": "{}{}".format(global_config.image_url, img["name"]), "html": "<img src={}{} alt=image>".format(global_config.image_url, img["name"]), "markdown": "![image]({}{})".format(global_config.image_url, img["name"]) } return format_response('ok', res)
def post(self): try: # body = tornado.escape.json_decode(self.request.body) body = json.loads(self.request.body.decode("utf-8")) if body: name = body.get('name', '') response = body.get('response', '') date = datetime.datetime.now() if not name: return self.send_response('Por favor informe o NOME', '', False, HTTPStatus.BAD_REQUEST) conn = None try: params = database() conn = psycopg2.connect(**params) cur = conn.cursor() query = "INSERT INTO tb_tj_sp (name, response, date) VALUES (%s, %s, %s) RETURNING id" cur.execute(query, (name, response, date)) conn.commit() obj = { 'name': body.get('name'), 'id': int(cur.fetchone()[0]) } self.send_to_rabbitmq(obj) cur.close() return self.send_response( 'Dado inserido na fila com sucesso!', obj, False, 200) except (Exception, psycopg2.DatabaseError) as error: return self.send_response('', str(error), True, HTTPStatus.INTERNAL_SERVER_ERROR) finally: if conn is not None: conn.close() else: return self.send_response('Nenhum dado foi fornecido', '', True, HTTPStatus.BAD_REQUEST) except JSONDecodeError as error: return self.send_response( 'Os dados informados não é do tipo JSON válido', str(error), True, HTTPStatus.BAD_REQUEST)
def image_format(): name = request.json["name"] try: img = database().get(global_config.engine,'image',name) print(global_config.image_url) res = { "raw": img["name"], "link": "{}{}".format(global_config.image_url,img["name"]), "html": "<img src={}{} alt=image>".format(global_config.image_url,img["name"]), "markdown": "![image]({}{})".format(global_config.image_url,img["name"]) } return format_response('ok',res) except Exception as e: print(e.args) return format_response('error','获取格式化信息失败')
def jwt_auth(): if current_app.config["JWT"]: token = request.args.get('token') if token: if token == test_token["token"]: pass else: t = database().get(global_config.engine,'token',token) if t: pass else: return abort(401) else: #你可以使用常规的401权限码也可以使用统一响应码 return format_response('forbidden','401 No Authority') #return abort(401) else: #不使用jwt时跳过认证 pass
def patch(self, _id): try: body = json.loads(self.request.body.decode("utf-8")) if body: response = body.get('response', '') if not response: return self.send_response('Por favor informe a RESPONSE', '', False, HTTPStatus.BAD_REQUEST) conn = None try: params = database() conn = psycopg2.connect(**params) cur = conn.cursor() query = "UPDATE tb_tj_sp SET response = %s WHERE id = %s" cur.execute(query, (response, _id)) conn.commit() cur.close() return self.send_response('Dado atualizado com sucesso', '', False, 200) except (Exception, psycopg2.DatabaseError) as error: return self.send_response('', str(error), True, HTTPStatus.INTERNAL_SERVER_ERROR) finally: if conn is not None: conn.close() else: return self.send_response('Nenhum dado foi fornecido', '', True, HTTPStatus.BAD_REQUEST) except JSONDecodeError as error: return self.send_response( 'Os dados informados não é do tipo JSON válido', '', True, HTTPStatus.BAD_REQUEST)
def createTables(): conn = None try: params = database() conn = psycopg2.connect(**params) cur = conn.cursor() cur.execute(""" CREATE TABLE IF NOT EXISTS tb_tj_sp ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, response TEXT, date TIMESTAMP NOT NULL ) """) cur.close() conn.commit() except (Exception, psycopg2.DatabaseError) as error: print(error) finally: if conn is not None: conn.close()
def __init__(self): self.cl_database = database.database() self.cl_template = template.template() self.cl_tools = tools.tools()