A learning opportunity for a web framework.
Find a file
Joe Kaufeld ced11ac2da 👽️ add optional pydantic support
Pydantic is now an optional dependency, and the middleware provides
proper import guards and fallback behavior if Pydantic is not installed.
Updated docs to clarify installation and configuration steps.
2025-10-11 20:14:46 -04:00
docs 👽️ add optional pydantic support 2025-10-11 20:14:46 -04:00
spiderweb 👽️ add optional pydantic support 2025-10-11 20:14:46 -04:00
static_files staticfiles support\! 2024-08-14 19:27:37 -04:00
templates add {% static ... %} template option 2024-09-16 18:15:39 -04:00
.gitignore 🎉 first commit 2024-07-28 20:46:42 -04:00
conftest.py Testing! 2024-08-26 01:56:08 -04:00
example.py add gzip middleware to example server 2024-10-29 23:27:43 -04:00
example2.py Testing! 2024-08-26 01:56:08 -04:00
example_middleware.py add ability to adjust headers in post_process 2024-10-16 17:26:22 -04:00
LICENSE.txt 📄 update license 2024-09-02 00:38:19 -04:00
poetry.lock ⬆️ Update deps to resolve security issue 2024-09-25 16:07:13 -04:00
pyproject.toml 👽️ add optional pydantic support 2025-10-11 20:14:46 -04:00
README.md 📝 update README 2024-09-03 01:20:04 -04:00

spiderweb

PyPI release version for Spiderweb Gitmoji Code style: Black

As a professional web developer focusing on arcane uses of Django for arcane purposes, it occurred to me a little while ago that I didn't actually know how a web framework worked.

So I built one.

spiderweb is a small web framework, just big enough to hold a spider. Getting started is easy:

poetry add spiderweb-framework

Create a new file and drop this in it:

from spiderweb import SpiderwebRouter
from spiderweb.response import HttpResponse

app = SpiderwebRouter()

@app.route("/")
def index(request):
    return HttpResponse("HELLO, WORLD!")

if __name__ == "__main__":
    app.start()

View the docs here!

My goal with this framework was to do three things:

  1. Learn a lot
  2. Create an unholy blend of Django and Flask
  3. Not look at any existing code. Go off of vibes alone and try to solve all the problems I could think of in my own way

And, honestly, I think I got there. Here's a non-exhaustive list of things this can do:

  • Function-based views
  • Optional Flask-style URL routing
  • Optional Django-style URL routing
  • URLs with variables in them a lá Django
  • Full middleware implementation
  • Limit routes by HTTP verbs
  • Custom error routes
  • Built-in dev server
  • Gunicorn support
  • HTML templates with Jinja2
  • Static files support
  • Cookies (reading and setting)
  • Optional append_slash (with automatic redirects!)
  • CSRF middleware
  • CORS middleware
  • Optional POST data validation middleware with Pydantic
  • Session middleware with built-in session store
  • Database support (using Peewee, but you can use whatever you want as long as there's a Peewee driver for it)
  • Tests (currently roughly 89% coverage)