simple FastCGI sync/async handler in pure python
Project description
Simple FastCGI
simple FastCGI protocol parser and sync/async handler in pure python
Example 1: echo (sync)
import json
from simple_fastcgi import *
class example_handler(HttpResponseMixin, FcgiHandler):
def handle(self):
self.send_response(200, "application/json", self.environ)
if __name__ == "__main__":
with FcgiServer(example_handler) as server:
server.serve_forever()
Example 2: dir listing (async)
import os
import json
import asyncio
from functools import partial
from urllib.parse import parse_qs
from simple_fastcgi import *
async def dir_listing(path):
with os.scandir(path) as it:
for entry in it:
record = {
"name": entry.name
}
try:
if entry.is_dir():
record["type"] = "dir"
elif entry.is_file():
record["type"] = "file"
else:
continue
stat = entry.stat()
record["size"] = stat.st_size
record["mtime"] = int(stat.st_mtime * 1000)
except Exception:
pass
line = json.dumps(record, ensure_ascii = False) + '\n'
yield line
class dir_listing_handler(AsyncHttpResponseMixin, AsyncFcgiHandler):
async def handle(self):
try:
doc_root = self.environ["DOCUMENT_ROOT"]
query = parse_qs(self.environ["QUERY_STRING"])
path = query["path"][0].lstrip("/.")
func = partial(dir_listing, os.path.join(doc_root, path))
return await self.send_response(200, "application/x-ndjson", data = func)
except Exception as e:
return await self.send_response(404)
async def main():
async with AsyncFcgiServer(dir_listing_handler) as server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
API reference
The import module name is simple_fastcgi
Exceptions
ProtocolError
Raised when encountered FastCGI protocol violations.
Handlers
class FcgiHandler
FastCGI Handler, subclass of BaseRequestHandler. To implement your own handler, subclass FcgiHandler and override the handle() method.
environ
Member environ is a dictionary containing key-value pairs from the webserver. The keys are converted to upper-case.
server
Member server refers to the server object that creates this handler.
handle()
Override this method and do all the work here to serve a request.
aborted()
Check if the FastCGI request has been aborted by the webserver.
read(sz = -1)
Read and return up to sz bytes from input stream. If sz < 0, read until EOF. Returns empty bytes object on EOF.
readinto(buffer)
Read from input stream into buffer, return the actual read byte count. Returns 0 on EOF.
readall()
Read input stream until EOF and return all the data.
write(data, *, flush = False)
Write data to the output stream. If flush is True, flush the data to underlying socket.
write_err(data)
Write data to the error stream.
class AsyncFcgiHandler
Async variant of FcgiHandler. methods are the same, except being async.
environ
server
async handle()
aborted()
async read(sz = -1)
async readinto(buffer)
async readall()
async write(data, *, flush = False)
async write_err(data)
Servers
class FcgiServer
Subclass of BaseServer, but instead listening on FCGI_LISTENSOCK_FILENO ( fd 0 ). Can be used with context manager.
__init__(handler, sockfd = sys.stdin.fileno())
Initialize a server object. Subclass may override and do extra initialization.
handler is the handler-class which is instantiated on each request.
sockfd is a listening socket on which the server is running, defaults to fd 0 in conforming to FastCGI Specification.
fileno()
Get the underlying fd of the server object. Returns sockfd.
shutdown()
Stop the server.
serve_forever()
Start the server and block until shutdown.
service_actions()
Called in serve_forever loop. Subclass may override and do their own actions.
class AsyncFcgiServer
Async variant of FcgiServer. methods are the same, except being async. Can be used with async context manager.
Note there is no service_actions() in AsyncFcgiServer, since it runs on event loop instead of its own loop, and one can easily schedule tasks to event loop.
__init__(handler, sockfd = sys.stdin.fileno())
fileno()
get_loop()
Get the event loop on which the server is running.
async shutdown()
async serve_forever()
Mixins
class HttpResponseMixin
Helper mixin class for FcgiServer, to construct CGI/HTTP responses.
send_response(code, /, mime_type = "text/plain", data = None, *, extra_headers = [], flush = True)
Construct a CGI document response and write to output stream.
code is the HTTP status code of the response.
mime_type is the content-type of the response.
extra_headers is the extra HTTP header fields that should be included in the response header.
data is the payload of the response.
- if data is a function, it is assumed to be a generator and called to get chunks of data.
- if data is a string, it is encoded in UTF-8.
- if "json" appears in mime_type and data is not bytes-like, try to encode data as json.
- else, append data to payload as-is.
if data is a function and flush is True, each data chunk is followed by a flush.
Note that you can mix this method with write() calls. For example, you can call this method, passing first data chunk as data parameter, followed by multiple write() calls to append more data.
Also note that this method does not calculate or append a content-length header for you. You need to handle content-length header yourself, either omit this header, or calculate in advance.
send_redirect(target)
Construct a CGI redirect response and write to output stream.
target is the redirect target, it can be either local-Location or client-Location as defined in CGI Specification.
AsyncHttpResponseMixin
Async variant of HttpResponseMixin. methods are the same, except being async
async send_response(code, /, mime_type = "text/plain", data = None, *, extra_headers = [], flush = True)
Note that if data is a function, it is assumed to be an async generator instead.
async send_redirect(target)
Reference
- FastCGI Specification (Unofficial)
- RFC 3875: The Common Gateway Interface (CGI) Version 1.1
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file simple_fastcgi-0.0.4.tar.gz.
File metadata
- Download URL: simple_fastcgi-0.0.4.tar.gz
- Upload date:
- Size: 11.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d7993a1824f4afa5d120d24d1bcc835550e6acf57b32c23389536d112295c9c
|
|
| MD5 |
87d157a4d6cd822a9f1101296be3c371
|
|
| BLAKE2b-256 |
ca952eb030bb3a2ff96b5bd3b925b16118c6dd0a3c5dcc7e0f1b4b9f1b91fc01
|
Provenance
The following attestation bundles were made for simple_fastcgi-0.0.4.tar.gz:
Publisher:
python-publish.yml on USN484259/simple-fastcgi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simple_fastcgi-0.0.4.tar.gz -
Subject digest:
9d7993a1824f4afa5d120d24d1bcc835550e6acf57b32c23389536d112295c9c - Sigstore transparency entry: 736810675
- Sigstore integration time:
-
Permalink:
USN484259/simple-fastcgi@e9ff1ab14cc4c79b365847896e90a28a9ae7bd91 -
Branch / Tag:
refs/tags/v0.0.4 - Owner: https://github.com/USN484259
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@e9ff1ab14cc4c79b365847896e90a28a9ae7bd91 -
Trigger Event:
release
-
Statement type:
File details
Details for the file simple_fastcgi-0.0.4-py3-none-any.whl.
File metadata
- Download URL: simple_fastcgi-0.0.4-py3-none-any.whl
- Upload date:
- Size: 10.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e915a9d071e204147ec792cb7a6457520b362207fb848efb6132d06983dd7fd
|
|
| MD5 |
be0d794588e6d3eef9248f613b673e87
|
|
| BLAKE2b-256 |
c4f8db472328f7738f303477098b24b71a5c102204c920adf02458a357fa3285
|
Provenance
The following attestation bundles were made for simple_fastcgi-0.0.4-py3-none-any.whl:
Publisher:
python-publish.yml on USN484259/simple-fastcgi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simple_fastcgi-0.0.4-py3-none-any.whl -
Subject digest:
1e915a9d071e204147ec792cb7a6457520b362207fb848efb6132d06983dd7fd - Sigstore transparency entry: 736810676
- Sigstore integration time:
-
Permalink:
USN484259/simple-fastcgi@e9ff1ab14cc4c79b365847896e90a28a9ae7bd91 -
Branch / Tag:
refs/tags/v0.0.4 - Owner: https://github.com/USN484259
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@e9ff1ab14cc4c79b365847896e90a28a9ae7bd91 -
Trigger Event:
release
-
Statement type: