Search code examples
python-3.xflask

UnboundLocalError: cannot access local variable 'request' where it is not associated with a value


I am using Python 3.12 along with Flask,
it's Flask App with mongo db.

I'm encountering an UnboundLocalError in my Flask application. The error occurs when I try to access the request object within one of my view functions. Here is the full traceback:

The error suggests that the request object is not available within the get_user_contribution_requests function. However, I have imported request from flask, and I believe it should be accessible.


   File "/Users/divakaryadav/road-guardian/backend/env/lib/python3.12/site-packages/flask/app.py", line 880, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/divakaryadav/road-guardian/backend/env/lib/python3.12/site-packages/flask/app.py", line 865, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/divakaryadav/road-guardian/backend/env/lib/python3.12/site-packages/flask_jwt_extended/view_decorators.py", line 170, in decorator
    return current_app.ensure_sync(fn)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/divakaryadav/Documents/GitHub/Sync1.0/backend/app.py", line 163, in get_user_contribution_requests
    page_str = request.args.get('page', 1)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnboundLocalError: cannot access local variable 'request' where it is not associated with a value

Here is the relevant portion of my code:

@app.route('/user-contribution-requests', methods=['GET'])
@jwt_required()
def get_user_contribution_requests():
    contribution_requests = db.contribution_requests
    user_id = get_jwt_identity()
    page_str = request.args.get('page', 1)
    page = int(page_str)
    rows_per_page = int(request.args.get('rowsPerPage', 5))
    
    total_count = contribution_requests.count_documents({'user_id': user_id})
    requests = list(contribution_requests.find({'user_id': user_id})
                    .skip((page - 1) * rows_per_page)
                    .limit(rows_per_page))
    
    for request in requests:
        request['_id'] = str(request['_id'])
        
        if 'project_id' in request:
            request['project_id'] = str(request['project_id'])
        
        # Convert date strings to datetime objects
        for date_field in ['request_creation_date', 'created_at', 'updated_at']:
            if date_field in request and isinstance(request[date_field], str):
                try:
                    request[date_field] = datetime.fromisoformat(request[date_field])
                except ValueError:
                    request[date_field] = None
        
        # Format dates as ISO strings
        request['request_creation_date'] = request['request_creation_date'].isoformat() if request['request_creation_date'] else None
        request['created_at'] = request['created_at'].isoformat() if request['created_at'] else None
        request['updated_at'] = request['updated_at'].isoformat() if request['updated_at'] else None

    return jsonify({'contribution_requests': requests, 'totalCount': total_count}), 200

Solution

  • The most likely cause of this error is a name conflict. In your function, you're using request as a variable name in the loop.

    for request in requests:
    request['_id'] = str(request['_id'])
    

    rename the request to req and it should work as intended

    for req in requests:
        req['_id'] = str(req['_id'])