Heroku 409 error when Python Dash app calls API - python

starting process with command from procfile works.
then as soon as it starts reading the python file, and pulling data from an API, we get
[2020-03-23 17:48:55 +0000] [10] [ERROR] Exception in worker process
Which traces down to
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 409: Conflict
And then
[2020-03-23 17:48:55 +0000] [10] [INFO] Worker exiting (pid: 10)
Before it looks like its successfully calling the API on a second attempt and then ultimately
[2020-03-23 17:49:03 +0000] [11] [INFO] Worker exiting (pid: 11)
[2020-03-23 17:49:04 +0000] [4] [INFO] Shutting down: Master
[2020-03-23 17:49:04 +0000] [4] [INFO] Reason: Worker failed to boot.
And it crashes, exiting with status 3.
How do I solve this 409 error? Is there some environment variable or something that has to be set in the python app before deploying to Heroku? The app works locally (i.e. API calls work), just when trying to put on a server do I encounter this.

Related

Gunicorn with django giving 500 with no extra information

I am trying to run django 3.2.16 with gunicorn, I get this output in console:
[2023-01-15 23:45:39 +0100] [210935] [INFO] Starting gunicorn 20.1.0
[2023-01-15 23:45:39 +0100] [210935] [DEBUG] Arbiter booted
[2023-01-15 23:45:39 +0100] [210935] [INFO] Listening at: http://0.0.0.0:8000 (210935)
[2023-01-15 23:45:39 +0100] [210935] [INFO] Using worker: sync
[2023-01-15 23:45:39 +0100] [210936] [INFO] Booting worker with pid: 210936
[2023-01-15 23:45:39 +0100] [210935] [DEBUG] 1 workers
Everything looks like working, but when I go to localhost, I get Internal Server Error.
It kinda behaves like if I had DEBUG = False, but I have DEBUG = True and there is also nothing in console. Django setup finishes and I also verify, that settings.DEBUG is indded true:
My wsgi.py file:
application = get_wsgi_application()
print(settings.DEBUG)
And of course runserver works fine.
What else could that be? How to get some kind of error output? I tried capture-out and all the log files and levels that gunicorn provides but got nothing useful from the console.
The reason was this line in my django log settings:
"disable_existing_loggers": True,
Setting this to False fixed my problem.

Which logger is outputting this in gunicorn?

When I start gunicorn it prints this:
[2018-11-09 16:30:20 +0000] [16] [INFO] Starting gunicorn 19.9.0
[2018-11-09 16:30:20 +0000] [16] [INFO] Listening at: http://0.0.0.0:8000 (16)
[2018-11-09 16:30:20 +0000] [16] [INFO] Using worker: sync
[2018-11-09 16:30:20 +0000] [19] [INFO] Booting worker with pid: 19
Setting up a logger for the gunicorn package (propagating) doesn't seem to affect it. What module is the one I should configure to modify these messages?
Those messages are output by the Arbiter class in gunicorn/arbiter.py, but it may be that any configuring you try and do is overridden by gunicorn's machinery, or not applicable - for example, trying to set up logging in a worker won't affect what the arbiter does, as they are separate processes. So you may need to invoke the arbiter in a special way (i.e. not just through running a canned gunicorn script) if you want to affect its logging, or amend the gunicorn configuration used for the arbiter.

Running a Simple Falcon App

I've a simple falcon app straight from the getting started example
import falcon
import json
class QuoteResource:
def on_get(self, req, resp):
"""Handles GET requests"""
quote = {
'quote': 'I\'ve always been more interested in the future than in the past.',
'author': 'Grace Hopper'
}
resp.body = json.dumps(quote)
api = falcon.API()
api.add_route('/quote', QuoteResource())
The code is in a file called manage.py
When I try to run gunicorn manage:app
This is what I get
2017-06-04 20:47:18 -0700] [2370] [INFO] Starting gunicorn 19.7.1
[2017-06-04 20:47:18 -0700] [2370] [INFO] Listening at: http://127.0.0.1:8000 (2370)
[2017-06-04 20:47:18 -0700] [2370] [INFO] Using worker: sync
[2017-06-04 20:47:18 -0700] [2373] [INFO] Booting worker with pid: 2373
Failed to find application: 'manage'
[2017-06-04 20:47:18 -0700] [2373] [INFO] Worker exiting (pid: 2373)
[2017-06-04 20:47:18 -0700] [2370] [INFO] Shutting down: Master
[2017-06-04 20:47:18 -0700] [2370] [INFO] Reason: App failed to load.
What am I doing wrong here?
Not sure whether it is a typo or because of misunderstanding but you should start the application this way:
gunicorn manage:api
But not gunicorn manage:app
The manage:api option tells to invoke the api object defined in your manage.py module. Otherwise you need to rename api variable to app in your code.
Then you can check that application is running by accessing the following url:
http://localhost:8000/quote
By default the port should 8000 but you need to check it when gunicorn starts. It should be something like this:
[INFO] Listening at: http://127.0.0.1:8000

No such file or directory New Relic

I'm trying to setup new relic, I have followed the instructions they give however the last command give me this error.
newrelic-admin run-program gunicorn wsgi:application
why?
2013-04-16 10:39:30 [4175] [INFO] Starting gunicorn 0.14.5
2013-04-16 10:39:30 [4175] [INFO] Listening at: http://127.0.0.1:8000 (4175)
2013-04-16 10:39:30 [4175] [INFO] Using worker: sync
2013-04-16 10:39:30 [4178] [INFO] Booting worker with pid: 4178
2013-04-16 10:39:30 [4178] [INFO] Worker exiting (pid: 4178)
2013-04-16 10:39:31 [4175] [INFO] Shutting down: Master
2013-04-16 10:39:31 [4175] [INFO] Reason: Worker failed to boot.
Follow the instructions found here:
https://newrelic.com/docs/python/python-agent-integration
I'm assuming as this i posted in Django that its a Django app.
add
import newrelic.agent
newrelic.agent.initialize('/some/path/newrelic.ini')

Changing package install order in Python

Does anyone know if package install order matters in Python? More specifically my pip requirements.txt for a Django website I am building was:
Django==1.4
MySQL-python==1.2.3
django-evolution==0.6.7
django-pagination==1.0.7
boto==2.5.2
numpy==1.6.2
requests==0.13.1
simplejson==2.5.2
gunicorn==0.14.6
When deploying to Heroku the application would crash with the following error:
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [12] [INFO] Worker exiting (pid: 12)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [8] [INFO] Worker exiting (pid: 8)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Handling signal: term
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [7] [INFO] Worker exiting (pid: 7)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Starting gunicorn 0.14.6
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Listening at: http://0.0.0.0:20132 (4)
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [4] [INFO] Using worker: sync
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [7] [INFO] Booting worker with pid: 7
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [8] [INFO] Booting worker with pid: 8
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [9] [INFO] Booting worker with pid: 9
2012-08-05T09:26:56+00:00 app[web.1]: 2012-08-05 09:26:56 [10] [INFO] Booting worker with pid: 10
2012-08-05T09:26:57+00:00 heroku[web.1]: State changed from starting to up
2012-08-05T09:26:57+00:00 heroku[web.1]: Process exited with status 143
2012-08-05T09:27:17+00:00 app[web.1]: Usage: gunicorn [options]
2012-08-05T09:27:17+00:00 app[web.1]: gunicorn: error: no such option: --workers
2012-08-05T09:27:17+00:00 app[web.1]:
2012-08-05T09:27:17+00:00 app[web.1]: 2012-08-05 09:27:17 [9] [INFO] Worker exiting (pid: 9)
Where my Procfile is as follows:
web: python manage.py collectstatic --noinput; gunicorn commerical_production.wsgi:application --workers=4 --bind=0.0.0.0:$PORT
The problem was fixed by simply changing the order of requirements to:
Django==1.4
gunicorn==0.14.6
MySQL-python==1.2.3
django-evolution==0.6.7
django-pagination==1.0.7
boto==2.5.2
numpy==1.6.2
requests==0.13.1
simplejson==2.5.2
(note that gunicorn is now moved to the top)
I found this out by luckily guessing to try and change the order of the imports but my question is has anyone else run into this problem or know why the order of the packages makes a difference when installed from the requirements.txt? Could this problem indicative of some larger dependency issue that is in my app?
Pip is not very good at handling package dependencies as easy_install. We had the same problem in our project. Even though the order in req.txt was correct, we had dependency problems that is related to order.
My solution is to feed the req.txt to easy_install, but than you should be careful with the packages that is editable or those from github etc.
You may want to check below links:
http://metak4ml.blogspot.com/2009/08/easyinstall-read-pip-requirementstxt.html
http://community.webfaction.com/questions/1220/using-easy_install-to-get-all-dependencies-listed-in-requirementstxt (while read line answer is close to what we do)
Pyton setup install scripts hold already requirements and order, so the install process will respect and install in order all requirements for each of your app in the requirements file.
So, if you have your own applications that require others, put your requirements only in your setup files and enroll your main application in the requirements.txt
For third party python apps that don't require compilation you don't have to worry about the order in your requirements.
Otherwise eazy_install becomes deprecated, use pip instead of it.

Categories

Resources