Flask+MongoDB应用出现UnboundLocalError:无法访问request变量
问题原因
你遇到的UnboundLocalError是因为局部变量名冲突:在视图函数中,你用for request in requests定义了一个名为request的循环变量,这个局部变量会覆盖从Flask导入的全局request对象。Python解释器解析函数时,会把request标记为局部变量,所以当你在函数开头调用request.args.get()时,它会认为你要访问的是还未赋值的局部request变量,从而抛出错误。
解决方法
只需修改循环变量的名称,避免和Flask的request对象重名即可,比如改成req:
修改后的代码片段:
@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)) # 修改循环变量名称,避免和Flask的request冲突 for req in requests: req['_id'] = str(req['_id']) if 'project_id' in req: req['project_id'] = str(req['project_id']) # 转换日期字符串为datetime对象 for date_field in ['request_creation_date', 'created_at', 'updated_at']: if date_field in req and isinstance(req[date_field], str): try: req[date_field] = datetime.fromisoformat(req[date_field]) except ValueError: req[date_field] = None # 将日期格式化为ISO字符串 req['request_creation_date'] = req['request_creation_date'].isoformat() if req['request_creation_date'] else None req['created_at'] = req['created_at'].isoformat() if req['created_at'] else None req['updated_at'] = req['updated_at'].isoformat() if req['updated_at'] else None return jsonify({'contribution_requests': requests, 'totalCount': total_count}), 200
额外说明
Python的变量作用域规则是:如果函数内部有对变量的赋值(循环变量的定义相当于赋值),该变量会被视为函数的局部变量,无论它是否和全局变量重名。因此要避免在函数内使用和全局导入对象同名的局部变量,这类错误常见但容易被忽略。
内容的提问来源于stack exchange,提问作者Divakar Yadav
相关产品推荐
相关产品推荐

