Plaid连接失败:本地正常PythonAnywhere无法建立连接及产品列表异常
Plaid部署至PythonAnywhere后的连接异常问题
核心问题
本地localhost运行正常,但部署到PythonAnywhere后无法创建Plaid链接令牌,错误日志显示连接被拒绝;同时发现产品列表和国家代码的解析逻辑存在错误。
错误日志
Traceback (most recent call last): File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 2525, in wsgi_app response = self.full_dispatch_request() File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1822, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1820, in full_dispatch_request rv = self.dispatch_request() File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/flask/app.py", line 1796, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/leehrat/BudgetApp/website/banking.py", line 182, in create_link_token response = client.link_token_create(request) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api_client.py", line 769, in __call__ return self.callable(self, *args, **kwargs) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api/plaid_api.py", line 10492, in __link_token_create return self.call_with_http_info(**kwargs) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api_client.py", line 831, in call_with_http_info return self.api_client.call_api( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api_client.py", line 406, in call_api return self.__call_api(resource_path, method, File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api_client.py", line 193, in __call_api response_data = self.request( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/api_client.py", line 452, in request return self.rest_client.POST(url, File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/rest.py", line 264, in POST return self.request("POST", url, File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/plaid/rest.py", line 150, in request r = self.pool_manager.request( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/request.py", line 78, in request return self.request_encode_body( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/request.py", line 170, in request_encode_body return self.urlopen(method, url, **extra_kw) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/poolmanager.py", line 376, in urlopen response = conn.urlopen(method, u.request_uri, **kw) File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 815, in urlopen return self.urlopen( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 815, in urlopen return self.urlopen( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 815, in urlopen return self.urlopen( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen retries = retries.increment( File "/home/leehrat/.virtualenvs/my-virtualenv/lib/python3.10/site-packages/urllib3/util/retry.py", line 592, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='production.plaid.com', port=443): Max retries exceeded with url: /link/token/create (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f0245b24940>: Failed to establish a new connection: [Errno 111] Connection refused'))
代码解析错误
问题代码
PLAID_PRODUCTS = 'auth,transactions' products = [] print(f"PLAID_PRODUCTS: {PLAID_PRODUCTS}") for product in PLAID_PRODUCTS: products.append(Products(product)) print(f"products: {products}")
实际输出
2023-07-26 19:22:08 PLAID_PRODUCTS: auth,transactions 2023-07-26 19:22:08 products: [a, u, t, h, ,, t, r, a, n, s, a, c, t, i, o, n, s]
预期输出
PLAID_PRODUCTS: ['auth', 'transactions'] products: [auth, transactions]
国家代码PLAID_COUNTRY_CODES存在同样的遍历解析错误。
创建链接令牌的核心代码
def create_link_token(): try: request = LinkTokenCreateRequest( products=products, client_name="xxxx", country_codes=list(map(lambda x: CountryCode(x), PLAID_COUNTRY_CODES)), language='en', user=LinkTokenCreateRequestUser( client_user_id=current_user.get_id() ) ) if PLAID_REDIRECT_URI!=None: request['redirect_uri']=PLAID_REDIRECT_URI # create link token response = client.link_token_create(request) return jsonify(response.to_dict()) except plaid.ApiException as e: print(f"LinkTokenCreateRequest just didn't work. {e}") return json.loads(e.body)
已尝试的排查动作
- 硬编码产品和国家代码值
- 添加打印语句调试
- 切换Plaid sandbox/development/production环境,均失败
- 已在Plaid控制台配置redirect URL,PythonAnywhere已配置SSL
解决建议
修复产品和国家代码的解析逻辑
将字符串按逗号分割后再遍历,避免逐个字符解析的错误:# 处理产品列表 PLAID_PRODUCTS = 'auth,transactions' products = [Products(p.strip()) for p in PLAID_PRODUCTS.split(',')] # 处理国家代码(假设PLAID_COUNTRY_CODES是类似'US,CA'的字符串) PLAID_COUNTRY_CODES = 'US,CA' country_codes = [CountryCode(c.strip()) for c in PLAID_COUNTRY_CODES.split(',')]排查PythonAnywhere的网络连接限制
- 在PythonAnywhere控制台执行
curl https://sandbox.plaid.com/link/token/create测试网络连通性 - 确认Plaid的API域名(如
production.plaid.com、sandbox.plaid.com)是否在PythonAnywhere的出站允许列表中 - 若存在限制,联系PythonAnywhere支持团队开通对应域名的访问权限
- 在PythonAnywhere控制台执行
验证Plaid客户端配置
确保部署环境中的Plaid密钥(client_id、secret)、环境配置与本地一致,且对应环境的权限已正确配置。
内容的提问来源于stack exchange,提问作者Rick Walter
相关产品推荐
相关产品推荐

