예제 #1
0
    def __init__(self,
                 gateway,
                 schema_path=None,
                 data_gw_cache=None,
                 **kwargs):
        self.__gateway = gateway

        if schema_path:
            with open(schema_path) as f:
                source = f.read()
        else:
            self.__schema_source = create_gql_schema(gateway)
            source = self.__schema_source

        document = parse(source)
        self.__schema = build_ast_schema(document)
        abstract_types = filter(lambda x: hasattr(x, 'resolve_type'),
                                dict(self.__schema.get_type_map()).values())
        for at in abstract_types:
            at.resolve_type = self.__resolve_type

        self.__executor = AgoraExecutor(gateway)

        if not data_gw_cache:
            data_gw_cache = {'max_age_seconds': 300, 'max_len': 1000000}

        self.expiring_dict = ExpiringDict(**data_gw_cache)
        middleware = AgoraMiddleware(gateway,
                                     data_gw_cache=self.expiring_dict,
                                     **kwargs)
        self.__middleware = MiddlewareManager(middleware)
예제 #2
0
파일: schema.py 프로젝트: insolite/graphene
    def __init__(self,
                 query=None,
                 mutation=None,
                 subscription=None,
                 directives=None,
                 types=None,
                 executor=None,
                 middlewares=None,
                 auto_camelcase=True):
        self._query = query
        self._mutation = mutation
        self._subscription = subscription
        self.types = types
        self._executor = executor
        self.auto_camelcase = auto_camelcase
        if directives is None:
            directives = [GraphQLIncludeDirective, GraphQLSkipDirective]

        assert all(isinstance(d, GraphQLDirective) for d in directives), \
            'Schema directives must be List[GraphQLDirective] if provided but got: {}.'.format(
                directives
        )
        if middlewares:
            self.middlewares = MiddlewareManager(*middlewares)
        else:
            self.middlewares = None
        self._directives = directives
        self.build_typemap()
    def _test():
        from graphql import MiddlewareManager

        ok, response = graphql_run(
            app, "{ hello }", middleware=MiddlewareManager(example_middleware))
        assert ok and not response.get("errors")
        assert "Hello!" in str(response["data"])
예제 #4
0
 def get_graphql_params(self, connection_context, payload):
     params = super().get_graphql_params(connection_context, payload)
     middleware = graphene_settings.MIDDLEWARE
     if middleware:
         if not isinstance(middleware, MiddlewareManager):
             middleware = MiddlewareManager(*middleware,
                                            wrap_in_promise=False)
         params["middleware"] = middleware
     return params
예제 #5
0
    def as_middleware_manager(self,
                              *additional_middlewares) -> MiddlewareManager:
        middlewares = tuple(self.extensions) + additional_middlewares

        return MiddlewareManager(*middlewares)
def execute(
        schema,  # type: GraphQLSchema
        document_ast,  # type: Document
        root_value=None,  # type: Any
        context_value=None,  # type: Optional[Any]
        variable_values=None,  # type: Optional[Any]
        operation_name=None,  # type: Optional[str]
        executor=None,  # type: Any
        middleware=None,  # type: Optional[Any]
        allow_subscriptions=False,  # type: bool
        **options  # type: Any
):
    # type: (...) -> Awaitable[ExecutionResult]

    if root_value is None and "root" in options:
        warnings.warn(
            "The 'root' alias has been deprecated. Please use 'root_value' instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        root_value = options["root"]
    if context_value is None and "context" in options:
        warnings.warn(
            "The 'context' alias has been deprecated. Please use 'context_value' instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        context_value = options["context"]
    if variable_values is None and "variables" in options:
        warnings.warn(
            "The 'variables' alias has been deprecated. Please use 'variable_values' instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        variable_values = options["variables"]
    assert schema, "Must provide schema"
    assert isinstance(schema, GraphQLSchema), (
        "Schema must be an instance of GraphQLSchema. Also ensure that there are "
        +
        "not multiple versions of GraphQL installed in your node_modules directory."
    )

    if middleware:
        if not isinstance(middleware, MiddlewareManager):
            middleware = MiddlewareManager(*middleware)

        assert isinstance(middleware, MiddlewareManager), (
            "middlewares have to be an instance"
            ' of MiddlewareManager. Received "{}".'.format(middleware))

    # 只能采用协程执行器
    if executor is None:
        executor = AsyncioExecutor()
    assert isinstance(executor, AsyncioExecutor)

    # 初始化 context value 的结构
    if context_value is None:
        context_value = {}

    context_value.setdefault("prefetch", defaultdict(list))

    exe_context = ExecutionContext(
        schema,
        document_ast,
        root_value,
        context_value,
        variable_values or {},
        operation_name,
        executor,
        middleware,
        allow_subscriptions,
    )

    def promise_executor(v):
        # type: (Optional[Any]) -> Union[Dict, Promise[Dict], Observable]
        return execute_operation(exe_context, exe_context.operation,
                                 root_value)

    def on_rejected(error):
        # type: (Exception) -> None
        exe_context.errors.append(error)
        return None

    def on_resolve(data):
        # type: (Union[None, Dict, Observable]) -> Union[ExecutionResult, Observable]
        if isinstance(data, Observable):
            return data

        if not exe_context.errors:
            return ExecutionResult(data=data)

        return ExecutionResult(data=data, errors=exe_context.errors)

    def prefetch(data):
        resolve_prefetch(exe_context, exe_context.operation, root_value)
        return data

    if exe_context.operation.operation == 'query':
        promise = Promise.resolve(None).then(prefetch).then(
            promise_executor).catch(on_rejected).then(on_resolve)
    else:
        promise = Promise.resolve(None).then(promise_executor).catch(
            on_rejected).then(on_resolve)

    # 类似于调用 executor.wait_until_finished
    # 但是 executor.wait_until_finished 要求当前线程没有loop
    async def wait_until_finished():
        while executor.futures:
            futures = executor.futures
            executor.futures = []
            await asyncio.gather(*tuple(futures))
            return await promise

    return wait_until_finished()
    def _test():
        from graphql import MiddlewareManager

        _, response = graphql_run(
            app, query, middleware=MiddlewareManager(error_middleware))
        assert response["errors"]