TheDataFox
TheDataFox

Reputation: 334

FastAPI and Pydantic RecursionError Causing Exception in ASGI application

Description

I've seen similar issues about self-referencing Pydantic models causing RecursionError: maximum recursion depth exceeded in comparison but as far as I can tell there are no self-referencing models included in the code. I'm just just using Pydantic's BaseModel class.

The code runs successfully until the function in audit.py below tries to return the output from the model.

I've included the full traceback as I'm not sure where to begin with this error. I've run the code with PyCharm and without an IDE and it always produces the traceback below but doesn't crash the app but returns a http status code of 500 to the front end.

Any advice would be much appreciated.

As suggested I have also tried sys.setrecursionlimit(1500) to increase the recursion limit.

Environment

App

main.py

import uvicorn
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware


from app.api.routes.router import api_router
from app.core.logging import init_logging
from app.core.config import settings

init_logging()


def get_app() -> FastAPI:
    application = FastAPI(title=settings.APP_NAME, version=settings.APP_VERSION, debug=settings.DEBUG)

    if settings.BACKEND_CORS_ORIGINS:
        # middleware support for cors
        application.add_middleware(
            CORSMiddleware,
            allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
            allow_credentials=True,
            allow_methods=["*"],
            allow_headers=["*"],
        )
    application.include_router(api_router, prefix=settings.API_V1_STR)
    return application


app = get_app()

if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=80)

router.py

from fastapi import APIRouter

from app.api.routes import audit

api_router = APIRouter()
api_router.include_router(audit.router, tags=["audit"], prefix="/audit")

audit.py

import validators
from fastapi import APIRouter, HTTPException
from loguru import logger

from app.api.dependencies.audit import analyzer
from app.schemas.audit import AuditPayload, AuditResult

router = APIRouter()


@router.post("/", response_model=AuditResult, name="audit", status_code=200)
async def post_audit(payload: AuditPayload) -> AuditResult:
    logger.info("Audit request received")
    # validate URL
    try:
        logger.info("Validating URL")
        validators.url(payload.url)
    except HTTPException:
        HTTPException(status_code=404, detail="Invalid URL.")
        logger.exception("HTTPException - Invalid URL")

    # generate output from route audit.py
    logger.info("Running audit analysis. This could take up to 10 minutes. Maybe grab a coffee...")
    analyzed_output = analyzer.analyze(url=payload.url,
                                       brand=payload.brand,
                                       twitter_screen_name=payload.twitter_screen_name,
                                       facebook_page_name=payload.facebook_page_name,
                                       instagram_screen_name=payload.instagram_screen_name,
                                       youtube_user_name=payload.youtube_user_name,
                                       ignore_robots=payload.ignore_robots,
                                       ignore_sitemap=payload.ignore_sitemap,
                                       google_analytics_view_id=payload.google_analytics_view_id)
    output = AuditResult(**analyzed_output)
    return output 

audit_models.py

from pydantic import BaseModel


class AuditPayload(BaseModel):
    url: str
    brand: str
    twitter_screen_name: str
    facebook_page_name: str
    instagram_screen_name: str
    youtube_user_name: str
    ignore_robots: bool
    ignore_sitemap: bool
    google_analytics_view_id: str


class AuditResult(BaseModel):
    base_url: str
    run_time: float
    website_404: dict
    website_302: dict
    website_h1_tags: dict
    website_duplicate_h1: dict
    website_h2_tags: dict
    website_page_duplications: dict
    website_page_similarities: dict
    website_page_desc_duplications: dict
    website_page_title_duplications: dict
    pages: list
    pages_out_links_404: dict = None
    pages_canonicals: dict
    seo_phrases: dict
    social: dict
    google_analytics_report: dict
    google_psi_desktop: dict
    google_psi_mobile: dict
    google_algo_updates: dict
    google_sb: list
    robots_txt: list

This line throws the error in the logs: 2020-09-10 10:02:31.483 | ERROR | uvicorn.protocols.http.h11_impl:run_asgi:391 - Exception in ASGI application

I believe this bit is the most relevant to understanding why this error is occuring:

  File "pydantic\main.py", line 623, in pydantic.main.BaseModel._get_value
  [Previous line repeated 722 more times]

Full traceback:

Traceback (most recent call last):
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\pydevconsole.py", line 483, in <module>
    pydevconsole.start_client(host, port)
    │            │            │     └ 50488
    │            │            └ '127.0.0.1'
    │            └ <function start_client at 0x000001BCEDC19D08>
    └ <module 'pydevconsole' from 'C:\\Users\\<user>\\AppData\\Local\\JetBrains\\Toolbox\\apps\\PyCharm-P\\ch-0\\202.6948.78\\pl...
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\pydevconsole.py", line 411, in start_client
    process_exec_queue(interpreter)
    │                  └ <_pydev_bundle.pydev_ipython_console.InterpreterInterface object at 0x000001BCEDC1BF98>
    └ <function process_exec_queue at 0x000001BCEDC19A60>
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\pydevconsole.py", line 258, in process_exec_queue
    more = interpreter.add_exec(code_fragment)
           │           │        └ <_pydev_bundle.pydev_console_types.CodeFragment object at 0x000001BCEDCFE748>
           │           └ <function BaseCodeExecutor.add_exec at 0x000001BCECF38488>
           └ <_pydev_bundle.pydev_ipython_console.InterpreterInterface object at 0x000001BCEDC1BF98>
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\_pydev_bundle\pydev_code_executor.py", line 106, in add_exec
    more = self.do_add_exec(code_fragment)
           │    │           └ <_pydev_bundle.pydev_console_types.CodeFragment object at 0x000001BCEDCFE748>
           │    └ <function InterpreterInterface.do_add_exec at 0x000001BCEDC15D90>
           └ <_pydev_bundle.pydev_ipython_console.InterpreterInterface object at 0x000001BCEDC1BF98>
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\_pydev_bundle\pydev_ipython_console.py", line 36, in do_add_exec
    res = bool(self.interpreter.add_exec(code_fragment.text))
               │    │           │        │             └ "runfile('E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py', wdir='E:/Users/<user>/Docume...
               │    │           │        └ <_pydev_bundle.pydev_console_types.CodeFragment object at 0x000001BCEDCFE748>
               │    │           └ <function _PyDevFrontEnd.add_exec at 0x000001BCEDC15A60>
               │    └ <_pydev_bundle.pydev_ipython_console_011._PyDevFrontEnd object at 0x000001BCEDC350B8>
               └ <_pydev_bundle.pydev_ipython_console.InterpreterInterface object at 0x000001BCEDC1BF98>
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\_pydev_bundle\pydev_ipython_console_011.py", line 483, in add_exec
    self.ipython.run_cell(line, store_history=True)
    │    │       │        └ "runfile('E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py', wdir='E:/Users/<user>/Docume...
    │    │       └ <function InteractiveShell.run_cell at 0x000001BCED5E7268>
    │    └ <_pydev_bundle.pydev_ipython_console_011.PyDevTerminalInteractiveShell object at 0x000001BCEDC350F0>
    └ <_pydev_bundle.pydev_ipython_console_011._PyDevFrontEnd object at 0x000001BCEDC350B8>
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 2843, in run_cell
    raw_cell, store_history, silent, shell_futures)
    │         │              │       └ True
    │         │              └ False
    │         └ True
    └ "runfile('E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py', wdir='E:/Users/<user>/Docume...
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 2869, in _run_cell
    return runner(coro)
           │      └ <generator object InteractiveShell.run_cell_async at 0x000001BCEDC49C78>
           └ <function _pseudo_sync_runner at 0x000001BCED5D0C80>
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\async_helpers.py", line 67, in _pseudo_sync_runner
    coro.send(None)
    │    └ <method 'send' of 'generator' objects>
    └ <generator object InteractiveShell.run_cell_async at 0x000001BCEDC49C78>
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3044, in run_cell_async
    interactivity=interactivity, compiler=compiler, result=result)
                  │                       │                └ <ExecutionResult object at 1bcedcd3470, execution_count=2 error_before_exec=None error_in_exec=None info=<ExecutionInfo objec...
                  │                       └ <IPython.core.compilerop.CachingCompiler object at 0x000001BCEDC356D8>
                  └ 'last_expr'
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3215, in run_ast_nodes
    if (yield from self.run_code(code, result)):
                   │    │        │     └ <ExecutionResult object at 1bcedcd3470, execution_count=2 error_before_exec=None error_in_exec=None info=<ExecutionInfo objec...
                   │    │        └ <code object <module> at 0x000001BCEDCDADB0, file "<ipython-input-2-086756a0f1dd>", line 1>
                   │    └ <function InteractiveShell.run_code at 0x000001BCED5E76A8>
                   └ <_pydev_bundle.pydev_ipython_console_011.PyDevTerminalInteractiveShell object at 0x000001BCEDC350F0>
  File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3291, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
         │         │    │               │    └ {'__name__': 'pydev_umd', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None,...
         │         │    │               └ <_pydev_bundle.pydev_ipython_console_011.PyDevTerminalInteractiveShell object at 0x000001BCEDC350F0>
         │         │    └ <property object at 0x000001BCED5D8958>
         │         └ <_pydev_bundle.pydev_ipython_console_011.PyDevTerminalInteractiveShell object at 0x000001BCEDC350F0>
         └ <code object <module> at 0x000001BCEDCDADB0, file "<ipython-input-2-086756a0f1dd>", line 1>
  File "<ipython-input-2-086756a0f1dd>", line 1, in <module>
    runfile('E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py', wdir='E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app')
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
    │             │        │         │            └ {'__name__': '__main__', '__doc__': "\nMain entry point into API for endpoints related to HawkSense's main functionality.\nto...
    │             │        │         └ {'__name__': '__main__', '__doc__': "\nMain entry point into API for endpoints related to HawkSense's main functionality.\nto...
    │             │        └ 'E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py'
    │             └ <function execfile at 0x000001BCECC521E0>
    └ <module '_pydev_bundle.pydev_imports' from 'C:\\Users\\<user>\\AppData\\Local\\JetBrains\\Toolbox\\apps\\PyCharm-P\\ch-0\\...
  File "C:\Users\<user>\AppData\Local\JetBrains\Toolbox\apps\PyCharm-P\ch-0\202.6948.78\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
                 │              │              │     └ {'__name__': '__main__', '__doc__': "\nMain entry point into API for endpoints related to HawkSense's main functionality.\nto...
                 │              │              └ {'__name__': '__main__', '__doc__': "\nMain entry point into API for endpoints related to HawkSense's main functionality.\nto...
                 │              └ 'E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app/main.py'
                 └ '#!/usr/bin/env python\n\n"""\nMain entry point into API for endpoints related to HawkSense\'s main functionality.\ntodo: htt...
  File "E:/Users/<user>/Documents/GitHub/HawkSense/backend/app/app\main.py", line 47, in <module>
    uvicorn.run("main:app", host="127.0.0.1", port=80)  # for debug only
    │       └ <function run at 0x000001BCEDE041E0>
    └ <module 'uvicorn' from 'C:\\Program Files\\Python37\\lib\\site-packages\\uvicorn\\__init__.py'>
  File "C:\Program Files\Python37\lib\site-packages\uvicorn\main.py", line 362, in run
    server.run()
    │      └ <function Server.run at 0x000001BCEDE4B510>
    └ <uvicorn.main.Server object at 0x000001BCFC722198>
  File "C:\Program Files\Python37\lib\site-packages\uvicorn\main.py", line 390, in run
    loop.run_until_complete(self.serve(sockets=sockets))
    │    │                  │    │             └ None
    │    │                  │    └ <function Server.serve at 0x000001BCEDE4B598>
    │    │                  └ <uvicorn.main.Server object at 0x000001BCFC722198>
    │    └ <function BaseEventLoop.run_until_complete at 0x000001BCED49FE18>
    └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\Program Files\Python37\lib\asyncio\base_events.py", line 560, in run_until_complete
    self.run_forever()
    │    └ <function BaseEventLoop.run_forever at 0x000001BCED49FD90>
    └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\Program Files\Python37\lib\asyncio\base_events.py", line 528, in run_forever
    self._run_once()
    │    └ <function BaseEventLoop._run_once at 0x000001BCED4A27B8>
    └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\Program Files\Python37\lib\asyncio\base_events.py", line 1764, in _run_once
    handle._run()
    │      └ <function Handle._run at 0x000001BCED43AB70>
    └ <Handle <TaskStepMethWrapper object at 0x000001BCFC7D4B00>()>
  File "C:\Program Files\Python37\lib\asyncio\events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
    │    │            │    │           └ <Handle <TaskStepMethWrapper object at 0x000001BCFC7D4B00>()>
    │    │            │    └ <member '_callback' of 'Handle' objects>
    │    │            └ <Handle <TaskStepMethWrapper object at 0x000001BCFC7D4B00>()>
    │    └ <member '_context' of 'Handle' objects>
    └ <Handle <TaskStepMethWrapper object at 0x000001BCFC7D4B00>()>
> File "C:\Program Files\Python37\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 388, in run_asgi
    result = await app(self.scope, self.receive, self.send)
                   │   │    │      │    │        │    └ <function RequestResponseCycle.send at 0x000001BCFC757840>
                   │   │    │      │    │        └ <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>
                   │   │    │      │    └ <function RequestResponseCycle.receive at 0x000001BCFC7578C8>
                   │   │    │      └ <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>
                   │   │    └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
                   │   └ <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>
                   └ <uvicorn.middleware.proxy_headers.ProxyHeadersMiddleware object at 0x000001BCFC722BA8>
  File "C:\Program Files\Python37\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
                 │    │   │      │        └ <bound method RequestResponseCycle.send of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>>
                 │    │   │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
                 │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
                 │    └ <fastapi.applications.FastAPI object at 0x000001BCFC722710>
                 └ <uvicorn.middleware.proxy_headers.ProxyHeadersMiddleware object at 0x000001BCFC722BA8>
  File "C:\Program Files\Python37\lib\site-packages\fastapi\applications.py", line 149, in __call__
    await super().__call__(scope, receive, send)
                           │      │        └ <bound method RequestResponseCycle.send of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>>
                           │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
                           └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
  File "C:\Program Files\Python37\lib\site-packages\starlette\applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
          │    │                │      │        └ <bound method RequestResponseCycle.send of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4A90>>
          │    │                │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │                └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <starlette.middleware.errors.ServerErrorMiddleware object at 0x000001BCFC7B8FD0>
          └ <fastapi.applications.FastAPI object at 0x000001BCFC722710>
  File "C:\Program Files\Python37\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "C:\Program Files\Python37\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
          │    │   │      │        └ <function ServerErrorMiddleware.__call__.<locals>._send at 0x000001BCFC72AE18>
          │    │   │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <starlette.middleware.cors.CORSMiddleware object at 0x000001BCFC7B8F60>
          └ <starlette.middleware.errors.ServerErrorMiddleware object at 0x000001BCFC7B8FD0>
  File "C:\Program Files\Python37\lib\site-packages\starlette\middleware\cors.py", line 84, in __call__
    await self.simple_response(scope, receive, send, request_headers=headers)
          │    │               │      │        │                     └ Headers({'host': '127.0.0.1', 'connection': 'keep-alive', 'content-length': '295', 'accept': 'application/json', 'user-agent'...
          │    │               │      │        └ <function ServerErrorMiddleware.__call__.<locals>._send at 0x000001BCFC72AE18>
          │    │               │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │               └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <function CORSMiddleware.simple_response at 0x000001BCEE53DC80>
          └ <starlette.middleware.cors.CORSMiddleware object at 0x000001BCFC7B8F60>
  File "C:\Program Files\Python37\lib\site-packages\starlette\middleware\cors.py", line 140, in simple_response
    await self.app(scope, receive, send)
          │    │   │      │        └ functools.partial(<bound method CORSMiddleware.send of <starlette.middleware.cors.CORSMiddleware object at 0x000001BCFC7B8F60...
          │    │   │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <starlette.exceptions.ExceptionMiddleware object at 0x000001BCFC7B8E48>
          └ <starlette.middleware.cors.CORSMiddleware object at 0x000001BCFC7B8F60>
  File "C:\Program Files\Python37\lib\site-packages\starlette\exceptions.py", line 82, in __call__
    raise exc from None
  File "C:\Program Files\Python37\lib\site-packages\starlette\exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
          │    │   │      │        └ <function ExceptionMiddleware.__call__.<locals>.sender at 0x000001BCFC7C18C8>
          │    │   │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <fastapi.routing.APIRouter object at 0x000001BCFC7220F0>
          └ <starlette.exceptions.ExceptionMiddleware object at 0x000001BCFC7B8E48>
  File "C:\Program Files\Python37\lib\site-packages\starlette\routing.py", line 550, in __call__
    await route.handle(scope, receive, send)
          │     │      │      │        └ <function ExceptionMiddleware.__call__.<locals>.sender at 0x000001BCFC7C18C8>
          │     │      │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │     │      └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │     └ <function Route.handle at 0x000001BCEE4FF6A8>
          └ <fastapi.routing.APIRoute object at 0x000001BCFC7B8E80>
  File "C:\Program Files\Python37\lib\site-packages\starlette\routing.py", line 227, in handle
    await self.app(scope, receive, send)
          │    │   │      │        └ <function ExceptionMiddleware.__call__.<locals>.sender at 0x000001BCFC7C18C8>
          │    │   │      └ <bound method RequestResponseCycle.receive of <uvicorn.protocols.http.h11_impl.RequestResponseCycle object at 0x000001BCFC7D4...
          │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.1'}, 'http_version': '1.1', 'server': ('127.0.0.1', 80), 'clie...
          │    └ <function request_response.<locals>.app at 0x000001BCFC7C1A60>
          └ <fastapi.routing.APIRoute object at 0x000001BCFC7B8E80>
  File "C:\Program Files\Python37\lib\site-packages\starlette\routing.py", line 41, in app
    response = await func(request)
                     │    └ <starlette.requests.Request object at 0x000001BCFC7D4588>
                     └ <function get_request_handler.<locals>.app at 0x000001BCFC7C19D8>
  File "C:\Program Files\Python37\lib\site-packages\fastapi\routing.py", line 213, in app
    is_coroutine=is_coroutine,
                 └ True
  File "C:\Program Files\Python37\lib\site-packages\fastapi\routing.py", line 113, in serialize_response
    exclude_none=exclude_none,
                 └ False
  File "C:\Program Files\Python37\lib\site-packages\fastapi\routing.py", line 65, in _prepare_response_content
    exclude_none=exclude_none,
                 └ False
  File "pydantic\main.py", line 386, in pydantic.main.BaseModel.dict
  File "pydantic\main.py", line 706, in _iter
  File "pydantic\main.py", line 623, in pydantic.main.BaseModel._get_value
  File "pydantic\main.py", line 623, in pydantic.main.BaseModel._get_value
  File "pydantic\main.py", line 623, in pydantic.main.BaseModel._get_value
  [Previous line repeated 722 more times]
  File "pydantic\main.py", line 605, in pydantic.main.BaseModel._get_value
  File "C:\Program Files\Python37\lib\abc.py", line 139, in __instancecheck__
    return _abc_instancecheck(cls, instance)
           │                  │    └ 8
           │                  └ <class 'pydantic.main.BaseModel'>
           └ <built-in function _abc_instancecheck>
RecursionError: maximum recursion depth exceeded in comparison```

Upvotes: 9

Views: 79354

Answers (3)

TheDataFox
TheDataFox

Reputation: 334

This was a simple issue that was resolved by amending the output response to match the pydantic model.

This involved ensuring output within audit.py was the same structure and data types as those specified in the AuditResult class from the pydantic model.

Upvotes: 3

inspaya
inspaya

Reputation: 1

In my own case, I was referencing a cache key from Redis that hadn't been created yet.

Upvotes: 0

omolade ariyo
omolade ariyo

Reputation: 3

ERROR: Exception in ASGI application

Simply means one or more of the .py files have not been saved before trying to test/run

Upvotes: -3

Related Questions