I am trying to deploy my first web app through Heroku and running into this Runtime Error. After reviewing the below, should I change my directory's structure? Is the issue the Procfile syntax? 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?
From Heroku's log:
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.):
portfolio/
├── application/
│ ├── project_modules/
│ └── static/
| └── templates/
| └── __init__.py
| └── routes.py
└── gitignore
└── Procfile
└── requirements.txt
└── run.py
The __ init __.py looks like
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:
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!!