2012-02-23 4 views
10

में ब्राउज़र शीर्षलेख पुनर्प्राप्त करें मैं वर्तमान में एक खाली चित्रण कर रहा हूं कि पाइथन टॉरनाडो में किसी उपयोगकर्ता के लिए वर्तमान ब्राउज़र शीर्षलेख जानकारी कैसे प्राप्त करें? उदाहरण के लिए, PHP में आप $ _SERVER डेटा को सरल देखना चाहते हैं। टोरनेडो का विकल्प क्या है?पायथन

नोट: How do I get the client IP of a Tornado request? और "अनुरोध" मेरे लिए काम नहीं करता है।

class api(tornado.web.RequestHandler): 
    def initialize(self, *args, **kwargs): 
     self.remote_ip = self.request.headers.get('X-Forwarded-For', self.request.headers.get('X-Real-Ip', self.request.remote_ip)) 
     self.using_ssl = (self.request.headers.get('X-Scheme', 'http') == 'https') 
    def get(self): 
     self.write("Hello " + ("s" if self.using_ssl else "") + " " + self.remote_ip) 

उत्तर

22

यहाँ एक टुकड़ा एक सर्वर मेरे पास है, जहां हम अनुरोध से कुछ हैडर डेटा पुनः प्राप्त के आधार पर है।

# Squid uses X-Forwarded-For, others use X-Real-Ip 
ip = self.headers.get("X-Forwarded-For", self.remote_ip) 
ip = ip.split(',')[-1].strip() 
ip = self.headers.get(
    "X-Real-Ip", ip) 
if netutil.is_valid_ip(ip): 
    self.remote_ip = ip 
# AWS uses X-Forwarded-Proto 
proto = self.headers.get(
    "X-Scheme", self.headers.get("X-Forwarded-Proto", self.protocol)) 
if proto in ("http", "https"): 
    self.protocol = proto 
+1

यहां कुछ पृष्ठभूमि को ध्यान देने योग्य है। कारण @ जेम्स को self.request.protocol गलत हो सकता है यह है कि कुछ सर्वर सेटअप (जैसे अमेज़ॅन ईएलबी जो एसएसएल, अन्य प्रकार के सर्वर-साइड प्रॉक्सी को संभालते हैं) आपके सर्वर पर चीजें पास करने से पहले प्रोटोकॉल और आईपी बदलते हैं। इन प्रॉक्सी द्वारा प्रदान किए गए एक्स-फॉरवर्ड-फॉर और अन्य शीर्षकों का उपयोग करने से आप वास्तव में ब्राउज़र के अनुरोध के लिए काम कर सकते हैं। – mikemaccana

+0

इसके अलावा, आपको पता होना चाहिए कि क्लाइंट स्वयं द्वारा "एक्स-फॉरवर्ड-फॉर" सेट कर सकता है, जिससे आप इस मान को अपने आईपी के रूप में स्वीकार कर सकते हैं। तो आपको केवल इसका उपयोग करना चाहिए यदि कोई ऐसा सेटअप है जो इस हेडर को सेट करता है, सामान्य रूप से नहीं। – johndodo

2

आप tornado/httpserver.py के लिए इसी तरह के तर्क का उपयोग कर सकते हैं या सिर्फ xheaders=True साथ tornado.httpserver.HTTPServer() बनाएँ: