Skip to main content

BunnyHopApi is a lightweight and fast web framework designed to handle modern web development needs.

Project description

BunnyHopApi

BunnyHopApi is a lightweight and fast web framework designed to handle modern web development needs. It provides full support for:

  • HTTP Requests: Easily handle all HTTP methods.
  • SSE (Server-Sent Events): Support for server-sent events.
  • WebSockets: Real-time bidirectional communication.
  • Middlewares:
    • At the global level.
    • At the route level.
    • At the endpoint level.
  • CORS: Simple configuration to enable CORS.
  • Web Page Rendering:
    • Static pages.
    • Dynamic pages with Jinja2.
  • Type Validation: Automatic validation for query parameters, path parameters, and request bodies.
  • Swagger Documentation: Automatically generated Swagger documentation for all endpoints.
  • Exceptional Performance: Designed to be fast and efficient.

Key Features

1. HTTP, SSE, and WebSocket Support

BunnyHopApi allows handling standard HTTP requests, SSE for real-time updates, and WebSockets for bidirectional communication.

Example: HTTP Endpoint

class HealthEndpoint(Endpoint):
    path = "/health"

    @Endpoint.GET()
    def get(self, headers):
        return 200, {"message": "GET /health"}

Example: SSE Endpoint

class SseEndpoint(Endpoint):
    path = "/sse/events"

    @Endpoint.GET(content_type=Router.CONTENT_TYPE_SSE)
    async def get(self, headers) -> {200: str}:
        events = ["start", "progress", "complete"]

        for event in events:
            yield f"event: {event}\ndata: Processing {event}\n\n"
            await asyncio.sleep(1.5)

        yield "event: end\ndata: Processing complete\n\n"

Example: WebSocket Endpoint

class WSEndpoint(Endpoint):
    path = "/ws/chat"

    async def connection(self, headers):
        logger.info("Client connected")
        logger.info(f"Headers: {headers}")

        return True

    async def disconnect(self, connection_id, headers):
        logger.info(f"Client {connection_id} disconnected")

    async def ws(self, connection_id, message, headers):
        logger.info(f"Received message from {connection_id}: {message}")
        for i in range(10):
            yield f"event: message\ndata: {i}\n\n"
            await asyncio.sleep(0.2)

2. Flexible Middlewares

Define middlewares at different levels:

  • Global: Applied to all routes and endpoints.
  • Route-specific: Applied to a specific set of endpoints.
  • Endpoint-specific: Applied to an individual endpoint.

Example: Global Middleware

async def global_middleware(endpoint, headers, **kwargs):
    logger.info("global_middleware: Before calling the endpoint")
    result = endpoint(headers=headers, **kwargs)
    response = await result if asyncio.iscoroutine(result) else result
    logger.info("global_middleware: After calling the endpoint")
    return response

Example: Database-Specific Middleware

class UserEndpoint(Endpoint):
    path: str = "/users"

    @Endpoint.MIDDLEWARE()
    def db_middleware(self, endpoint, headers, *args, **kwargs):
        logger.info("db_middleware: Before calling the endpoint")
        db = Database()
        return endpoint(headers=headers, db=db, *args, **kwargs)

3. CRUD with SQLite

BunnyHopApi makes it easy to implement CRUD operations with support for databases like SQLite.

Example: CRUD Operations

class UserEndpoint(Endpoint):
    path: str = "/users"

    @Endpoint.MIDDLEWARE()
    def db_middleware(self, endpoint, headers, *args, **kwargs):
        logger.info("db_middleware: Before calling the endpoint")
        db = Database()
        return endpoint(headers=headers, db=db, *args, **kwargs)

    @Endpoint.GET()
    def get(self, headers, db: Database, *args, **kwargs) -> {200: UserList}:
        users = db.get_users()
        return 200, {"users": users}

    @Endpoint.POST()
    def post(self, user: UserInput, headers, db, *args, **kwargs) -> {201: UserOutput}:
        new_user = db.add_user(user)
        return 201, new_user

    @Endpoint.PUT()
    def put(
        self, db, user_id: PathParam[str], user: UserInput, headers, *args, **kwargs
    ) -> {200: UserOutput, 404: Message}:
        updated_user = db.update_user(user_id, user)

        if updated_user is None:
            return 404, {"message": "User not found"}

        return 200, updated_user

    @Endpoint.DELETE()
    def delete(
        self, db, user_id: PathParam[str], headers, *args, **kwargs
    ) -> {200: Message, 404: Message}:
        if db.delete_user(user_id):
            return 200, {"message": "User deleted"}
        else:
            return 404, {"message": "User not found"}

4. Swagger Documentation

BunnyHopApi automatically generates Swagger documentation for all endpoints, making it easy to explore and test your API.

Example: Access Swagger

Once the server is running, visit /docs in your browser to view the Swagger UI.

5. Installation

You can install BunnyHopApi directly from PyPI:

pip install bunnyhopapi

6. Example Project

Check the example/crud.py file for an example of how to generate a CRUD using BunnyHopApi. or Check the example/main.py file for a complete example of how to use BunnyHopApi.

7. License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bunnyhopapi-1.3.3.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bunnyhopapi-1.3.3-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file bunnyhopapi-1.3.3.tar.gz.

File metadata

  • Download URL: bunnyhopapi-1.3.3.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for bunnyhopapi-1.3.3.tar.gz
Algorithm Hash digest
SHA256 7de46f39929edc56fcc4d6e0b10e38b38979944050622867cd01ed6b98607c12
MD5 e49f25de641d179eeecd3fcf3a2b3d26
BLAKE2b-256 a3f57b6af10cea49b58c8b2553452b154d6d87f2ddaa3928a780b2e5a67793a7

See more details on using hashes here.

File details

Details for the file bunnyhopapi-1.3.3-py3-none-any.whl.

File metadata

  • Download URL: bunnyhopapi-1.3.3-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for bunnyhopapi-1.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 58e1e841c3431c71fa7678ce587af888d09d38bcbb14b4cb1e7b5dc6f3acd5b5
MD5 26feda6d3e6d5f55c9153775298aa9c3
BLAKE2b-256 3da958841a318a4e846003ce42cb800d79489186100980afae02c64b4d53131b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page