簡體   English   中英

Heroku 和 Flask - ModuleNotFoundError:沒有名為“fetch_data”的模塊

[英]Heroku and Flask - ModuleNotFoundError: No module named 'fetch_data'

我正在嘗試將我的 flask+react 應用程序部署到 heroku 但它崩潰並給我以下錯誤:

ModuleNotFoundError:沒有名為“fetch_data”的模塊

這是日志的片段:

2021-03-23T19:34:05.332761+00:00 app[web.1]: Traceback (most recent call last):
2021-03-23T19:34:05.332763+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/arbiter.py",
 line 583, in spawn_worker
2021-03-23T19:34:05.332764+00:00 app[web.1]: worker.init_process()
2021-03-23T19:34:05.332765+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/workers/base
.py", line 119, in init_process
2021-03-23T19:34:05.332765+00:00 app[web.1]: self.load_wsgi()
2021-03-23T19:34:05.332765+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/workers/base
.py", line 144, in load_wsgi
2021-03-23T19:34:05.332766+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2021-03-23T19:34:05.332766+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/base.py"
, line 67, in wsgi
2021-03-23T19:34:05.332767+00:00 app[web.1]: self.callable = self.load()
2021-03-23T19:34:05.332767+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/wsgiapp.
py", line 49, in load
2021-03-23T19:34:05.332767+00:00 app[web.1]: return self.load_wsgiapp()
2021-03-23T19:34:05.332768+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/wsgiapp.
py", line 39, in load_wsgiapp
2021-03-23T19:34:05.332768+00:00 app[web.1]: return util.import_app(self.app_uri)
2021-03-23T19:34:05.332768+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/util.py", li
ne 358, in import_app
2021-03-23T19:34:05.332769+00:00 app[web.1]: mod = importlib.import_module(module)
2021-03-23T19:34:05.332769+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/importlib/__init__.py", line 127, i
n import_module
2021-03-23T19:34:05.332770+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2021-03-23T19:34:05.332771+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
2021-03-23T19:34:05.332771+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 983, in _find_and_load
2021-03-23T19:34:05.332771+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
2021-03-23T19:34:05.332772+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
2021-03-23T19:34:05.332772+00:00 app[web.1]: File "<frozen importlib._bootstrap_external>", line 728, in exec_module
2021-03-23T19:34:05.332772+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_remove
d
2021-03-23T19:34:05.332773+00:00 app[web.1]: File "/app/api/api.py", line 2, in <module>
2021-03-23T19:34:05.332773+00:00 app[web.1]: from fetch_data import fetch_data
2021-03-23T19:34:05.332773+00:00 app[web.1]: ModuleNotFoundError: No module named 'fetch_data'
2021-03-23T19:34:05.332985+00:00 app[web.1]: [2021-03-23 19:34:05 +0000] [9] [INFO] Worker exiting (pid: 9)
2021-03-23T19:34:05.391634+00:00 app[web.1]: [2021-03-23 19:34:05 +0000] [4] [INFO] Shutting down: Master
2021-03-23T19:34:05.392273+00:00 app[web.1]: [2021-03-23 19:34:05 +0000] [4] [INFO] Reason: Worker failed to boot.
2021-03-23T19:34:05.544193+00:00 heroku[web.1]: Process exited with status 3
2021-03-23T19:34:05.617532+00:00 heroku[web.1]: State changed from up to crashed

現在fetch_data是我在api文件夾中制作的 package。 下面是api文件夾的目錄結構:

.
|-- __pycache__
|   |-- api.cpython-37.pyc
|   `-- fetch_data.cpython-37.pyc
|-- api.py
|-- fetch_data
|   |-- __init__.py
|   `-- fetch_data.py
|-- static
|   `-- react
|-- templates
|   `-- index.html
|-- test.py
`-- venv
    |-- Include
    |-- Lib
    |-- Scripts
    `-- pyvenv.cfg

fetch_data.py是我在 api.py 中調用的 flask 藍圖api.py.

this is a snippet of api.py:

from flask import Flask, jsonify, render_template
from fetch_data import fetch_data
from nsepy import get_history
from datetime import date,timedelta
import pandas as pd
import os
import json

app = Flask(__name__)
app.register_blueprint(fetch_data.fetch_api)

@app.route('/')
def index():
    return render_template("index.html", flask_token = "Hello World")
.
.
.

if __name__ == '__main__':
    port =int(os.environ['PORT'])
    app.run(host='0.0.0.0', debug=False, port= port)

這是fetch_data.py的代碼:

from flask import Blueprint
from nsetools import Nse

fetch_api = Blueprint('fetch_api', __name__, url_prefix='/fetch')

@fetch_api.route('/api/<string:ticker>', methods = ['GET'])
def fetch_data(ticker):
    nse = Nse()

    return nse.get_quote(ticker, as_json = True)

@fetch_api.route('/gainers', methods = ['GET'])
def fetch_gainers():
    nse = Nse()
    return nse.get_top_gainers(as_json = True)

@fetch_api.route('/losers', methods = ['GET'])
def fetch_losers():
    nse = Nse()
    return nse.get_top_losers(as_json = True)

我看到一些答案提到Procfile可能存在問題,但我認為我的看起來不錯。

web: gunicorn -w 1 -b 0.0.0.0:$PORT api.api:app

我對 flask 和 heroku 還是新手,所以如果這個問題的解決方案很明顯,我很抱歉。 在此先感謝您的幫助。

最好使用這種結構,其中每個關注點都是分開的:

project
  |----- app.py
  |----- test.py
  |----- .flaskenv
  |----- app/
           |----- __init__.py
           |----- fetch_data/
                      |----- __init__.py
                      |----- routes.py
           |----- main/
                   |----- __init__.py
                   |----- routes.py
           |----- static/
                    |----- # <your-static-files>
           |----- templates/
                      |----- index.html

app.py是應用程序的入口點。 它將有:

from app import create_app

app = create_app()

# ...

您的routes.py將如下所示(將 fetch_api.py 重命名為fetch_api.py以使其在fetch api routes.py中的作用更加明顯):

# all your fetch_data.py code
# ...

@bp.route('/losers', methods = ['GET'])
def fetch_losers():
    nse = Nse()
    return nse.get_top_losers(as_json = True)

fetch_data中的__init__.py package 將定義您的藍圖

from flask import Blueprint

bp = Blueprint('fetch_api', __name__)

from app.fetch_data import routes

package 將包含有關該應用程序的所有其他詳細信息。 main的路線中,您將擁有:

# Remember to initialize the main package appropriately 
# so as to use Flask's Blueprint
# ...

@bp.route('/')
def index():
    return render_template("index.html", flask_token = "Hello World")

# ...

__init__.py文件是您的應用程序實例:

from flask import Flask
# all your other imports go here

app = Flask(__name__)

# ...

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    from app.fetch_api import bp as fetch_bp
    app.register_blueprint(fetch_bp, url_prefix='/fetch')

    # ...

    return app

from app import models  # add/remove if modules exist/don't exist in your app folder

這將消除您在應用程序包中可能遇到的任何導入問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM