Fastipy is a fast and easy-to-use open source Python library for developing RESTful APIs. Inspired by the FastAPI and Fastify syntax and powered by uvicorn ASGI web server.
Project description
Fastipy
What is it and what is it for
Fastipy is a fast and easy-to-use open source Python library for developing RESTful APIs.
Powered by uvicorn
Installation
pip install fastipy
Examples
Example for GET Route with Query Params and debug mode
from fastipy import Fastipy, Request, Reply
# Debug mode is False by default
app = Fastipy()
# Routes can be async or sync functions, but reply send functions are async
# The handler returns the default HTTP status code 200
@app.get('/')
def home(req: Request, reply: Reply):
# Get query params age
age = req.query['age']
# Example: Recovery all persons from database with this age and print the html
print("<h1>Listing all persons</h1><ul><li>A Person</li></ul>")
Example for GET Route with Params, CORS and multiple methods
from fastipy import Fastipy, Request, Reply
app = Fastipy().cors()
@app.get('/user/:id')
@app.post('/user/:id')
async def getUser(req: Request, reply: Reply):
# get users from database
for i in users:
if i["id"] == req.params["id"]:
await reply.json(i).send()
return
await reply.send_code(404)
Example for POST Route with Body
from fastipy import Fastipy, Request, Reply
app = Fastipy()
@app.post('/user')
async def createUser(req: Request, reply: Reply):
user = req.body.json
# Save user in database
await reply.text("Created").code(201).send()
Example for PUT Route with Body
from fastipy import Fastipy, Request, Reply
app = Fastipy()
@app.put('/user')
async def createUser(req: Request, reply: Reply):
user = req.body.json
# Update user in database
await reply.html('<h1>Created</h1>').code(201).send()
See more examples in examples folder
Creating plugins
# chat.py
from fastipy import FastipyInstance, Reply
# Plugins can be asynchronous or synchronized functions
# Plugins have the main instance as a parameter, which means they can use all of Fastipy's functions
def chatRoutes(app: FastipyInstance, options: dict):
@app.get('/')
async def index(req: Request, reply: Reply):
await reply.send_code(200)
@app.get('/chat')
async def test(req: Request, reply: Reply):
await reply.send_code(200)
# message.py
from fastipy import FastipyInstance, Reply
async def messageRoutes(app: FastipyInstance, options: dict):
@message.get('/')
async def index(req: Request, reply: Reply):
await reply.send_code(200)
@message.get('/message')
async def test(req: Request, reply: Reply):
await reply.send_code(200)
app.name('custom plugin name')
# main.py
from fastipy import Fastipy
from message import messageRoutes
from chat import chatRoutes
app = Fastipy().cors()
app.register(messageRoutes, {'prefix': '/message'})
app.register(chatRoutes, {'prefix': '/chat'})
Hooks
from fastipy import Fastipy, Request, Reply
app = Fastipy()
# The preHandler hook is called before the request handler
@app.hook('preHandler')
def preHandler(req: Request, reply: Reply):
print('onRequest hook')
# The onRequest hook is called when the request is handled
@app.hook('onRequest')
def onRequest(req: Request, reply: Reply):
print('onRequest hook')
# The onResponse hook is called when the reply sends a response
@app.hook('onResponse')
def onResponse(req: Request, reply: Reply):
print('onResponse hook')
# The onError hook is called when an error occurs
@app.hook('onError')
def onError(req: Request, reply: Reply, error):
print('onError hook')
# A hook will only be linked to a route if its declaration precedes the route
# The order of hooks of the same type is important
@app.get('/')
async def index(req: Request, reply: Reply):
await reply.send_code(200)
Running
Run Fastipy application in development is easy
import uvicorn
if __name__ == "__main__":
# main:app indicates the FILE:VARIABLE
# The file is the main file where Fastipy() is instantiated
# The variable is the name of the variable that contains the instance of Fastipy()
# You can find more configurations here https://www.uvicorn.org/
config = uvicorn.Config('main:app', log_level='debug', port=3000)
server = uvicorn.Server(config)
server.run()
Application Deploy
For production deployment, please refer to this uvicorn guide.
Change Log
Version 1.5.0
Added
- Request method PATCH
- More security in CORS
- JSON Database module
- Add support to hooks (onRequest, onResponse, onError)
- Add support to plugins
- Add decorators to routes (decorator, decorate_request, decorate_reply)
- Add support to middlewares
- Add support for lifespan events (startup, shutdown)
- New preHandler hook
- Add stream file support
- Automatic OPTIONS method response for routes
- Custom global error handler
Changed
- Better params and query params recovery in routes
- Improved route logging
- Refactor structure of project
- Refactor Routes class
- Routes handler can be a sync function
- Better route search algorithm and structure
- It is now possible to add specific hooks and middlewares to a route
- Implementation of uvicorn HTTP web server
- Better error handler
Contributors
How to Contributing
Open pull request 😎
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
fastipy-1.5.0.tar.gz
(32.6 kB
view hashes)
Built Distribution
fastipy-1.5.0-py3-none-any.whl
(38.9 kB
view hashes)