簡體   English   中英

Python請求“ URL超過最大重試次數”錯誤

[英]Python requests “Max retries exceeded with url” error

我有需要實現的虛擬服務器啟動過程,其中一個過程需要在新啟動的實例中生成的ssh密鑰被添加到部署服務器的“ authorized_keys”文件中。

為了做到這一點,我創建了一個簡單的flask應用程序,該應用程序將監聽部署服務器中傳入的get請求,並獲取實例的IP和端口號,並將其密鑰添加到authorized_keys中。

這是將在部署服務器上的flask應用程序:

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代碼(以上)並通過瀏覽器發出get請求,並且還運行python請求get時,我會收到預期的結果,即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")

能夠獲取文件的內容,但是由於某些原因它無法在flask應用程序中運行。

第二個腳本中的請求:

r = requests.get("http://127.0.0.1:5000/%s/%s"%(local_ip,port))

發生在服務器開始監聽之前,在該腳本的底部。 同時,flask應用會立即發出請求:

rmt_response = requests.get('http://127.0.1.1:9090/id_rsa.pub', timeout=1)

如果服務器已經在偵聽並且速度很慢,則可以使用timeout參數,但是由於服務器未在偵聽,因此“連接被拒絕”立即發生。 在9090上的服務器甚至沒有監聽之前,燒瓶請求就會引發異常。

要使此工作正常進行,您必須在flask應用程序中引入一個延遲,即在接收到傳入請求和發出出站請求之間,或者將啟動請求設置為在服務器開始偵聽后在線程中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM