Consider this code:
import strawberry from fastapi import FastAPI, Depends, Request, WebSocket, BackgroundTasks from strawberry.types import Info from strawberry.fastapi import GraphQLRouter def custom_context_dependency() -> str: # ===> need to get request here, to get request header return "John" def has_root_access() -> bool: # ===> need to get request and header to get user info # and user permissions return False async def get_context( custom_value=Depends(custom_context_dependency), has_root_access=Depends(has_root_access), ): return { "custom_value": custom_value, "has_root_access": has_root_access, } @strawberry.type class Query: @strawberry.field def example(self, info: Info) -> str: return f"Hello {info.context['custom_value']}" schema = strawberry.Schema(Query) graphql_app = GraphQLRouter( schema, context_getter=get_context, ) app = FastAPI() app.include_router(graphql_app, prefix="/graphql")
How do I get the request info in the dependencies custom_context_dependency
and has_root_access
?
Advertisement
Answer
When I tried FastAPI’s Request
, it was still showing some error when Strawberry’s page was opened. Later I understood that the error was being raised by WebSocket connection. So my solution was to make request and web-socket optional params:
def custom_context_dependency( request: Request = None, websocket: WebSocket = None, ) -> str: item = request or websocket ... return "John"
Either request or websocket will be present for every request.
To get a header specifically, FastAPI’s Header
is also supported.
def custom_context_dependency( Authorization: str = Header(None) ) -> str: ...