Fastapi: [QUESTION] Return lists

Created on 25 Feb 2019  Â·  7Comments  Â·  Source: tiangolo/fastapi

Hi there!

First of all, gerat project! Thank You for sharing it!

i'm a somewhat a beginner, i'd like some help if you guys don't mind. (I couldn't find another forum for questions)

I've managed to read a list of objects inside a json, by passing the body like this:

[
  {
    "name": "Item name example 1",
    "price": 100,
    "is_offer": true
  },
  {
    "name": "Item name example 2",
    "price": 100,
    "is_offer": true
  },
  {
    "name": "Item name example 3",
    "price": 100,
    "is_offer": true
  }
]

The objective of my micro example is to receive a list of Items (the same base class of the API example), do some processing (change price value by a fixed factor) and return that altered list.

this works:

@app.put("/items/{item_id}")
def create_item(item_id: int, items: List[Item]):    
    return {"total" : len(items)}

and i can iterate trough the list with

for item in items:

but when i try to return the list with

return {items}

i get "TypeError: unhashable type: 'list'" error.

is there a simple way to return the list? Or i'll need to create the return string manually?

question

Most helpful comment

Awesome @DaviOtero ! :tada:


As always, thanks @euri10 ! :clap: :taco: :cake:

All 7 comments

Awesome! I'm glad you're liking it.

You should be able to:

return items

or:

return {"items": items}

You may (or I may misunderstand what you want to do) be mixing response_model and query parameters

  • to return a list you should have a response_model in the route @app.put("/items/{item_id}", response_model=List[Item])
  • the items: List[Item] part means you want a list of items in the query passed in the put
  • the curly braces around items most likely cast items to a set (not sure about that)

return items

God... it's so simple, i feel bad for not thinking of it.

Thank you guys!

Awesome @DaviOtero ! :tada:


As always, thanks @euri10 ! :clap: :taco: :cake:

Working through the tutorial ( https://fastapi.tiangolo.com/tutorial/ ), hit stumbling block on first try. The command reads:
uvicorn main:app --reload
Is there some environment requirements that are not mentioned? Because that returns:
" 'uvicorn' is not recognized as an internal or external command,
operable program or batch file."
OK, so yes, I'm on a Windows desktop, That's what the employer provides ...
With uvicorn, fastapi, pydantic, etc. in /Lib/site-packages, I'm thinking that this should be equvalent:
[python directory]>python -m uvicorn __main__.py:main --reload
which tries to start, then error:
Error loading ASGI app. Could not import module "__main__.py".
OK, how about:
[python directory]>python -m uvicorn uvicorn.__main__.py:main --reload
Error loading ASGI app. Could not import module "uvicorn.__main__.py".
No? Try this:
[python directory]>python -m uvicorn. __main__.py
Error loading ASGI app. Import string "__main__.py" must be in format ":"
Right, that's why I had it the other way .., Once again:
[python directory]>python -m uvicorn uvicorn:__main__.py --reload
Error loading ASGI app. Attribute "__main__.py" not found in module "uvicorn"
Really odd, I'm looking right at it, in file explorer ...
Anyhow, pretty much stopped at the first command in the tutorial, thanks for any hints.

BTW, this editor delates some characters ( such as uderscores, around __main__ ), and even whole words, so I won't be surprised if you can't read this as I typed it.

@zopefiend Maybe try python -m uvicorn main:main --reload
But make sure in you code, you did:

main = FastAPI()

If you did:

app = FastAPI()

you should run

python -m uvicorn main:app --reload

In main:main, the first main is the package name, or your file name in this case, and the second main is the var/obj name in the package.

If you installed them in a virtual environment, you should be able to do just unicorn main:main --reload.

Thanks for the reply.

On Mon, Nov 30, 2020 at 4:48 AM ruoshui-git notifications@github.com
wrote:

@zopefiend https://github.com/zopefiend Maybe try python -m uvicorn
main:main --reload
But make sure in you code, you did:

main = FastAPI()

In main:main, the first main is the package name, or your file name, and
the second main is the var/obj name in the package.

—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/tiangolo/fastapi/issues/56#issuecomment-735708804,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABRHGDETOYBS3DQV6NI7U63SSNZ77ANCNFSM4G2BJXPA
.

Was this page helpful?
0 / 5 - 0 ratings