Skip to content

Implement Python dependency injector library in Azure Functions #865

Open
@Ramkisubramanian

Description

@Ramkisubramanian

Description of Issue

I am trying to implement the dependency injector for Python Azure functions.

i tried to implement it using a Python library called Dependency Injector.
pip install dependency-injector https://python-dependency-injector.ets-labs.org

However, I am getting below error.

Error: "functions.http_app_func. System.Private.CoreLib: Result: Failure Exception: AttributeError: 'dict' object has no attribute 'encode'"

This is the code I am trying to implement. Please have someone guide me here.

function app file name: function_app.py

import azure.functions as func
from fastapi import FastAPI, Depends, Request, Response
from dependency_injector.wiring import inject, Provide
from abstraction.di_container import DIContainer
import logging
import json

from src.config.app_settings import AppSettings 

container = DIContainer()
container.wire(modules=[__name__])

fast_app = FastAPI()


@fast_app.exception_handler(Exception)
async def handle_exception(request: Request, exc: Exception):
    return Response(
        status_code=400,
        content={"message": str(exc)},
    )

@fast_app.get("/")
@inject
async def home(settings: AppSettings = Depends(Provide[DIContainer.app_config])):
    cont_name =  settings.get("ContainerName", "No setting found")
    return {
        "info": f"Try to get values from local.settings using DI {cont_name}" 
    }

@fast_app.get("/v1/test/{test}")
async def get_test(self, 
    test: str):
    return {
        "test": test
    }

app = func.AsgiFunctionApp(app=fast_app, http_auth_level=func.AuthLevel.ANONYMOUS)

Dependency Injector file name: di_container.py

from dependency_injector import containers, providers
from src.config.app_settings import AppSettings

class DIContainer(containers.DeclarativeContainer):
    app_config = providers.Singleton(AppSettings)

Application Setting to read local.settings.json file: app_settings.py

import json
import os
from dependency_injector import containers, providers

class AppSettings:
    def __init__(self, file_path="local.settings.json"):
        self.config_data = {}
        if os.path.exists(file_path):
            with open(file_path, "r", encoding="utf-8") as file:
                data = json.load(file)
                self.config_data = data.get("Values", {})
    
    def get(self, key: str, default=None):
        return os.getenv(key,self.config_data.get(key, default))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions