socketwrench
A webserver based on socket.
Quickstart
Install
pip install socketwrench
Serve a class
from socketwrench import serve
class MyServer:
def hello(self):
return "world"
if __name__ == '__main__':
serve(MyServer)
# OR
# m = MyServer()
# serve(m)
# OR
# serve("my_module.MyServer")
Other Usage Modes
Serve a module
# my_module.py
def hello():
return "world"
python -m socketwrench my_module
Serve a single function on all routes
from socketwrench import serve
def print_request(request):
s = "<h>You made the following request:</h><br/>"
s += f"<b>Method:</b> {request.method}<br/>"
s += f"<b>Route:</b> {request.path.route()}<br/>"
s += f"<b>Headers:</b><br/> {str(request.headers).replace('\n', '<br>')}<br/>"
s += f"<b>Query:</b> {request.path.query_args()}<br/>"
s += f"<b>Body:</b> {request.body}<br/>"
return s
if __name__ == '__main__':
serve(print_request)
(mostly) Full Feature Sample
import logging
from pathlib import Path
from socketwrench.tags import private, post, put, patch, delete, route, methods
logging.basicConfig(level=logging.DEBUG)
class Sample:
def hello(self):
"""A simple hello world function."""
return "world"
@methods("GET", "POST") # do to the label, this will be accessible by both GET and POST requests
def hello2(self, method):
"""A simple hello world function."""
return "world"
def _unserved(self):
"""This function will not be served."""
return "this will not be served"
@private
def unserved(self):
"""This function will not be served."""
return "this will not be served"
@post
def post(self, name):
"""This function will only be served by POST requests."""
return f"hello {name}"
@put
def put(self, name):
"""This function will only be served by PUT requests."""
return f"hello {name}"
@patch
def patch(self, name):
"""This function will only be served by PATCH requests."""
return f"hello {name}"
@delete
def delete(self, name):
"""This function will only be served by DELETE requests."""
return f"hello {name}"
def echo(self, *args, **kwargs):
"""Echos back any query or body parameters."""
if not args and not kwargs:
return
if args:
if len(args) == 1:
return args[0]
return args
elif kwargs:
return kwargs
return args, kwargs
def string(self) -> str:
"""Returns a string response."""
return "this is a string"
def html(self) -> str:
"""Returns an HTML response."""
return "<h1>hello world</h1><br><p>this is a paragraph</p>"
def json(self) -> dict:
"""Returns a JSON response."""
return {"x": 6, "y": 7}
def file(self) -> Path:
"""Returns sample.py as a file response."""
return Path(__file__)
def add(self, x: int, y: int):
"""Adds two numbers together."""
return x + y
def client_addr(self, client_addr):
"""Returns the client address."""
return client_addr
def headers(self, headers) -> dict:
"""Returns the request headers."""
return headers
def query(self, query, *args, **kwargs) -> str:
"""Returns the query string."""
return query
def body(self, body) -> bytes:
"""Returns the request body."""
return body
def method(self, method) -> str:
"""Returns the method."""
return method
def get_route(self, route) -> str:
"""Returns the route."""
return route
def request(self, request) -> dict:
"""Returns the request object."""
return request
def everything(self, request, client_addr, headers, query, body, method, route, full_path):
d = {
"request": request,
"client_addr": client_addr,
"headers": headers,
"query": query,
"body": body,
"method": method,
"route": route,
"full_path": full_path,
}
for k, v in d.items():
print(k, v)
return d
@route("/a/{c}", error_mode="traceback")
def a(self, b, c=5):
print(f"calling a with {b=}, {c=}")
return f"captured {b=}, {c=}"
if __name__ == '__main__':
from socketwrench import serve
s = Sample()
serve(s)
# OR
# serve(Sample)
# OR
# serve("socketwrench.samples.sample.Sample")
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
socketwrench-1.1.1.tar.gz
(21.1 kB
view details)
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 socketwrench-1.1.1.tar.gz.
File metadata
- Download URL: socketwrench-1.1.1.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/4.0.2 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
667f81c8098e76b6d40550f99f3f9d2722956dc3779baaf8ef31488c7a37fb29
|
|
| MD5 |
e29b426b72ffef63c0bbb860b554dd27
|
|
| BLAKE2b-256 |
75fe763cf536e22f79423d701304ca6a15af2ec2ba408b4e831bb42d5f94ee07
|
File details
Details for the file socketwrench-1.1.1-py3-none-any.whl.
File metadata
- Download URL: socketwrench-1.1.1-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/4.0.2 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
670cc7bf24190a08f70c6a58451b8dc6bf72e70620a0b2668c3220fb2ff13bb0
|
|
| MD5 |
3630eaa267ef44e7e5f868f94ed08d9d
|
|
| BLAKE2b-256 |
d0b748624c65c8b5e1079d53fdfe319a1dd589f5c30e2cacacf4829298d4a003
|