Yash Kumar Atri
Yash Kumar Atri

Reputation: 795

RuntimeError: Working outside of request context. with gunicorn

Whenever I run my code as python3 myapp.py it works fine but whenever I use gunicorn -w 4 myapp:index -b 10.91.1.230:5055 &

it throws

ion@aurora:~/TNQ$ [2019-02-05 14:26:34 +0530] [27107] [INFO] Starting 
gunicorn 19.9.0
..............
27116
[2019-02-05 14:26:38 +0530] [27113] [ERROR] Error handling request /
Traceback (most recent call last):
  File "/home/ion/.local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/home/ion/.local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/ion/TNQ/myapp.py", line 16, in index
    f = request.files['file']
  File "/home/ion/.local/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/ion/.local/lib/python3.6/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/home/ion/.local/lib/python3.6/site-packages/flask/globals.py", line 37, in _lookup_req_object
    raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.

myapp.py

from flask import Flask,request
from CXE.src.models import class_classic as cc   
app = Flask(__name__)    
@app.route('/', methods=['POST'])
#def index(environ, start_response):
def index(environ, start_response):
    with app.app_context():
        #if request.method == 'POST':
        f = request.files['file']
        a = cc.initiate(f)
    return a   
 if __name__ == '__main__':
    app.run(host = '0.0.0.0',port=5505,debug=True)

I need to put the code on gunicorn for serving it on threads. Any idea why isn't it working ?

Upvotes: 0

Views: 1818

Answers (1)

nebuler
nebuler

Reputation: 1545

It doesn't work because index is not a wsgi app - it's not enough for the function to have the correct signature. Do the following instead:

gunicorn -w 4 myapp:app -b 10.91.1.230:5055 &

You see no issue when you run python3 myapp.py because flask's dev server, app.run, does not require a wsgi app, whereas gunicorn does. With that said, you might as well go ahead and remove the index signature.

Upvotes: 1

Related Questions