Streamlit冰沙订单应用调用Fruityvice API遇Max retries连接错误求助
问题:Streamlit冰沙应用调用Fruityvice API失败(域名解析错误)
我正在开发一款基于Streamlit的冰沙订单定制应用,用户选择水果配料后,希望通过Fruityvice API获取对应水果的营养信息,但调用API时始终失败,出现Max retries exceeded的ConnectionError,根源是域名解析失败。我尝试过用try-except块和延迟循环处理,但问题仍未解决。
应用代码
import streamlit as st from snowflake.snowpark.context import get_active_session from snowflake.snowpark.functions import col import requests st.title("Customize your Smoothie! App :cup_with_straw:") st.write( """Choose the fruits you want in your custom Smoothie! """ ) name_on_order = st.text_input('Name on Smoothie:') st.write('The name on your Smoothie be:', name_on_order) session = get_active_session() my_dataframe = session.table("smoothies.public.fruit_options").select(col('FRUIT_NAME')) ingredients_list = st.multiselect('Choose upto 5 ingredients:',my_dataframe,max_selections=5) if ingredients_list: ingredients_string = "" for fruit_chosen in ingredients_list: ingredients_string+= fruit_chosen+" " fruityvice_response = requests.get("https://fruityvice.com/api/fruit/"+fruit_chosen) st.text(fruityvice_response.json()) #fv_dv = st.dataframe(data=fruityvice_response.json(), use_container_width=True) my_insert_stmt = """ insert into smoothies.public.orders(ingredients,name_on_order) values ('""" + ingredients_string + """','""" + name_on_order + """')""" #st.write(my_insert_stmt) time_to_insert= st.button('Submit Order') if time_to_insert: session.sql(my_insert_stmt).collect() st.success('Your Smoothie is ordered!', icon="✅")
报错信息
ConnectionError: HTTPSConnectionPool(host='fruityvice.com', port=443): Max retries exceeded with url: /api/fruit/watermelonElderberries (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0xffff79c51400>: Failed to resolve 'fruityvice.com' ([Errno -3] Temporary failure in name resolution)")) Traceback: File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script exec(code, module.__dict__) File "/home/udf/88736396/streamlit_app.py", line 33, in <module> fruityvice_response = requests.get("https://fruityvice.com/api/fruit/watermelon"+fruit_chosen) File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/api.py", line 73, in get return request("get", url, params=params, **kwargs) File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/api.py", line 59, in request return session.request(method=method, url=url, **kwargs) File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/adapters.py", line 519, in send raise ConnectionError(e, request=request)
解决方案
1. 配置Snowflake网络策略
你的应用运行在Snowflake Streamlit环境中,默认限制外部网络请求。需要:
- 联系Snowflake管理员创建网络策略,添加出站规则允许访问
fruityvice.com:443 - 将该网络策略应用到你的账户、用户或对应的角色上
2. 修正URL拼接问题
从报错URL/api/fruit/watermelonElderberries可以看出,水果名称被错误拼接。需:
- 检查
smoothies.public.fruit_options表中FRUIT_NAME字段是否存在多余空格或特殊字符 - 在请求API前清洗水果名称,示例代码修改如下:
fruit_cleaned = fruit_chosen.strip().lower() fruityvice_response = requests.get(f"https://fruityvice.com/api/fruit/{fruit_cleaned}")
3. 完善错误处理逻辑
增强异常处理,区分不同错误类型,提升用户体验:
try: fruit_cleaned = fruit_chosen.strip().lower() # 添加超时时间避免无限等待 fruityvice_response = requests.get(f"https://fruityvice.com/api/fruit/{fruit_cleaned}", timeout=10) # 触发HTTP错误状态码的异常(如404、500) fruityvice_response.raise_for_status() st.text(fruityvice_response.json()) except requests.exceptions.ConnectionError: st.error("无法连接到Fruityvice API,请检查网络权限或域名有效性") except requests.exceptions.HTTPError as e: st.error(f"API请求失败,状态码:{fruityvice_response.status_code},详情:{str(e)}") except Exception as e: st.error(f"获取水果营养信息出错:{str(e)}")
4. 验证域名解析有效性
在Snowflake SQL中执行以下命令,测试环境能否解析fruityvice.com:
SELECT SYSTEM$DNS_LOOKUP('fruityvice.com');
如果返回空或错误,说明Snowflake环境DNS配置无法解析该域名,需联系Snowflake技术支持排查。
内容的提问来源于stack exchange,提问作者Aman Chaudhur
相关产品推荐
相关产品推荐

