예제 #1
0
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()
예제 #2
0
파일: syncdb.py 프로젝트: limoxi/rust
    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())
예제 #3
0
    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))
예제 #4
0
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())
예제 #5
0
    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())
예제 #6
0
    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))