Python的请求“最大重试次数超过了与URL”错误
问题描述:
我有虚拟服务器启动过程,我需要实施和过程中的一种需要在新推出的情况下产生的SSH密钥被添加到部署服务器“的authorized_keys”文件。Python的请求“最大重试次数超过了与URL”错误
为了做到这一点我创建了一个简单的烧瓶的应用程序,将监听与它的密钥将被添加到authorized_keys中实例的IP和端口号在部署服务器传入的GET请求。
这里是瓶的应用程序,将在部署服务器上:
from flask import Flask, render_template
import requests
import os
from time import sleep
app = Flask(__name__)
#Get the ip and port number from the newly launched port
@app.route('/<ip_addr>/<port>')
def get_ip_port(ip_addr, port):
#rmt_response = requests.get('http://%s:%s/id_rsa.pub' % (ip_addr, port))
rmt_response = requests.get('http://127.0.1.1:9090/id_rsa.pub', timeout=1)
#sleep(5)
if rmt_response.status_code == 200:
auth_file = open("authorized_keys", "a")
auth_file.write(rmt_response.content)
return render_template('layout.html', ip_addr=ip_addr, port=port, \
srvrsp=rmt_response.content, rmt_response=rmt_response)
else:
return render_template('layout.html', rmt_response=rmt_response)
if __name__ == '__main__':
app.run(debug=True)
这里是将要在新的服务器实例启动的Python应用程序
import sys, socket
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import requests
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
local_ip = socket.gethostbyname(socket.gethostname())
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 9090
#Send the ip and the port num to deployment host
r = requests.get("http://127.0.0.1:5000/%s/%s"%(local_ip,port))
#For debug only
rtext = "http://127.0.0.1:5000/%s/%s"%(local_ip,port)
server_address=(local_ip, port)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
print local_ip
print r
print rtext
httpd.serve_forever()
当我运行instace代码(上面)并通过浏览器发出获取请求,并运行python请求获取我收到的预期结果,即id_rsa.pub文件的内容。但是当从Flask应用程序发出确切的请求时,它会给我一个错误。
ConnectionError: HTTPConnectionPool(host='127.0.1.1', port=9090): Max retries exceeded with url: /id_rsa.pub (Caused by <class 'socket.error'>: [Errno 111] Connection refused)
我没有研究这个错误,因为它涉及到Python的请求,但没能找到确凿的解决方案。我知道事实的文件送达,因为我可以从浏览器下载它,我就可以发出请求
x = requests.get("http://127.0.1.1:9090/id_rsa.pub")
能够得到文件的内容,但它不烧瓶应用中出于某种原因。
答
在第二个脚本请求:
r = requests.get("http://127.0.0.1:5000/%s/%s"%(local_ip,port))
发生在服务器启动监听之前,在该脚本的底部。烧瓶应用同时发出一个即时请求回:
rmt_response = requests.get('http://127.0.1.1:9090/id_rsa.pub', timeout=1)
如果服务器已经听,只是缓慢,超时参数会的工作,但因为服务器没有听,在“连接被拒绝”立即发生。 9090上的服务器甚至在监听之前,您的烧录请求会引发异常。
为了完成这项工作,您必须在接收传入请求和发出出站请求之间在烧瓶应用程序中引入延迟,否则在服务器开始侦听之后将启动请求设置为在线程中运行。