简体   繁体   English

Heroku:部署 Python Flask 应用程序时出现运行时错误

[英]Heroku: Runtime Error when deploying Python Flask App

I am trying to deploy my first web app through Heroku and running into this Runtime Error.我正在尝试通过 Heroku 部署我的第一个 web 应用程序并遇到此运行时错误。 After reviewing the below, should I change my directory's structure?查看以下内容后,我是否应该更改目录结构? Is the issue the Procfile syntax?问题是 Procfile 语法吗? The app deploys perfectly on the local server, but for some reason, I think that Heroku is not able to find the app_Secret_key in the init.py file?该应用程序在本地服务器上完美部署,但出于某种原因,我认为 Heroku 无法在 init.py 文件中找到 app_Secret_key?

From Heroku's log:来自 Heroku 的日志:

2022-03-28T16:51:53.900726+00:00 app[web.1]: [2022-03-28 16:51:53,900] ERROR in app: Exception on / [GET]
2022-03-28T16:51:53.900736+00:00 app[web.1]: Traceback (most recent call last):
2022-03-28T16:51:53.900737+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask/app.py", line 2073, in wsgi_app
2022-03-28T16:51:53.900737+00:00 app[web.1]:     response = self.full_dispatch_request()
2022-03-28T16:51:53.900738+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask/app.py", line 1518, in full_dispatch_request
2022-03-28T16:51:53.900738+00:00 app[web.1]:     rv = self.handle_user_exception(e)
2022-03-28T16:51:53.900739+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask/app.py", line 1516, in full_dispatch_request
2022-03-28T16:51:53.900739+00:00 app[web.1]:     rv = self.dispatch_request()
2022-03-28T16:51:53.900739+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask/app.py", line 1502, in dispatch_request
2022-03-28T16:51:53.900740+00:00 app[web.1]:     return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
2022-03-28T16:51:53.900740+00:00 app[web.1]:   File "/app/application/routes.py", line 26, in home_page
2022-03-28T16:51:53.900740+00:00 app[web.1]:     contact_form = ContactForm()
2022-03-28T16:51:53.900741+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/wtforms/form.py", line 208, in __call__
2022-03-28T16:51:53.900741+00:00 app[web.1]:     return type.__call__(cls, *args, **kwargs)
2022-03-28T16:51:53.900742+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask_wtf/form.py", line 73, in __init__
2022-03-28T16:51:53.900742+00:00 app[web.1]:     super().__init__(formdata=formdata, **kwargs)
2022-03-28T16:51:53.900742+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/wtforms/form.py", line 286, in __init__
2022-03-28T16:51:53.900743+00:00 app[web.1]:     self.process(formdata, obj, data=data, **kwargs)
2022-03-28T16:51:53.900743+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/wtforms/form.py", line 127, in process
2022-03-28T16:51:53.900744+00:00 app[web.1]:     field.process(formdata, data, extra_filters=field_extra_filters)
2022-03-28T16:51:53.900744+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/wtforms/csrf/core.py", line 44, in process
2022-03-28T16:51:53.900745+00:00 app[web.1]:     self.current_token = self.csrf_impl.generate_csrf_token(self)
2022-03-28T16:51:53.900745+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask_wtf/csrf.py", line 147, in generate_csrf_token
2022-03-28T16:51:53.900746+00:00 app[web.1]:     return generate_csrf(
2022-03-28T16:51:53.900746+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask_wtf/csrf.py", line 36, in generate_csrf
2022-03-28T16:51:53.900746+00:00 app[web.1]:     secret_key = _get_config(
2022-03-28T16:51:53.900747+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.10/site-packages/flask_wtf/csrf.py", line 136, in _get_config
2022-03-28T16:51:53.900747+00:00 app[web.1]:     raise RuntimeError(message)
2022-03-28T16:51:53.900747+00:00 app[web.1]: RuntimeError: A secret key is required to use CSRF.

My directory looks like this ("application/" is a python package.):我的目录如下所示(“application/”是 python package。):

portfolio/
├── application/ 
│   ├── project_modules/
│   └── static/
|   └── templates/
|   └── __init__.py
|   └── routes.py
└── gitignore
└── Procfile
└── requirements.txt
└── run.py

The __ init __.py looks like __ init __.py 看起来像

import os

import dotenv
from flask import Flask
from flask_bootstrap import Bootstrap

# ---- Keys, Passwords, Etc. ---- #

dotenv.load_dotenv("C:/_CODING/Python/portfolio_passcodes.env")
app_SECRET_KEY = os.getenv("app_SECRET_KEY")

# ---- App Setup ---- #

app = Flask(__name__)
app.config['SECRET_KEY'] = app_SECRET_KEY
Bootstrap(app)

from application import routes

and the run.py looks like: run.py 看起来像:

from application import app

if __name__ == '__main__':
    app.run(debug=True)

the Procfile:档案:

web: gunicorn application:app --preload

Please let me know if more information is needed to resolve this.如果需要更多信息来解决此问题,请告诉我。 Thanks!!谢谢!!

The path on Heroku is different from you local so dotenv.load_dotenv("C:/_CODING/Python/portfolio_passcodes.env") will never work. Heroku 上的路径与您本地的路径不同,因此dotenv.load_dotenv("C:/_CODING/Python/portfolio_passcodes.env")将永远无法工作。

The right approach is to define a ConfigVar (ie environment variables) with the property/secret you need then reading with正确的方法是使用您需要的属性/秘密定义一个ConfigVar (即环境变量),然后使用

# use UPPER CASE for env variable 
app_SECRET_KEY = os.environ.get("APP_SECRET_KEY")

On your local development environment is fine to use dotenv to load the env variables from a local file (make sure you don't commit/push the file)在您的本地开发环境中可以使用dotenv从本地文件加载 env 变量(确保您不提交/推送文件)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM