def run_command(command): try: command_module = load_rust_command(command) except: command_module = None if not command_module: command_module = load_local_command(command) if not command_module: print('no command named: ', command) else: instance = getattr(command_module, 'Command')() try: instance.handle(*sys.argv[2:]) except: print unicode_full_stack()
def handle(self, *args, **options): print('syncdb: create tables') db_models = [] for path in DB_PATHS: module = __import__(path, {}, {}, [ '*', ]) walk_path = os.path.dirname(os.path.abspath(module.__file__)) for root, dirs, files in os.walk(walk_path): for f in files: if '__init__' in f: continue if f.endswith('.pyc'): continue if '.DS_Store' in f: continue upper_module = root.split(os.path.sep)[-1] module_name = '{}.{}.{}'.format(path, upper_module, f[:-3]) try: module = __import__(module_name, {}, {}, [ '*', ]) for key, value in module.__dict__.items(): if inspect.isclass(value) and issubclass( value, models.Model ) and value.__module__ == module.__name__: db_model = value table_name = db_model._meta.table_name if db_model.table_exists(): print( 'table: {} existed'.format(table_name)) else: print('table: {} collected'.format( table_name)) db_models.append(value) except: print(unicode_full_stack()) try: db.create_tables(db_models) print('create {} tables done!'.format(len(db_models))) except: print(unicode_full_stack())
def __call_api(self, method, resource, req, resp): req.context['_resource'] = resource resp.status = falcon.HTTP_200 trx_rolled_back = False with rust_db.atomic() as transaction: response = None try: params = self.__parse_api_params(req) if not params: # 对于不支持的content_type,直接返回空串 resp.body = '' return response = api.api_call(method, resource, params, req, resp) response = JsonResponse(response) except ApiNotExistError as e: response = ErrorResponse.get_from_exception(e) except ApiParameterError as e: response = ErrorResponse.get_from_exception(e) except BusinessError as e: response = ErrorResponse.get_from_exception(e) except Exception: error_stacks = unicode_full_stack() print(error_stacks) response = ErrorResponse(code=533, errMsg=u'系统错误', innerErrMsg=error_stacks) finally: if response and response.code != 200: transaction.rollback() trx_rolled_back = True # 关闭数据库连接 rust_db.close() if not trx_rolled_back: # 如果数据库事务已提交,则发送所有异步消息 pass if settings.MODE == 'deploy': # 生产环境不对外保留错误堆栈 response.innerErrMsg = '' resp.body = response.to_string() if hasattr(settings, 'API_LOGGER_MODE'): ApiLogger.log(req_data={ 'resource': resource, 'method': method, 'params': params, 'req_instance': req }, resp_data={'resp_instance': resp}, mode=getattr(settings, 'API_LOGGER_MODE', None))
def load_resources(): """ 加载资源 """ #加载rust资源 if hasattr(settings, 'RUST_RESOURCES'): for resource in settings.RUST_RESOURCES: __import__('rust.resources.api.{}'.format(resource), {}, {}, [ '*', ]) print('load rust built-in resource: {}'.format(resource)) #加载用户定义的资源 try: import api.resources except: print(unicode_full_stack())
def inner_run(self, *args, **options): self.stdout.write( '\n>>>>>>>>>>>local server started @{}:{}<<<<<<<<<<< \n'.format( self.addr, self.port)) try: from wsgiref import simple_server from rust import apps wsgi_application = apps.create_app() httpd = simple_server.make_server(self.addr, int(self.port), wsgi_application) httpd.serve_forever() except KeyboardInterrupt: sys.exit(0) except: print(unicode_full_stack())
def __request(self, resource, params, method): # 构造url """ @return is_success,code,data """ self.__resource = resource host = self.gateway_host resource_path = resource.replace('.', '/') service_name = self.service self.__target_service = service_name if service_name: base_url = '%s/%s/%s/' % (host, service_name, resource_path) else: # 如果resouce为None,则URL中省略resource。方便本地调试。 base_url = '%s/%s/' % (host, resource_path) url = url_add_params(base_url) headers = {'AUTHORIZATION': JWTService.get_current()} start = time() try: # 访问资源 if method == 'get': resp = requests.get(url, headers=headers, params=params, timeout=DEFAULT_TIMEOUT) elif method == 'post': resp = requests.post(url, headers=headers, data=params, timeout=DEFAULT_TIMEOUT) else: # 对于put、delete方法,变更为post方法,且querystring增加_method=put或_method=delete url = url_add_params(url, _method=method) resp = requests.post(url, headers=headers, data=params, timeout=DEFAULT_TIMEOUT) self.__resp = resp # 解析响应 if resp.status_code == 200: json_data = json.loads(resp.text) self.__json_data = json_data code = json_data['code'] if code == 200 or code == 500: self.__log(True, url, params, method) return json_data else: self.__log(False, url, params, method, 'ServiceProcessFailure', 'BUSINESS_CODE:' + str(code)) return None else: self.__log(False, url, params, method, 'NginxError', 'HTTP_STATUS_CODE:' + str(resp.status_code)) return None except requests.exceptions.RequestException as e: self.__log(False, url, params, method, str(type(e)), unicode_full_stack()) return None except BaseException as e: self.__log(False, url, params, method, str(type(e)), unicode_full_stack()) return None finally: stop = time() duration = stop - start logging.info('expend time {}'.format(duration))