Skip to main content

ASGI Middleware for serving Static File.

Project description

ASGIMiddlewareStaticFile

GitHub Pytest Workflow Status codecov Code style: black PyPI - Downloads

ASGI Middleware for serving static file.

Why?

ASGIMiddlewareStaticFile is a solution when we need to distribute the whole project with static files in Docker; or when the deployment environment has very limited resources.

Features

  • Standard ASGI middleware implement
  • Async file IO
  • Support ETag(base on md5(file_size + last_modified) )

Install

pip3 install -U ASGIMiddlewareStaticFile

Usage

Common

Prepare

git clone https://github.com/rexzhang/asgi-middleware-static-file.git
cd asgi-middleware-static-file/example

Test with wget

(venv) ➜  example git:(main) ✗ wget http://127.0.0.1:8000/static/DEMO
--2022-02-10 16:02:07--  http://127.0.0.1:8000/static/DEMO
正在连接 127.0.0.1:8000... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:26 []
正在保存至: “DEMO”

DEMO                                   100%[===========================================================================>]      26  --.-KB/s  用时 0s      

2022-02-10 16:02:08 (529 KB/s) - 已保存 “DEMO” [26/26])

Pure ASGI

Code

example_pure_asgi.py

Start Server

(venv) ➜  example git:(main) ✗ uvicorn example_pure_asgi:app
INFO:     Started server process [7965]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     127.0.0.1:54529 - "GET /static/DEMO HTTP/1.1" 200 OK

Django 3.0+

Code

/example_django/asgi.py

Collect static file

(venv) ➜  example git:(main) cd example_django 
(venv) ➜  example_django git:(main) ✗ python manage.py collectstatic

129 static files copied to '/Users/rex/p/asgi-middleware-static-file/example/example_django/staticfiles'.

Start Server

(venv) ➜  example_django git:(main) ✗ uvicorn example_django.asgi:application
INFO:     Started server process [9107]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     127.0.0.1:61925 - "GET /static/DEMO.txt HTTP/1.1" 200 OK

Quart (Flask like)

Code

example_quart.py

Start Server

(venv) ➜  example git:(main) ✗ uvicorn example_quart:app    
INFO:     Started server process [7989]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     127.0.0.1:56191 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:56212 - "GET /static/DEMO HTTP/1.1" 200 OK

WSGI app eg: Flask, Django on WSGI mode

Code

example_wsgi_app.py

Start Server

(venv) ➜  example git:(main) ✗ uvicorn example_wsgi_app:app
INFO:     Started server process [8020]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     127.0.0.1:63924 - "GET /static/DEMO HTTP/1.1" 200 OK

History

0.6.0 - 20230210

  • Update aiofiles to 23.1.0
  • Use more async API

0.5.0 - 20220909

  • Use more aiofiles api
  • Dropped Python 3.6 support. If you require it, use version 0.4.0
  • Update package for pep517/pep621

v0.4.0 - 20220422

  • Rewrite some code
  • Fix bug #3(Cannot serve files from root (static_url="/" becomes "//"))

v0.3.2

  • Maintenance release
  • Drop Py35

v0.3.1

  • Compatible Py37-

v0.3.0

  • Check cross border access
  • Add more type hints

v0.2.1

  • Fix bug

v0.2.0

  • Update for aiofiles
  • Fix bug

v0.1.0

  • First release

Alternative

TODO

  • zero copy
  • file extension filter,
  • Cache Control

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

ASGIMiddlewareStaticFile-0.6.0.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

ASGIMiddlewareStaticFile-0.6.0-py2.py3-none-any.whl (6.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file ASGIMiddlewareStaticFile-0.6.0.tar.gz.

File metadata

File hashes

Hashes for ASGIMiddlewareStaticFile-0.6.0.tar.gz
Algorithm Hash digest
SHA256 ccccaced8ee40c2785a908c20eecb6111e450e7ad92ceb60482d7b61df2d3b41
MD5 5c3860e352c45ac3cd7f3c71ef4c96b4
BLAKE2b-256 99f54237fd24947bef549a1a701f166b7635d7d873d3a621ceec5b683fbfe445

See more details on using hashes here.

File details

Details for the file ASGIMiddlewareStaticFile-0.6.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for ASGIMiddlewareStaticFile-0.6.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 00e59be4f21fc72a6fcf5d2a0d97334ee0a2f2f7690ca9b25f90879da9a4ef7d
MD5 16afadc53a5cd6b64817ddd9a92af24b
BLAKE2b-256 a2d7c48bc38d2bcf5414b20657845a5447fc8d1c8febaf1782db375bcb0186fe

See more details on using hashes here.

Supported by

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