2013-04-26 110 views
3

我在nginx/uwsgi上運行的生產中有一個django應用程序。我們最近開始爲我們所有的連接使用SSL。自從搬到SSL,我經常收到以下消息:HTTPSConnectionPool超出最大重試次數

HTTPSConnectionPool(host='foobar.com', port=443): 
    Max retries exceeded with url: /foo/bar 

本質上發生的事情是,我得到了瀏覽器與服務器的Django代碼,然後使用請求庫調用的API通信。它連接到生成錯誤的api。此外,我已將所有請求都轉移到一個會話中(即請求會話),但這沒有幫助。

我已經提到了uwsgi聽衆的數量,因爲我認爲這可能是問題,但我們的負載並不高。另外,我們在SSL之前從未遇到過這個問題。有沒有人對如何解決這個問題有一些建議?我如何調用API

編輯

代碼段。我已經發布了它(大部分)逐字。注意它不是真正失敗的代碼,但是打電話時self.session.post

def save_answer(self): 
    logger.info("Saving answer to question") 
    url = "%s1.0/exam/learneranswer/" % self.api_url 
    response = {'success': False} 

    data = {'questionorder': self.request.POST.get('questionorder'), 
      'paper': self.request.POST.get('paper')} 
    data['answer'] = ",".join(self.request.POST.getlist('answer')) 
    r = self.session.post(url, data=simplejson.dumps(data)) 
    if r.status_code == 201: 
     logger.info("Answer saved successfully") 
     response['success'] = True 
    elif r.status_code == 400: 
     if r.text == "Paper expired": 
      logger.warning("Timer has expired") 
      response['message'] = 'Your time has run out' 
     if r.text == "Question locked": 
      response['message'] = \ 
       'This question is locked and cannot be answered anymore' 
     else: 
      logger.error("Unknown error") 
      self.log_error(r, "Unknown Error while saving answer") 
    else: 
     logger.error("Internal error") 
     self.log_error(r, "Internal error in api while saving answer") 
    return simplejson.dumps(response) 
+0

向我們顯示您的請求代碼和nginx配置。事實上,你可以嘗試設置一個靜態html,並讓nginx指向它,使用請求來顯示它,以驗證這是與nginx,而不是django。 – CppLearner 2013-04-26 07:43:59

+0

該問題未被本地化爲特定的代碼區域。它發生在各個部分。大部分在一個部分,因爲它最常用,但有時也在其他部分。我已更新我的問題以包含代碼片段。 – Gevious 2013-04-26 09:52:46

+0

請求是否實際上對視圖做出了?它通過了nginx嗎? nginx是否將請求交給了Django實例?該網址的工作?對我而言,這些都是重要的問題。這個錯誤可能會引起誤解,並且可能不會提供失敗的原因。另外,第三行''url =「1.0/exam/learneranswer /」%self.api_url''你應該在字符串中有一個佔位符不應該嗎? – CppLearner 2013-04-26 11:19:46

回答

3

我發現,當我的觀點一個項目的一些拋出一個異常,這個錯誤發生拋出異常請求庫。例如,使用Django的「請求」的框架時,將數據發佈到另一個網址:

r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5) 

範圍縮小服務器是有連接的問題,這引發了異常,並且向上冒泡,給我你上面有錯誤。我替換爲:

try: 
    r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5) 
except requests.exceptions.ConnectionError as e: 
    r = "No response" 

這固定它(當然,我建議增加更多的錯誤處理,但上面是相關子集)。

相關問題