Tengo una pregunta relacionada con FastAPI con uvicorn en pycharm. Mi proyecto tiene la siguiente estructura:
LearningPy <folder name> | |-- apis <folder name> -----|--modelservice <folder name> ---------|--dataprovider.py ---------|--main.py ---------|--persondetails.py -----|--config.pyPrimero estaba usando la siguiente ruta: D:\Learnings\apis y ejecuté el siguiente código: uvicorn main:app --reload luego estaba dando error:
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) Started reloader process [23445] Error loading ASGI app. Could not import module "apis".Sin embargo, después de leer la sugerencia de aquí , cambié la ruta a D:\Learnings\apis\modeservice y el error anterior desapareció, pero ahora comenzó a arrojar un error diferente: ModuleNotFoundError: No module named 'apis'
Aquí están mis archivos de código main.py y config.py:
principal.py --
import uvicorn from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware from datetime import datetime from apis import config from apis.modelservice import dataprovider app = FastAPI(debug=True) def get_application() -> FastAPI: application = FastAPI(title="PersonProfile", description="Learning Python CRUD",version="0.1.0") origins = [ config.API_CONFIG["origin_local_ip"], config.API_CONFIG["origin_local_url"] ] application.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) #application.include_router(processA.router) return application app = get_application() @app.get("/") def read_root(): return {"main": "API Server " + datetime.now().strftime("%Y%m%d %H:%M:%S")} @app.get("/dbcheck") def read_root(): try: dataprovider.get_db().get_collection("Person") except Exception as e: return {"failed":e} else: return { "connected":True} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)Y aquí está config.py--
API_CONFIG = { "origin_local_ip": "http://127.0.0.1:3000", "origin_local_url": "http://localhost:3000" }Este proyecto se está construyendo sobre React+Mongo+python (pymongo para conectar mongodb).
Gracias por adelantado.
El problema en su aplicación es la organización de su módulo, primero probé la estructuración de su carpeta y obtuve los mismos errores que el suyo, lo depuré un poco, encontré que el error estaba en la importación de configuración, así que profundicé más para entender por qué Python no puede importa tu configuración,
Creé un script en la carpeta superior para averiguar por qué. También se agregó en la línea de impresión en config.py y modelservice.main.py
print('__file__={0:<35} | __name__={1:<20} | __package__={2<20}'.format(__file__,__name__,str(__package__))) import apis.config import apis.modelservice.mainEsta fue la estructura
apis ├── config.py └── modelservice └── main.pyEjecuto el script en el script de la carpeta superior llamado main.py. Terminó con este resultado:
__file__=main.py | __name__=__main__ | __package__=None __file__=/home/yagiz/Desktop/test/apis/config.py | __name__=apis.config | package__=apis apis.config __file__=/home/yagiz/Desktop/test/apis/modelservice/main.py | __name__=apis.modelservice.main | __package__=apis.modelserviceMe pareció extraño porque debería poder importar de forma relativa, pero cuando traté de importar eso, ¿qué
from .. import configvolvió:
File "./main.py", line 8, in <module> from .. import config ImportError: attempted relative import with no known parent package Solo para probarlo, probé esta estructura, también usé la import config: de importación absoluta :
apis/ ├── modelservice ├── config.py ├── main.py INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [14155] using statreload __file__=./main.py | __name__=main | __package__= __file__=./config.py | __name__=config | __package__= config INFO: Started server process [14157] INFO: Waiting for application startup. INFO: Application startup complete.Todo funcionó bien así, por lo que el problema es con la organización de su módulo y cómo importa las cosas, así que échele un vistazo nuevamente.
Agregado a lo que Yagizcan respondió anteriormente, si alguien todavía recibe un error de importación del módulo en pycharm, cambie la raíz de las fuentes a la carpeta de código desde el menú Archivo.
LearningPy <folder name> | |-- apis <folder name> -----|--modelservice <folder name> ---------|--dataprovider.py ---------|--persondetails.py ------|--main.py ------|--config.py Aquí he movido main.py fuera de la carpeta modelservice. ya que main.py se ejecutará como api. Luego, para ejecutar el código, agregué el siguiente código uvicorn path to apisfolder.main:app --reload . Y ahora funcionó sin ningún problema.