FuncTown
is a python library that is designed to make your life with Azure Functions
easier.
The core features of FuncTown
are:
- Error handling - automatically handle errors and return a response to the user
- Debugging - Set debug flags that automatically return logs and traces as part of error responses from your function
- JWT token validation - automatically validate JWT tokens and provide the user information
-
Request argument parsing - automatically parse arguments from the
HttpRequest
and provide them to your function - Metrics - Handle connections to Application Insights and gives you easy to use metrics objects
- Logging, Tracing & Events - Log your functions data directly into Application Insights
For detailed features see the docs.
You can install FuncTown
using pip
:
pip install functown
Note that some dependencies are hidden behind sub-packages (e.g.
functown[jwt]
for JWT token validation).
Almost all functionality of FuncTown
is provided through decorators.
If you want to add error handling to your function:
from logging import Logger
from functown import ErrorHandler
@ErrorHandler(debug=True, enable_logger=True)
def main(req: func.HttpRequest, logger: Logger, **kwargs) -> func.HttpResponse:
logger.info('Python HTTP trigger function processed a request.')
# ...
# exception will be caught and handled by the decorator (returning a 500)
raise ValueError("something went wrong")
return func.HttpResponse("success", status_code=200)
Note: Decorators might pass down additional arguments to your function, so it is generally a good idea to modify your function signature to accept these arguments (see docs for more information) and add a
**kwargs
to the end.
Decorators are also stackable, so we could parse function arguments and handle a JWT Token in the same function:
from functown import ArgsHandler, RequestArgHandler, AuthHandler
from functown.auth import Token
@ArgsHandler()
@AuthHandler(scopes=["user.read"])
def main(
req: func.HttpRequest, args: RequestArgHandler, token: Token
) -> func.HttpResponse:
# retrieve some arguments
data = args.get_body_query("data_name", required=True, allowed=["foo", "bar"])
switch = args.get_body("bool_name", map_fct='bool')
file = args.get_file('file_name', required=True)
# check the user id
user_id = token.user_id
# ...
This would also directly fail with a 400
message if there is no token provided,
or the token does not contain the required scopes.
Be sure to check out the docs for a full overview of all decorators.
If you want to test it on your own Azure Subscription, you can check out the example guide in the dev section of the docs.
🎷 Welcome to FuncTown! 🎷