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

写了一个调用其他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 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名