部署在PythonAnywhere的Flask调用APScheduler API失败求助
Flask部署PythonAnywhere后APScheduler API调用无限加载崩溃问题
将Flask应用部署到PythonAnywhere后,调用APScheduler的外部API接口/scheduler/jobs出现故障——请求会无限加载,最终导致整个网站崩溃,但该功能在本地环境完全正常。
已配置的CORS设置
在app.py中配置了CORS以允许PythonAnywhere域名:
# app.py # 导入及Flask应用初始化... cors = CORS(app) @app.after_request def add_cors_headers(response): response.headers['Access-Control-Allow-Origin'] = 'https://<username>.pythonanywhere.com' return response # 其余代码...
测试验证
在PythonAnywhere的bash中执行curl -X GET http://<username>.pythonanywhere.com/scheduler/jobs能成功获取结果,Postman请求也正常。
代码排查结果
取消requests.get()的注释后功能立即失效,且无相关错误日志:
@api_bp.route('/jobs_details', methods=['GET']) def get_jobs_details(): jobs_data = fetch_scheduler_jobs(request) def fetch_scheduler_jobs(request): # 从内置API获取数据 base_url = request.host_url.rstrip('/') url = f"{base_url}/scheduler/jobs" headers = dict(request.headers) # response = requests.get(url, headers=headers) return headers
临时修复尝试及错误
尝试用subprocess调用curl替代requests.get(),但无法正常工作:
def make_curl_request(url, headers=None): """ 替代`requests.get(url, headers=headers)`的临时修复方案 :param url: :param headers: :return: """ command = ['curl', '-X', 'GET'] if headers: for header in headers: command.extend(['-H', header]) command.append(url) result = subprocess.run(command, capture_output=True, text=True) response_body = result.stdout response_dict = json.loads(response_body) return response_dict def fetch_scheduler_jobs(request_obj): # 从内置API获取数据 base_url = request_obj.host_url.rstrip('/') url = f"{base_url}/scheduler/jobs" headers = [f"{key}: {value}" for key, value in request_obj.headers.items()] response = make_curl_request(url, headers=headers) return response
对应的错误日志:
2023-06-18 19:35:37,209: Exception on /api/jobs_details [GET] Traceback (most recent call last): File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1486, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask_cors/extension.py", line 165, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask_cors/extension.py", line 165, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/<usernam>/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/<usernam>/<projname>/api/routes.py", line 29, in get_jobs_details jobs_data = fetch_scheduler_jobs(request) # TODO 1. deployment bug File "/home/<usernam>/<projname>/api/api_utils.py", line 39, in fetch_scheduler_jobs response = make_curl_request(url, headers=headers) File "/home/<usernam>/<projname>/api/api_utils.py", line 30, in make_curl_request response_dict = json.loads(response_body) File "/usr/local/lib/python3.10/json/__init__.py", line 346, in loads return _default_decoder.decode(s) File "/usr/local/lib/python3.10/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/lib/python3.10/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
注:
make_curl_request()的错误为临时方案的问题,核心问题是使用requests.get()调用API时出现无限加载并导致网站崩溃。
内容的提问来源于stack exchange,提问作者Silcrow
相关产品推荐
相关产品推荐

