asgi-tus


Nameasgi-tus JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryA Python ASGI implementation of the tus resumable upload protocol with FastAPI and Starlette integrations.
upload_time2025-08-06 22:56:39
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseMIT
keywords asgi fastapi resumable starlette tus upload
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # asgi-tus

A Python ASGI implementation of the [tus resumable upload protocol](https://tus.io/protocols/resumable-upload/).

## Features

- Full [tus protocol 1.0.0](https://tus.io/protocols/resumable-upload/) compliance
- Support for all standard extensions: `creation`, `creation-with-upload`, `creation-defer-length`, `termination`, `checksum`, `expiration`
- FastAPI and Starlette integrations in addition to pure ASGI
- File storage backend with cleanup support
- CORS support for web clients
- `async`/`await` throughout

## Installation

**Core functionality (ASGI app only):**
```bash
pip install asgi-tus
```

**With FastAPI support:**
```bash
pip install "asgi-tus[fastapi]"
```

**With Starlette support:**
```bash
pip install "asgi-tus[starlette]"
```

**With development server:**
```bash
pip install "asgi-tus[server]"
```

**With everything:**
```bash
pip install "asgi-tus[all]"
```

## Quick Start

### Pure ASGI

*Core functionality with minimal dependencies:*

```python
from asgi_tus import ASGITusApp, FileStorage, TusConfig
from datetime import timedelta

# Configure storage and tus settings
storage = FileStorage("/tmp/uploads")
config = TusConfig(
    max_size=100 * 1024 * 1024,  # 100MB
    upload_expires=timedelta(hours=24),
    cors_enabled=True
)

# Create ASGI app
app = ASGITusApp(storage, config)

# Run with any ASGI server: uvicorn, hypercorn, etc.
# uvicorn main:app --host 0.0.0.0 --port 8000
```

### FastAPI

*Requires: `pip install "asgi-tus[fastapi]"`*

```python
from fastapi import FastAPI
from asgi_tus import FileStorage, TusConfig, create_tus_router
from datetime import timedelta

app = FastAPI()

# Configure storage and tus settings
storage = FileStorage("/tmp/uploads")
config = TusConfig(
    max_size=100 * 1024 * 1024,  # 100MB
    upload_expires=timedelta(hours=24),
    cors_enabled=True
)

# Add tus endpoints
tus_router = create_tus_router(storage, config, prefix="/files")
app.include_router(tus_router)

# Upload endpoint: http://localhost:8000/files/
```

### Starlette

*Requires: `pip install "asgi-tus[starlette]"`*

```python
from starlette.applications import Starlette
from starlette.routing import Route
from asgi_tus import FileStorage, TusConfig, TusMount
from datetime import timedelta

storage = FileStorage("/tmp/uploads")
config = TusConfig(
    max_size=100 * 1024 * 1024,
    upload_expires=timedelta(hours=24),
    cors_enabled=True
)

tus_mount = TusMount(storage, config, path="/files")

app = Starlette(routes=[
    tus_mount.get_mount()
])

# Upload endpoint: http://localhost:8000/files/
```

## Usage

Test the server:

```bash
curl -X OPTIONS http://localhost:8000/files/
```

Upload with a tus client:

```python
# Python client (pip install tuspy)
from tuspy import TusClient

client = TusClient("http://localhost:8000/files/")
uploader = client.uploader("./file.zip")
uploader.upload()
```

```javascript
// JavaScript client (npm install tus-js-client)
import * as tus from "tus-js-client";

const upload = new tus.Upload(file, {
    endpoint: "http://localhost:8000/files/",
    onSuccess: () => console.log("Upload complete!")
});

upload.start();
```

## Configuration

```python
from asgi_tus import TusConfig
from datetime import timedelta

config = TusConfig(
    max_size=1024 * 1024 * 1024,  # 1GB max upload
    upload_expires=timedelta(days=7),  # Files expire after 7 days
    cors_enabled=True,  # Enable CORS
    extensions={  # Supported tus extensions
        "creation",
        "creation-with-upload",
        "creation-defer-length", 
        "termination",
        "checksum",
        "expiration"
    }
)
```

## License

MIT

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "asgi-tus",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.12",
    "maintainer_email": null,
    "keywords": "asgi, fastapi, resumable, starlette, tus, upload",
    "author": null,
    "author_email": "Daniel Keywan Hollister <daniel.hollister@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e0/ba/a5708f3d1dc30f6cae7c3ebd57bf4bc407e58c0240e3db1320756d2688b4/asgi_tus-0.1.0.tar.gz",
    "platform": null,
    "description": "# asgi-tus\n\nA Python ASGI implementation of the [tus resumable upload protocol](https://tus.io/protocols/resumable-upload/).\n\n## Features\n\n- Full [tus protocol 1.0.0](https://tus.io/protocols/resumable-upload/) compliance\n- Support for all standard extensions: `creation`, `creation-with-upload`, `creation-defer-length`, `termination`, `checksum`, `expiration`\n- FastAPI and Starlette integrations in addition to pure ASGI\n- File storage backend with cleanup support\n- CORS support for web clients\n- `async`/`await` throughout\n\n## Installation\n\n**Core functionality (ASGI app only):**\n```bash\npip install asgi-tus\n```\n\n**With FastAPI support:**\n```bash\npip install \"asgi-tus[fastapi]\"\n```\n\n**With Starlette support:**\n```bash\npip install \"asgi-tus[starlette]\"\n```\n\n**With development server:**\n```bash\npip install \"asgi-tus[server]\"\n```\n\n**With everything:**\n```bash\npip install \"asgi-tus[all]\"\n```\n\n## Quick Start\n\n### Pure ASGI\n\n*Core functionality with minimal dependencies:*\n\n```python\nfrom asgi_tus import ASGITusApp, FileStorage, TusConfig\nfrom datetime import timedelta\n\n# Configure storage and tus settings\nstorage = FileStorage(\"/tmp/uploads\")\nconfig = TusConfig(\n    max_size=100 * 1024 * 1024,  # 100MB\n    upload_expires=timedelta(hours=24),\n    cors_enabled=True\n)\n\n# Create ASGI app\napp = ASGITusApp(storage, config)\n\n# Run with any ASGI server: uvicorn, hypercorn, etc.\n# uvicorn main:app --host 0.0.0.0 --port 8000\n```\n\n### FastAPI\n\n*Requires: `pip install \"asgi-tus[fastapi]\"`*\n\n```python\nfrom fastapi import FastAPI\nfrom asgi_tus import FileStorage, TusConfig, create_tus_router\nfrom datetime import timedelta\n\napp = FastAPI()\n\n# Configure storage and tus settings\nstorage = FileStorage(\"/tmp/uploads\")\nconfig = TusConfig(\n    max_size=100 * 1024 * 1024,  # 100MB\n    upload_expires=timedelta(hours=24),\n    cors_enabled=True\n)\n\n# Add tus endpoints\ntus_router = create_tus_router(storage, config, prefix=\"/files\")\napp.include_router(tus_router)\n\n# Upload endpoint: http://localhost:8000/files/\n```\n\n### Starlette\n\n*Requires: `pip install \"asgi-tus[starlette]\"`*\n\n```python\nfrom starlette.applications import Starlette\nfrom starlette.routing import Route\nfrom asgi_tus import FileStorage, TusConfig, TusMount\nfrom datetime import timedelta\n\nstorage = FileStorage(\"/tmp/uploads\")\nconfig = TusConfig(\n    max_size=100 * 1024 * 1024,\n    upload_expires=timedelta(hours=24),\n    cors_enabled=True\n)\n\ntus_mount = TusMount(storage, config, path=\"/files\")\n\napp = Starlette(routes=[\n    tus_mount.get_mount()\n])\n\n# Upload endpoint: http://localhost:8000/files/\n```\n\n## Usage\n\nTest the server:\n\n```bash\ncurl -X OPTIONS http://localhost:8000/files/\n```\n\nUpload with a tus client:\n\n```python\n# Python client (pip install tuspy)\nfrom tuspy import TusClient\n\nclient = TusClient(\"http://localhost:8000/files/\")\nuploader = client.uploader(\"./file.zip\")\nuploader.upload()\n```\n\n```javascript\n// JavaScript client (npm install tus-js-client)\nimport * as tus from \"tus-js-client\";\n\nconst upload = new tus.Upload(file, {\n    endpoint: \"http://localhost:8000/files/\",\n    onSuccess: () => console.log(\"Upload complete!\")\n});\n\nupload.start();\n```\n\n## Configuration\n\n```python\nfrom asgi_tus import TusConfig\nfrom datetime import timedelta\n\nconfig = TusConfig(\n    max_size=1024 * 1024 * 1024,  # 1GB max upload\n    upload_expires=timedelta(days=7),  # Files expire after 7 days\n    cors_enabled=True,  # Enable CORS\n    extensions={  # Supported tus extensions\n        \"creation\",\n        \"creation-with-upload\",\n        \"creation-defer-length\", \n        \"termination\",\n        \"checksum\",\n        \"expiration\"\n    }\n)\n```\n\n## License\n\nMIT\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Python ASGI implementation of the tus resumable upload protocol with FastAPI and Starlette integrations.",
    "version": "0.1.0",
    "project_urls": {
        "Documentation": "https://github.com/notdaniel/asgi-tus#readme",
        "Homepage": "https://github.com/notdaniel/asgi-tus",
        "Issues": "https://github.com/notdaniel/asgi-tus/issues",
        "Repository": "https://github.com/notdaniel/asgi-tus"
    },
    "split_keywords": [
        "asgi",
        " fastapi",
        " resumable",
        " starlette",
        " tus",
        " upload"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b30bb88f6b436dff94fb85e165c44044069fd1fbc682c9cfe7b107e5eaf6814c",
                "md5": "c1c57325f95da313c0f359500bbe7f2a",
                "sha256": "f546ebda398ff18a2307945a8b8c29f449303de62923523e4dc1e6099ff3c778"
            },
            "downloads": -1,
            "filename": "asgi_tus-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c1c57325f95da313c0f359500bbe7f2a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 23937,
            "upload_time": "2025-08-06T22:56:38",
            "upload_time_iso_8601": "2025-08-06T22:56:38.419872Z",
            "url": "https://files.pythonhosted.org/packages/b3/0b/b88f6b436dff94fb85e165c44044069fd1fbc682c9cfe7b107e5eaf6814c/asgi_tus-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e0baa5708f3d1dc30f6cae7c3ebd57bf4bc407e58c0240e3db1320756d2688b4",
                "md5": "9ddf67b0363ff543a8ebedd4ed1b907a",
                "sha256": "c483f9e31192ef590cd866f29116a93357a47c02e02c35a4301abafdb784ae19"
            },
            "downloads": -1,
            "filename": "asgi_tus-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "9ddf67b0363ff543a8ebedd4ed1b907a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 61339,
            "upload_time": "2025-08-06T22:56:39",
            "upload_time_iso_8601": "2025-08-06T22:56:39.613939Z",
            "url": "https://files.pythonhosted.org/packages/e0/ba/a5708f3d1dc30f6cae7c3ebd57bf4bc407e58c0240e3db1320756d2688b4/asgi_tus-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-06 22:56:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "notdaniel",
    "github_project": "asgi-tus#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "asgi-tus"
}
        
Elapsed time: 1.02608s