{ "info": { "author": "Jordan Eremieff", "author_email": "jordan@eremieff.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7" ], "description": "# asgi-s3\n\n\n \"Package\n\n\n \"Build\n\n\n\nStatic file management tools and [ASGI](https://asgi.readthedocs.io/en/latest/) middleware support for [Amazon S3](https://aws.amazon.com/s3/). \n\n**Work in Progress**: A lot of what is here currently will be changing, not recommended for any serious usage at this point.\n\n**Requirements**: Python 3.6+\n\n## Installation\n\n```shell\npip install asgi-s3\n```\n\n...but you probably just want to clone the `master` branch for the moment.\n\n## CLI\n\n```shell\ns3 create-bucket Create a new S3 bucket.\n\ns3 list-buckets List all S3 buckets.\n\ns3 sync-bucket Sync a bucket with a local static file directory.\n```\n\n...todo\n\n## Middleware\n\nThe middleware is designed to work with any ASGI application. Here is raw ASGI example:\n\n```python\nfrom asgi_s3.middleware import S3StorageMiddleware, s3_url_for\n\n\nAWS_ACCESS_KEY_ID = \"access-key-id\"\nAWS_SECRET_ACCESS_KEY = \"secret-access-key\"\nBUCKET_NAME = \"my-bucket\"\nREGION_NAME = \"region-name\"\nSTATIC_DIR = \"path/to/static/files\"\n\n\nasync def app(scope, receive, send):\n await send(\n {\n \"type\": \"http.response.start\",\n \"status\": 200,\n \"headers\": [[b\"content-type\", b\"text/html; charset=utf-8\"]],\n }\n )\n html_content = f\"\"\"\n \n \n \n ASGI S3 example\n \n \n \n Hello, world.\n \n \n \"\"\"\n await send({\"type\": \"http.response.body\", \"body\": html_content.encode()})\n\n\napp = S3StorageMiddleware(\n app,\n bucket_name=BUCKET_NAME,\n static_dir=STATIC_DIR,\n region_name=REGION_NAME,\n aws_access_key_id=AWS_ACCESS_KEY_ID,\n aws_secret_access_key=AWS_SECRET_ACCESS_KEY,\n)\n```\n\nAnd here is an example using [Starlette](https://www.starlette.io/):\n\n```python\nfrom starlette.applications import Starlette\nfrom starlette.templating import Jinja2Templates\n\nfrom asgi_s3.middleware import S3StorageMiddleware, s3_url_for\n\n\ntemplates = Jinja2Templates(\"templates\")\napp = Starlette()\n\n@app.route(\"/\")\ndef homepage(request):\n return templates.TemplateResponse(\n \"index.html\", {\"request\": request, \"s3_url_for\": s3_url_for}\n )\n\n\nAWS_ACCESS_KEY_ID = \"access-key-id\"\nAWS_SECRET_ACCESS_KEY = \"secret-access-key\"\nBUCKET_NAME = \"my-bucket\"\nREGION_NAME = \"region-name\"\nSTATIC_DIR = \"path/to/static/files\"\n\n\napp.add_middleware(\n S3StorageMiddleware,\n bucket_name=BUCKET_NAME,\n static_dir=STATIC_DIR,\n region_name=REGION_NAME,\n aws_access_key_id=AWS_ACCESS_KEY_ID,\n aws_secret_access_key=AWS_SECRET_ACCESS_KEY,\n)\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/erm/asgi-s3", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "asgi-s3", "package_url": "https://pypi.org/project/asgi-s3/", "platform": "", "project_url": "https://pypi.org/project/asgi-s3/", "project_urls": { "Homepage": "https://github.com/erm/asgi-s3" }, "release_url": "https://pypi.org/project/asgi-s3/0.0.3/", "requires_dist": null, "requires_python": "", "summary": "ASGI S3 storage", "version": "0.0.3" }, "last_serial": 5611045, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "0384069b9d6121e8bf346e828c7aa183", "sha256": "88d016026c524f11c8c2d6147b442b0117b04fd024821a409d1e68c5b1b6ceac" }, "downloads": -1, "filename": "asgi-s3-0.0.1.tar.gz", "has_sig": false, "md5_digest": "0384069b9d6121e8bf346e828c7aa183", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4470, "upload_time": "2019-07-30T06:40:30", "url": "https://files.pythonhosted.org/packages/46/38/7b0767f52c3b1a4c90b85022392909d5f0b004f8d884f616e8312c48df17/asgi-s3-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "9de882a401696a9031c86d5b2586e64f", "sha256": "068339fe0dd0841db1caa3572a44c01b68076780538e79ff79ce492fe0334b74" }, "downloads": -1, "filename": "asgi-s3-0.0.2.tar.gz", "has_sig": false, "md5_digest": "9de882a401696a9031c86d5b2586e64f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5758, "upload_time": "2019-07-30T09:14:14", "url": "https://files.pythonhosted.org/packages/90/20/0c5155cfb12cc3635a2b600e568d2dcba906437859613d3326fe4d1a9023/asgi-s3-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "8f369f72a2dcf1d846f3bc9557e43e3e", "sha256": "fb6c3dbf83136b9f424d63a75ae66218349c2fc217a7e3dcdf73c69931bbf4c3" }, "downloads": -1, "filename": "asgi-s3-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8f369f72a2dcf1d846f3bc9557e43e3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6746, "upload_time": "2019-07-31T03:08:39", "url": "https://files.pythonhosted.org/packages/c3/dd/ae950e795429cf1b1c2693edbf77400a64387fe8271c02e56ebee18758f8/asgi-s3-0.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8f369f72a2dcf1d846f3bc9557e43e3e", "sha256": "fb6c3dbf83136b9f424d63a75ae66218349c2fc217a7e3dcdf73c69931bbf4c3" }, "downloads": -1, "filename": "asgi-s3-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8f369f72a2dcf1d846f3bc9557e43e3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6746, "upload_time": "2019-07-31T03:08:39", "url": "https://files.pythonhosted.org/packages/c3/dd/ae950e795429cf1b1c2693edbf77400a64387fe8271c02e56ebee18758f8/asgi-s3-0.0.3.tar.gz" } ] }