Skip to content

Latest commit

 

History

History
76 lines (53 loc) · 2.5 KB

README.md

File metadata and controls

76 lines (53 loc) · 2.5 KB

Blacksheep Context

Build Status codecov Package Version PyPI Version

Introduction

Middleware for Blacksheep that allows you to store and access the context data of a request. Can be used with logging so logs automatically use request headers such as x-request-id or x-correlation-id.

Requirements

  • Python 3.7+
  • Blacksheep 1.0.7+

Installation

$ pip install blacksheep-context

Usage

A complete example shown below.

from blacksheep.server import Application
from blacksheep.messages import Request, Response
from blacksheep.server.responses import json

from blacksheep_context import context
from blacksheep_context.middleware import ContextMiddleware
from blacksheep_context.plugins import BasePlugin, HeaderPlugin


class RequestIdPlugin(HeaderPlugin):
    header_key = b'X-Request-Id'
    # Every plugin must provide this attribute
    context_key = 'request-id'
    # Fetches only first value of header, can be False to insert all values of header into context
    single_value_header = True

    # Also allow you to add some data from context into response
    async def enrich_response(self, response: Response) -> None:
        response.add_header(b'X-Request-Id', context['request_id'].encode('utf-8'))


class MyCustomPlugin(BasePlugin):
    context_key = 'user-data'

    # You can customize fetching data from request
    async def process_request(self, request: Request):
        try:
            data = await request.json()
            return data.get('user-id')
        except Exception:
            return None


ctx_middleware = ContextMiddleware(plugins=[RequestIdPlugin(), MyCustomPlugin()])

app_ = Application()
app_.middlewares.append(ctx_middleware)

@app_.router.post('/ctx')
def return_context(request):
    assert context.exists() is True
    return json(context.copy())

Contributing

This project is absolutely open to contributions so if you have a nice idea, create an issue to let the community discuss it.