def get_sql(self, query, vars=None): """获取编译后的sql语句""" # 记录程序执行开始时间 start_time = time.clock() try: # 判断是否记录sql执行语句 if self.is_output_sql: log_helper.info('sql:' + str(query)) # 建立游标 self.cursor = self.connect.cursor() # 执行SQL self.data = self.cursor.mogrify(query, vars) except Exception as e: # 将异常写入到日志中 log_helper.error('sql生成失败:' + str(e.args) + ' query:' + str(query)) self.data = '获取编译sql失败' finally: # 关闭游标 self.cursor.close() # 记录程序执行结束时间 end_time = time.clock() # 写入日志 self.write_log(start_time, end_time, query) return self.data
def test(self): log_helper.info('记录代码执行的相关记录或信息') try: result = '0' / 10 except Exception as e: log_helper.error('出现异常:' + str(e.args))
def validate(): """使用勾子处理接口访问事件""" # response.headers['Access-Control-Allow-Origin'] = '*' """ 钩子函数 ,处理请求路由之前需要做什么的事情 :return: """ """使用勾子处理页面或接口访问事件""" # 让bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求 # 获取当前访问的Url路径 path_info = request.environ.get("PATH_INFO") # 过滤不用做任何操作的路由(即过滤不用进行判断是否登录和记录日志的url) if path_info in ['/favicon.ico', '/', '/api/verify/', "/api/visitHandle/"]: return ### 记录客户端提交的参数 ### # 获取当前访问url路径与ip request_log = 'url:' + path_info + ' ip:' + web_helper.get_ip() try: # 添加json方式提交的参数 if request.json: request_log = request_log + ' params(json):' + urllib.parse.unquote( str(request.json)) except: pass try: # 添加GET方式提交的参数 if request.query_string: request_log = request_log + ' params(get):' + urllib.parse.unquote( str(request.query_string)) # 添加POST方式提交的参数 if request.method == 'POST': request_log = request_log + ' params(post):' + urllib.parse.unquote( str(request.params.__dict__)) # 存储到日志文件中 log_helper.info(request_log) except: pass # 处理ajax提交的put、delete等请求转换为对应的请求路由(由于AJAX不支持RESTful风格提交,所以需要在这里处理一下,对提交方式进行转换) if request.method == 'POST' and request.POST.get('_method'): request.environ['REQUEST_METHOD'] = request.POST.get('_method', '') # 过滤不用进行登录权限判断的路由(登录与退出登录不用检查是否已经登录) url_list = ["/apiPost/login/", "/apiPost/logout/"] if path_info in url_list: pass else: # 已经登录成功的用户session肯定有值,没有值的就是未登录 session = web_helper.get_session() # 获取用户id manager_id = session.get('id', 0) login_name = session.get('login_name', 0) # 判断用户是否登录 if not manager_id or not login_name: web_helper.return_raise( web_helper.return_msg(-404, "您的登录已失效,请重新登录"))
def validate(): """使用勾子处理接口访问事件""" r = request # 获取当前访问的Url路径 path_info = request.environ.get("PATH_INFO") # 过滤不用做任何操作的路由(即过滤不用进行判断是否登录和记录日志的url) if path_info in ['/favicon.ico', '/', '/api/verify/' ] or path_info.find('/upload/') > -1: return ### 记录客户端提交的参数 ### # 获取当前访问url路径与ip request_log = 'url:' + path_info + ' ip:' + web_helper.get_ip() try: # 添加json方式提交的参数 if request.json: request_log = request_log + ' params(json):' + urllib.parse.unquote( str(request.json)) except: pass try: # 添加GET方式提交的参数 if request.query_string: request_log = request_log + ' params(get):' + urllib.parse.unquote( str(request.query_string)) # 添加POST方式提交的参数 if request.method == 'POST': request_log = request_log + ' params(post):' + urllib.parse.unquote( str(request.params.__dict__)) # 存储到日志文件中 log_helper.info(request_log) except: pass # 处理ajax提交的put、delete等请求转换为对应的请求路由(由于AJAX不支持RESTful风格提交,所以需要在这里处理一下,对提交方式进行转换) if request.method == 'POST' and request.POST.get('_method'): request.environ['REQUEST_METHOD'] = request.POST.get('_method', '') # 过滤不用进行登录权限判断的路由(登录与退出登录不用检查是否已经登录) url_list = [ "/api/login/", "/api/logout/", "/api/about/", "/api/contact_us/", "/api/product_class/", "/api/product/" ] if path_info in url_list or (request.method == 'GET' and path_info.find('/api/product/') > -1): pass else: # 已经登录成功的用户session肯定有值,没有值的就是未登录 session = web_helper.get_session() # 获取用户id manager_id = session.get('id', 0) login_name = session.get('login_name', 0) # 判断用户是否登录 if not manager_id or not login_name: web_helper.return_raise( web_helper.return_msg(-404, "您的登录已失效,请重新登录"))
def validate(): """使用勾子处理接口访问事件""" r = request # 获取路径 path_info = request.environ.get('PATH_INFO') # 记录参数 # 图标等不用处理 直接返回 if path_info in ['/favicon.ico', '/', '/api/verify/']: return request_log = 'url:' + path_info + ';ip:' + web_helper.get_ip() try: if request.json: request_log = request_log + ';params(json):' + urllib.parse.unquote( str(request.json)) except: pass try: if request.query_string: request_log = request_log + ';params(get):' + request.query_string if request.method == 'POST': request_log = request_log + ';params(post):' + urllib.parse.unquote( str(request.params.__dict__)) log_helper.info(request_log) print(request_log) except: pass # put等方法特殊处理 if request.method == 'POST': _method = web_helper.get_form('_method', False) if _method: # if request.POST.get('_method'): request.environ[ 'REQUEST_METHOD'] = _method #request.POST.get('_method', '') print('_method:' + _method + '|') # elif request.json.get() # 登录验证 url_list = ["/api/login/", "/api/logout/"] if path_info in url_list: return else: s = str(api.__dict__) session = web_helper.get_session() # 获取用户id manager_id = session.get('id', 0) login_name = session.get('login_name', 0) print('manager_id:' + str(manager_id) + 'login_name:' + str(login_name)) # 判断用户是否登录 # if not manager_id or not login_name: # web_helper.return_raise(web_helper.return_msg(-404, "您的登录已失效,请重新登录")) print(4)
def push(key, value): """ 添加数据到队列头部 :param key: 缓存key,字符串,不区分大小写 :param value: 要存储的值 """ # 将key转换为小写字母 key = str(key).lower() try: r.lpush(key, value) except Exception as e: log_helper.info('写缓存失败:key(' + key + ')' + str(e.args)) pass
def delete(key): """ 删除缓存 :param key:缓存key,字符串,不区分大小写 :return: """ # 将key转换为小写字母 key = str(key).lower() try: log_helper.info(str(r.delete(key))) except Exception as e: log_helper.info('Exception:' + str(e.args)) pass
def get_file_size(filePath): """ 读取文件大小 :param filePath: 文件存储路径 :return: """ if not exists(filePath): return 0 try: return os.path.getsize(filePath) except Exception as e: log_helper.info(str(e)) return 0
def pop(key): """ 从缓存队列的后尾读取一条数据 :param key: 缓存key,字符串,不区分大小写 :return: 缓存数据 """ # 将key转换为小写字母 key = str(key).lower() try: value = r.rpop(key) except Exception as e: log_helper.info('读取缓存队列失败:key(' + key + ')' + str(e.args)) value = None return _str_to_json(value)
def set(key, value, time=86400): """ 写缓存 :param key: 缓存key,字符串,不区分大小写 :param value: 要存储的值 :param time: 缓存过期时间(单位:秒),0=永不过期 :return: """ # 将key转换为小写字母 key = str(key).lower() try: r.set(key, value, time) except Exception as e: log_helper.info('写缓存失败:key(' + key + ')' + str(e.args)) pass
def execute(self, query, vars=None): """执行sql语句查询,返回结果集或影响行数""" if not query: return None # 记录程序执行开始时间 start_time = time.clock() try: # 判断是否记录sql执行语句 if self.is_output_sql: log_helper.info('sql:' + str(query)) # 建立游标 self.cursor = self.connect.cursor() # 执行SQL result = self.cursor.execute(query, vars) print(str(result)) except Exception as e: # 将异常写入到日志中 log_helper.error('sql执行失败:' + str(e.args) + ' query:' + str(query)) self.data = None else: # 获取数据 try: if self.cursor.description: # 在执行insert/update/delete等更新操作时,如果添加了returning,则读取返回数据组合成字典返回 self.data = [ dict((self.cursor.description[i][0], value) for i, value in enumerate(row)) for row in self.cursor.fetchall() ] else: # 如果执行insert/update/delete等更新操作时没有添加returning,则返回影响行数,值为0时表时没有数据被更新 self.data = self.cursor.rowcount except Exception as e: # 将异常写入到日志中 log_helper.error('数据获取失败:' + str(e.args) + ' query:' + str(query)) self.data = None finally: # 关闭游标 self.cursor.close() # 记录程序执行结束时间 end_time = time.clock() # 写入日志 self.write_log(start_time, end_time, query) # 如果有返回数据,则把该数据返回给调用者 return self.data
from config import redis_config # 设置redis配置参数 _redis = redis_config.REDIS # 初始化Redis缓存链接 r = None try: if not r: r = redis.Redis(host=_redis.get('server', ''), port=_redis.get('post', ''), db=_redis.get('db', ''), password=_redis.get('pwd', ''), socket_timeout=1, socket_connect_timeout=1) except Exception as e: log_helper.info('连接redis出错:(' + str(_redis) + ')' + str(e.args)) pass def set(key, value, time=86400): """ 写缓存 :param key: 缓存key,字符串,不区分大小写 :param value: 要存储的值 :param time: 缓存过期时间(单位:秒),0=永不过期 :return: """ # 将key转换为小写字母 key = str(key).lower() try: r.set(key, value, time)
def write_log(self, start_time, end_time, sql): """记录Sql执行超时日志""" t = end_time - start_time if (t) > 0.1: content = ' '.join(('run time:', str(t), 's sql:', sql)) log_helper.info(content)