Skip to content

Standardise context creation and access #1258

Open
@jkimbo

Description

@jkimbo

At the moment the Django and Sanic integrations return a custom dataclass from the default implementation of get_context. This allows gives a nicer developer experience because you can access properties via dict or attribute notation. However if you override the get_context method to customise the context and return a dictionary (which is what the docs recommend) it can break assumptions made elsewhere.

I propose that we standardise how the context is created by wrapping whatever is returned from get_context in a StrawberryContext wrapper class. This would also allow us to store internal data in the context which might be useful in custom fields or extensions.

Something like this:

class MyGraphQLView(GraphQLView):
	def get_context(self, request, response):
		return {
			"request": request,
			"response": response,
			"current_time": datetime.now(),
		}

@strawberry.type
class Query:
	@strawberry.field
	def current_time(self, info) -> str:
		context = info.context  # type is StrawberryContext
		return context.current_time.isoformat()

Also I think it should be possible (and encouraged) to modify context using extensions rather than having to override the base view.

Only concern I have is how we type this. Thoughts @strawberry-graphql/core ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions