[英]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.