liyunzheng120 2021-11-07 02:43 采纳率: 42.9%
浏览 503
已结题

写了一个调用其他API接口获取数据的项目,调试正常。使用时会频繁报错,来先生教我

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#因为是公开提问,地址及用户名,密码有改动
import json
import pymysql
import requests
import threading
from flask import Flask, request
from mysql_tool import MysqlOper

app = Flask(__name__)
app.secret_key = 'zreq_sc_test'
db_lock = threading.Lock()
conn = pymysql.connect(
    user = 'wen307',
    passwd = 'JIEx120',
    db = 'dydata',
    host = 'rm-bp19j36e0553cu6kyo.mysql.rds.aliyuncs.com',
    port = 3306,
    charset = 'utf8',
    autocommit = True  # 自动提交确认
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 生成游标对象
print("zheli",conn.ping(reconnect=True) )


# 原始用户名  原始密码  原始id
src_num = '1'
src_pwd = 'jie110120'
src_cid = 'dy06'
src_pid = '20044'

src_url = 'http://315.716.188.244:8081/api/consumer/getPhones?pid={}&cid={}&num={}&password={}' \
    .format(src_pid, src_cid, src_num, src_pwd)
@app.route('/login', methods=["GET"])
def login():
    #cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 生成游标对象
    result = {'code': 1, 'message': ''}
    user = request.args.get('user')
    pwd = request.args.get('pwd')
    if not all([user,pwd]):
        result['message'] = '参数不完整'
    else:
        sql = "select yue from dydata where user='{}' and pwd='{}'" \
        .format(user, pwd)
        conn.ping(reconnect=True)
        res = cursor.execute(sql)
        if res:
           print(cursor.description)
           yue=cursor.fetchmany(1)
        #result['message'] = yue
           result = {'code': 0, 'message': yue}
        else:
           result['message'] = '用户名密码错误或余额不足'
    return json.dumps(result).encode('utf-8').decode('unicode_escape')
@app.route('/getphonea', methods=["GET"])

def getphone():
    #cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 生成游标对象
    result = {'code': 1, 'message': ''}
    user = request.args.get('user')
    pwd = request.args.get('pwd')
    if not all([user,pwd]):
       result['message'] = '参数不完整'
    else:
      sql = "select yue from dydata where user='{}' and pwd='{}' and yue>3" \
        .format(user, pwd)
      #conn.ping(reconnect=True)
      with db_lock:
          res = cursor.execute(sql)
      if res:
            reponse = requests.get(src_url)  # 访问原始API
            while   reponse.status_code!=200:
                   reponse = requests.get(src_url)
            result = json.loads(reponse.text)  # 解析返回json
            code = result.get('code')  # 获取code值
            if code == '1006':
               result = {'code': 2, 'msg': 'Please wait a moment'}
            if code == '0000':#要改
               sql = "update dydata set quhaoshu=quhaoshu+1 where user = '{}'" \
               .format(user)
               conn.ping(reconnect=True)
               with db_lock:
                    restwo = cursor.execute(sql)  # 被影响的行数
               result['code'] = '0'
      else:
        result['message'] = '用户名密码错误或余额不足'
    return json.dumps(result).encode('utf-8').decode('unicode_escape')

    # 取code部分
@app.route('/getcodea',methods=["GET"])
def getcode():
    resultcode = {'code': 1, 'message': ''}
    user = request.args.get('user')
    pwd = request.args.get('pwd')
    phone = request.args.get('phone')
    if not all([user,pwd,phone]):
       resultcode['message'] = '参数不完整'
    else:
       sql = "select yue from dydata where user='{}' and pwd='{}' and yue>3" \
       .format(user, pwd)
       conn.ping(reconnect=True)
       with db_lock:
         res = cursor.execute(sql)
       if res:
          src_codeurl = 'http://315.716.188.244:8081/api/consumer/getC?pid={}&cid={}&tel={}&password={}' \
          .format('20044', 'dy06', phone, 'jie110120')
          src_succurl = 'http://315.716.188.244:8081/api/consumer/registerNotify?pid={}&cid={}&tel={}&status=1&remark=&password={}' \
          .format('20044', 'dy06', phone, 'jie110120')
          reponse = requests.get(src_codeurl)
          while  reponse.status_code != 200:# 访问原始API取码超时判断
              reponse = requests.get(src_codeurl)
          resultcode = json.loads(reponse.text)  # 解析返回json
          succode = resultcode.get('code')  # 获取code值
          if succode == "0000":
             sql = "update dydata set yue=yue-1 where user = '{}'" \
                  .format(user)
             conn.ping(reconnect=True)
             with db_lock:
               restwo = cursor.execute(sql)  # 被影响的行数
               if not restwo:                #这里缩进有疑点
                   conn2 = pymysql.connect(
                       user='wen307',
                       passwd='JIEx120',
                       db='dydata',
                       host='rm-bp19j36e0553cu6kyo.mysql.rds.aliyuncs.com',
                       port=3306,
                       charset='utf8',
                       autocommit=True  # 自动提交确认
                   )
                   cursor2 = conn2.cursor(cursor=pymysql.cursors.DictCursor)  # 生成游标对象
                   sql = "update dydata set yue=yue-1 where user = '{}'" \
                       .format(user)
                   with db_lock:
                    restwo = cursor2.execute(sql)  # 被影响的行数
             fankuireponse=requests.get(src_succurl)
             while fankuireponse.status_code != 200:  # 访问原始API,判断是否超时
                 fankuireponse = requests.get(src_succurl)
             fankuiresultcode = json.loads(fankuireponse.text)  # 解析返回json
             fankuisuccode = fankuiresultcode.get('code')  # 获取code值
             while fankuisuccode != '0000':
                  requests.get(src_succurl)
                  fankuiresultcode = json.loads(reponse.text)  # 解析返回json
                  fankuisuccode = fankuiresultcode.get('code')  # 获取code值
             sql = "update dydata set chenggong=chenggong+1 where user = '{}'" \
               .format(user)
             conn.ping(reconnect=True)
             with db_lock:
                 restwo = cursor.execute(sql)  # 被影响的行数
       else:
          resultcode['message'] = '用户名密码错误或余额不足'
    return json.dumps(resultcode).encode("utf-8").decode('unicode_escape')
#反馈部分
@app.route('/feedbacka',methods=["GET"])
def feedback():
    #cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 生成游标对象
    resultcode = {'code': 1, 'message': ''}
    user = request.args.get('user')
    pwd = request.args.get('pwd')
    phone = request.args.get('phone')
    mark=request.args.get('mark')
    if not all([user,pwd,phone,mark]):
        resultcode['message'] = '参数不完整'
    if mark=='1' or mark=='4':
       resultcode['message'] = 'mark参数有误'
    else:
       src_fkurl = 'http://315.716.188.244:8081/api/consumer/registerNotify?pid={}&cid={}&tel={}&status={}&remark=&password={}' \
        .format('20044', 'dy06', phone,mark, 'jie110120')
       reponse = requests.get(src_fkurl)  # 访问原始API
       while reponse.status_code != 200:
           reponse = requests.get(src_fkurl)
       resultcode = json.loads(reponse.text)  # 解析返回json
       succode = resultcode.get('code')  # 获取code值
       if succode == "0000":
           resultcode['message'] = '反馈成功'
       else:
            resultcode['message'] = '反馈失败'
    return json.dumps(resultcode).encode('utf-8').decode('unicode_escape')

@app.route('/test',methods=["GET"])
def test():
    return json.dumps('test')
if __name__ == '__main__':
    app.run('0.0.0.0', 36001, threaded=True)

#主要报错
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
AttributeError: 'NoneType' object has no attribute 'settimeout'
TimeoutError: [Errno 110] Connection timed out
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f270a62eb00>: Failed to establish a new connection: [Errno 110] Connection timed out
urllib3.exceptions.MaxRetryError: HTTPConnectionPool.......
RuntimeError: reentrant call inside <_io.BufferedReader name=14>
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
http.client.RemoteDisconnected: Remote end closed connection without response
  • 写回答

5条回答 默认 最新

  • 极客飞兔 2021年博客之星后端领域TOP3 2021-11-13 09:41
    关注

    你说你还剩下最后一个报错没有解决:urllib3.exceptions.MaxRetryError
    由字面意思可以知道是http连接太多没有关闭导致的

    解决方法一:

    • 增加http连接重试次数
    requests.adapters.DEFAULT_RETRIES = 5
    
    • 关闭多余的连接,因为requests使用了urllib3库,默认的http connection是keep-alive的,requests设置False关闭
    s = requests.session()
    s.keep_alive = False
    

    解决方法二:

    是因为在每次数据传输前客户端要和服务器建立TCP连接,为节省传输消耗,默认为keep-alive,即连接一次,传输多次,然而在多次访问后不能结束并回到连接池中,导致不能产生新的连接
    headers中的Connection默认为keep-alive,
    将header中的Connection一项置为close

    headers = {
        'Connection': 'close',
    }
    r = requests.get(url, headers=headers)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月7日

悬赏问题

  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。
  • ¥20 CST怎么把天线放在座椅环境中并仿真
  • ¥15 任务A:大数据平台搭建(容器环境)怎么做呢?
  • ¥15 YOLOv8obb获取边框坐标时报错AttributeError: 'NoneType' object has no attribute 'xywhr'
  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?