2010-09-21 23 views
144

मैं ऐसी वेबसाइट बना रहा हूं जहां उपयोगकर्ता Flask micro-framework (Werkzeug पर आधारित) का उपयोग कर फ़ाइलों को लॉग ऑन और डाउनलोड कर सकें, जो पायथन (2.6 मेरे मामले में) का उपयोग करता है।आगंतुकों का आईपी पता प्राप्त करें

जब वे लॉग ऑन करते हैं तो मुझे उपयोगकर्ताओं का आईपी पता प्राप्त करने की आवश्यकता होती है (लॉगिंग उद्देश्यों के लिए)। क्या कोई यह जानता है कि यह कैसे करें? निश्चित रूप से Python के साथ ऐसा करने का एक तरीका है?

उत्तर

195

how to access the Request object पर प्रलेखन देखें और फिर उसी अनुरोध ऑब्जेक्ट से प्राप्त करें, विशेषता remote_addr

कोड उदाहरण

from flask import request 
from flask import jsonify 

@app.route("/get_my_ip", methods=["GET"]) 
def get_my_ip(): 
    return jsonify({'ip': request.remote_addr}), 200 

अधिक जानकारी के लिए Werkzeug documentation देखते हैं।

+2

इसका उत्तर बेहतर है क्योंकि इसमें कोड नमूना शामिल है। –

+1

कुछ बार, यह उपयोगी हो सकता है: request.access_route [0] –

+16

nginx के लिए, यह वास्तविक HTTP पता 'HTTP_X_FORWARDED_FOR' के अंतर्गत भेजता है, इसलिए सुनिश्चित करें कि आप प्रत्येक अनुरोध के लिए स्थानीयहोस्ट के साथ समाप्त नहीं होते हैं। –

27

उपयोगकर्ता के आईपी पते निम्नलिखित स्निपेट का उपयोग कर प्राप्त किया जा सकता है:

request.remote_addr 

:

from flask import request 
print(request.remote_addr) 
+0

यह सही नहीं है यदि ऐप _nginx_ जैसे प्रॉक्सी सर्वर के पीछे चल रहा है। जो अक्सर उत्पादन में होता है। – datashaman

67

वास्तव में, क्या आप पाएंगे कि जब बस निम्नलिखित हो रही आप सर्वर का पता मिल जाएगा है यदि आप क्लाइंट आईपी एड्रेस चाहते हैं, तो निम्न का उपयोग करें:

request.environ['REMOTE_ADDR'] 
+2

केवल अगर आप रिवर्स प्रॉक्सी के पीछे हैं, नहीं? – Ryan

+1

@minitech मैं कहूंगा कि आपके कोड परवाह नहीं होना चाहिए कि आप प्रॉक्सी के पीछे हैं या नहीं। यदि यह विकल्प रिवर्स प्रॉक्सी के बावजूद विश्वसनीय रूप से काम करता है और दूसरे मानते हैं कि आप रिवर्स प्रॉक्सी के पीछे नहीं हैं, तो इसे प्राथमिकता दी जानी चाहिए।(अगर मैं आसानी से एक रिवर्स प्रॉक्सी स्थापित कर सकता हूं तो मैं इसका परीक्षण करूंगा, लेकिन इस समय मेरे पास अधिक समय लगेगा।) – jpmc26

+0

@ jpmc26: मुझे कोई कारण नहीं दिखता कि इसे बिल्कुल क्यों काम करना चाहिए। 'request.remote_addr' ऐसी संपत्ति की तरह लगता है जो रिवर्स प्रॉक्सी विश्वसनीय है या नहीं, इस पर निर्भर करता है कि रिमोट पता होना चाहिए। – Ryan

59

प्रॉक्सी यह थोड़ा मुश्किल बना सकता है, यदि आप एक का उपयोग कर रहे हैं तो ProxyFix (Flask docs) देखें। अपने विशेष वातावरण में request.environ पर एक नज़र डालें। nginx के साथ मैं कभी कभी कुछ इस तरह करना होगा:

from flask import request 
request.environ.get('HTTP_X_REAL_IP', request.remote_addr) 

ऐसे nginx, आगे पते के रूप में प्रॉक्सी,, वे आम तौर पर अनुरोध शीर्षों में कहीं मूल आईपी शामिल है।

अद्यतनSee the flask-security implementation। फिर, कार्यान्वयन से पहले प्रॉक्सीफिक्स के बारे में दस्तावेज़ों की समीक्षा करें। आपका समाधान आपके विशेष पर्यावरण के आधार पर भिन्न हो सकता है।

return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr)) 
+0

धन्यवाद। यह – OWADVL

+2

ऊपर उठाया जाना चाहिए यह तब काम करता है जब आप उचित रिवर्स प्रॉक्सी की कॉन्फ़िगरेशन में उचित फ़ील्ड सेट करते हैं। उत्पादन में प्रयुक्त – drahnr

+2

@drahnr हाँ वास्तव में। उपरोक्त कोड काम करता है यदि उदा। nginx आप सेट करते हैं: proxy_set_header एक्स-रीयल-आईपी $ remote_addr; – pors

7

httpbin.org इस विधि का उपयोग करता है। यह क्लाइंट आईपी पता (रिमोट होस्ट) प्रदान करता है।

ध्यान दें कि यह कोड सर्वर पक्ष पर चल रहा है।

from mod_python import apache 

req.get_remote_host(apache.REMOTE_NOLOOKUP) 
संबंधित मुद्दे