2013-01-03 41 views
10

我設置了python/flask/uwsgi + nginx web應用程序,它工作正常。我想用geoip,我把它設置在nginx端:如何閱讀從nginx傳遞的python/flask中的UWSGI參數

location/{ 
      include   uwsgi_params; 
      uwsgi_pass  unix:/tmp/qbaka-visit.sock; 
      ... 
      uwsgi_param  GEOIP_COUNTRY_CODE $geoip_country_code; 
    } 

但是現在我不知道如何在python中讀取這個屬性。在使用uwsgi之前,我使用了簡單的內置webserver + nginx proxy_pass,在這種情況下,我使用proxy_set_header X-Geo-Country $geoip_country_code;並使用request.headers讀取此參數,但對於UWSGI參數,我無法弄清楚如何讀取它們。

回答

21

uwsgi_param將給定名稱的wsgi environ鍵設置給應用程序。您可以將其用於標頭,它遵循CGI約定使用前綴HTTP_。您proxy_set_header相當於將是:

uwsgi_param HTTP_X_GEOIP_COUNTRY $geoip_country_code; 

注意,標題名稱必須大寫,並用下劃線代替,被確認爲WSGI有效的頭破折號。

另外,它看起來像環境可以在燒瓶中訪問,因爲request.environ,所以你可以保持你的uwsgi_param相同,但是將其讀爲request.environ['GEOIP_COUNTRY_CODE']。實際上,這可能更可取,因爲您可以通過這種方式將它們與實際請求標題區分開來。

+1

非常感謝,這工作。 – Daniil

+0

謝謝你。不過,我似乎無法在任何地方找到關於使用'uwsgi_param'設置HTTP標頭的*官方文檔。有人碰巧有參考嗎? – esmail

+0

@esmail:請求頭和HTTP_之間的關係不是uwsgi的一部分,而是'wsgi' /'pep-333'(請參閱:https://www.python.org/dev/peps/pep -0333 /#ENVIRON變量)。 'uwsgi_param'在傳遞給應用程序的環境中設置鍵值對。事實上,'pep-333'特別將這些委託給cgi規範:https://tools.ietf.org/html/rfc3875#section-4.1.18 – SingleNegationElimination