HTTP Server for GraphQL.
Project description
GraphQL HTTP
A lightweight, production-ready HTTP server for GraphQL APIs built on top of Starlette/FastAPI. This server provides a simple yet powerful way to serve GraphQL schemas over HTTP with built-in support for authentication, CORS, GraphiQL integration, and more.
Features
- 🚀 High Performance: Built on Starlette/ASGI for excellent async performance
- 🔐 JWT Authentication: Built-in JWT authentication with JWKS support
- 🌐 CORS Support: Configurable CORS middleware for cross-origin requests
- 🎨 GraphiQL Integration: Interactive GraphQL IDE for development
- 📊 Health Checks: Built-in health check endpoints
- 🔄 Batch Queries: Support for batched GraphQL operations
- 🛡️ Error Handling: Comprehensive error handling and formatting
- 📝 Type Safety: Full TypeScript-style type hints for Python
Installation
uv add graphql_http
Or with pip:
pip install graphql_http
Quick Start
Basic Usage
from graphql import GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString
from graphql_http import GraphQLHTTP
# Define your GraphQL schema
schema = GraphQLSchema(
query=GraphQLObjectType(
name="Query",
fields={
"hello": GraphQLField(
GraphQLString,
resolve=lambda obj, info: "Hello, World!"
)
}
)
)
# Create the HTTP server
app = GraphQLHTTP(schema=schema)
# Run the server
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Using with GraphQL-API
For more advanced schemas, integrate with graphql-api:
from graphql_api import GraphQLAPI
from graphql_http import GraphQLHTTP
api = GraphQLAPI()
@api.type(is_root_type=True)
class Query:
@api.field
def hello(self, name: str = "World") -> str:
return f"Hello, {name}!"
# Create server from API
server = GraphQLHTTP.from_api(api)
server.run()
Configuration Options
Basic Configuration
app = GraphQLHTTP(
schema=schema,
serve_graphiql=True, # Enable GraphiQL interface
graphiql_example_query="{ hello }", # Example query in GraphiQL
allow_cors=True, # Enable CORS
health_path="/health" # Health check endpoint
)
Authentication Configuration
app = GraphQLHTTP(
schema=schema,
auth_enabled=True,
auth_jwks_uri="https://your-auth0-domain/.well-known/jwks.json",
auth_issuer="https://your-auth0-domain/",
auth_audience="your-api-audience",
auth_enabled_for_introspection=False # Allow introspection without auth
)
Advanced Configuration
from graphql.execution import ExecutionContext
class CustomExecutionContext(ExecutionContext):
# Custom execution logic
pass
app = GraphQLHTTP(
schema=schema,
root_value={"version": "1.0"},
middleware=[your_middleware_function],
context_value=custom_context,
execution_context_class=CustomExecutionContext
)
GraphiQL Example Queries
You can provide an example query for GraphiQL to show users how your API works. There are 3 ways to do this:
1. Pass a string directly:
app = GraphQLHTTP(
schema=schema,
graphiql_example_query="{ users { id name } }"
)
2. Load from a file:
app = GraphQLHTTP(
schema=schema,
graphiql_example_query_path="./queries/example.graphql"
)
3. Auto-discovery (no config needed):
Just create a graphiql_example.graphql or example.graphql file in the directory where you run your application and the server will automatically find and use it.
# Create the file in your project directory
echo "query Example { hello }" > example.graphql
# Run your app from the same directory
python my_server.py
Note: The file must be in your current working directory when the server starts, not necessarily where your Python script is located. If auto-discovery isn't working, enable debug logging to see where it's looking:
import logging
logging.basicConfig(level=logging.DEBUG)
If you provide multiple sources, the string parameter takes priority, then the file path, then auto-discovery.
API Reference
GraphQLHTTP Class
Constructor Parameters
schema(GraphQLSchema): The GraphQL schema to serveroot_value(Any, optional): Root value passed to resolversmiddleware(List[Callable], optional): List of middleware functionscontext_value(Any, optional): Context passed to resolversserve_graphiql(bool, default: True): Whether to serve GraphiQL interfacegraphiql_example_query(str, optional): Example query for GraphiQL interfacegraphiql_example_query_path(str, optional): Path to file containing example query for GraphiQLallow_cors(bool, default: False): Enable CORS middlewarehealth_path(str, optional): Path for health check endpointexecution_context_class(Type[ExecutionContext], optional): Custom execution contextauth_enabled(bool, default: False): Enable JWT authenticationauth_jwks_uri(str, optional): JWKS URI for JWT validationauth_issuer(str, optional): Expected JWT issuerauth_audience(str, optional): Expected JWT audienceauth_enabled_for_introspection(bool, default: False): Require auth for introspection
Methods
from_api(api, **kwargs): Create server from GraphQL-API instancerun(host, port, **kwargs): Run the serverclient(): Get test client for testing
HTTP Endpoints
POST /graphql
Execute GraphQL operations:
curl -X POST http://localhost:8000/graphql \
-H "Content-Type: application/json" \
-d '{"query": "{ hello }"}'
GET /graphql
Execute GraphQL queries via GET (with query parameter):
curl "http://localhost:8000/graphql?query={hello}"
Access GraphiQL interface in browser:
http://localhost:8000/graphql
GET /health
Health check endpoint (if configured):
curl http://localhost:8000/health
Authentication
When authentication is enabled, requests must include a valid JWT token:
curl -X POST http://localhost:8000/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"query": "{ hello }"}'
Testing
The server includes a built-in test client:
from graphql_http import GraphQLHTTP
server = GraphQLHTTP(schema=schema)
client = server.client()
response = client.post("/graphql", json={"query": "{ hello }"})
assert response.status_code == 200
assert response.json() == {"data": {"hello": "Hello, World!"}}
Error Handling
The server provides comprehensive error handling:
- 400 Bad Request: Malformed queries or invalid JSON
- 401 Unauthorized: Invalid or missing authentication
- 405 Method Not Allowed: Invalid HTTP method
- 500 Internal Server Error: Server-side errors
Development
Running Tests
With UV:
uv run pytest tests/ -v
Or with Python directly:
python -m pytest tests/ -v
Contributing
- Fork the repository
- Create a feature branch
- Add tests for your changes
- Ensure all tests pass
- Submit a pull request
License
MIT License - see LICENSE file for details.
Changelog
See CHANGELOG.md for version history and updates.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graphql_http-2.1.3.tar.gz.
File metadata
- Download URL: graphql_http-2.1.3.tar.gz
- Upload date:
- Size: 146.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12ca77fd729bc71d6854f2c159e0cd296fc47a5b381965ef0f4a9a1c778a300a
|
|
| MD5 |
712e0918503031db8e4f552e821c6e57
|
|
| BLAKE2b-256 |
695775f14cc76fa17a3b64007dff323e80e103d20f39a688f0fbe4c7a10e625d
|
File details
Details for the file graphql_http-2.1.3-py3-none-any.whl.
File metadata
- Download URL: graphql_http-2.1.3-py3-none-any.whl
- Upload date:
- Size: 50.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25366a8b33c5ea705a08817cd7c88f0668ad85ddeba72d2e9b83ec98f8bcb11e
|
|
| MD5 |
f58dc1f68e4c3748289b073d7d59c691
|
|
| BLAKE2b-256 |
1eb3485f19b4c134d3e36be736b481cebaaca394fc4dd48fe7ab52e4f93a4f6d
|