2015-09-26 86 views
0

我在請求中提出請求,以適應我的面向服務的設計。本地,這段代碼起作用。然而,在使用ubuntu libapache2-mod-wsgi-py3進行生產時,我的嵌套請求失敗。瓶內請求中的請求失敗WSGI環境

一個關鍵點是兩個服務都存在於服務器上的相同<Virtualhost>,所以我懷疑這是一個線程問題。

稱爲內newitem()第二個請求失敗,ConnectionRefusedError(111, 'Connection refused')上,即使當我張貼到它在此語境之外預期的API端點功能(例如捲曲POST到確切的網址)我WSGI Ubuntu的盒子。

另一個重要的一點是,當我有兩個單獨的燒瓶應用程序運行在不同的端口上時,請求設計中的這個請求在我的本地工作。直到我運行帶有--threaded標誌的API服務器時,我的本地問題出現了這個問題。

我的服務器配置如下:

app2.wsgi:

#!env/bin/python3 
import sys, os 
sys.path.append('/var/www/api_app') 

from app import create_app 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 

application = create_app(os.getenv('FLASK_CONFIG') or 'default') 

if __name__ == "__main__": 
    manager.run() 

的Apache2 /網站可用/ default.conf

<VirtualHost *:80> 
     DocumentRoot /var/www/html 

     # ------ WSGI config ------ 
     WSGIDaemonProcess app1 user=www-data group=www-data threads=5 
     WSGIDaemonProcess app2 user=www-data group=www-data threads=5 
     WSGIScriptAlias /front_end /var/www/front_end/app2.wsgi 
     WSGIScriptAlias /api_app /var/www/api_app/app2.wsgi 
     WSGIScriptReloading On 

      <Directory /var/www/api_app> 
        WSGIProcessGroup app2 
        WSGIApplicationGroup %{GLOBAL} 
        Order deny,allow 
        Allow from all 
      </Directory> 
      <Directory /var/www/front_end> 
        WSGIProcessGroup app1 
        WSGIApplicationGroup %{GLOBAL} 
        Order deny,allow 
        Allow from all 
      </Directory> 
</VirtualHost> 

以下代碼在我開始使用API​​服務時對我的本地環境非常有用--threaded標誌它在request.post()行上的WSGI Apache2上失敗。

@plant_material.route('/plant_material/new', methods=['GET', 'POST']) 
def newitem(): 
    form = PlantMaterialForm() 
    if form.validate_on_submit(): 
     api_uri = current_app.config['API_SERVER_URI'] 
     url = api_uri + "api/plant_material/new" 
     headers = {'Content-Type': 'application/json'} 
     print(request.form) 
     r = requests.post(url, data=json.dumps(request.form), headers=headers) 
     if r.status_code == 200: 
      return redirect(url_for('plant_material.index')) 
     elif r.status_code == 401: 
      flash('Whiteboard API Unauthorized') 
     elif r.status_code == 403: 
      flash('Whiteboard API Forbidden') 
     elif r.status_code == 500: 
      flash('Internal Server Error') 
    return render_template('plant_material/new.html', form=form) 

如何在生產服務器上的請求中提出請求?

+0

你檢查,如果服務器防火牆允許從服務器到'API_SERVER_URI'連接的API?換句話說,你可以從同一臺機器連接到服務器嗎? –

+0

我ssh進入服務器,然後我從它的服務器捲曲它:curl -v -L -G -d「q =&o = 0&l = 10&m = variety」http://10.11.12.103/front_end/api/inventory ...產生JSON響應 –

+0

這至少是一些東西。你110%確定'request.post()'去到完全相同的URL,對吧?只是檢查。 –

回答

2

Apache和mod_wsgi負責併發處理;從同一臺服務器上的一個WSGI應用程序到另一個應用程序的格式錯誤的請求沒有理由在此處失敗。

  • 確保沒有從本地主機到服務器的防火牆阻止請求。例如,使用curl從命令行測試相同的URL。
  • 三重檢查你的假設;在測試您的連接是否正常工作時,請使用current_app.config['API_SERVER_URI']的實時值,而不是您認爲的值。
  • 換出HTTP方法;試着從一個subprocess調用運行curl,或使用urllib2訪問