احصل على عنوان IP للزوار باستخدام Flask لـ Python
-
04-10-2019 - |
سؤال
أقوم بعمل موقع ويب حيث يمكن للمستخدمين تسجيل الدخول وتنزيل الملفات ، باستخدام ملف Flask micro-framework (مرتكز على Werkzeug) الذي يستخدم Python (2.6 في حالتي).
أحتاج إلى الحصول على عنوان IP للمستخدمين عند تسجيل الدخول (لأغراض التسجيل). لا أحد يعرف كيفية القيام بذلك؟ بالتأكيد هناك طريقة للقيام بذلك مع بيثون؟
المحلول
انظر الوثائق على كيفية الوصول إلى كائن الطلب ثم احصل من كائن الطلب نفسه ، السمة 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.
نصائح أخرى
يمكن للوكلاء أن يجعل هذا الأمر صعبًا بعض الشيء ، تأكد من مراجعة Proxyfix (مستندات القلاع) إذا كنت تستخدم واحدة. ألق نظرة على request.environ
في بيئتك الخاصة. مع nginx سأفعل أحيانًا شيئًا كهذا:
from flask import request
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
عندما تكون الوكلاء ، مثل Nginx ، عناوين متابعة ، فإنها عادة ما تتضمن IP الأصلي في مكان ما في رؤوس الطلبات.
تحديث انظر تطبيق الأمن القارص. مرة أخرى ، راجع الوثائق حول ProxyFix قبل التنفيذ. قد يختلف الحل الخاص بك بناءً على بيئتك الخاصة.
في الواقع ، ما ستجده هو أنه عندما يحصل ببساطة على ما يلي ، سيحصل عليك عنوان الخادم:
request.remote_addr
إذا كنت تريد عنوان IP للعملاء ، فاستخدم ما يلي:
request.environ['REMOTE_ADDR']
يمكن استرداد عنوان IP الخاص بالمستخدم باستخدام المقتطف التالي:
from flask import request
print(request.remote_addr)
أملك nginx ومع أدناه تكوين nginx:
server {
listen 80;
server_name xxxxxx;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://x.x.x.x:8000;
}
}
@tirtha-r كان الحل يعمل بالنسبة لي
#!flask/bin/python
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/', methods=['GET'])
def get_tasks():
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
return jsonify({'ip': request.environ['REMOTE_ADDR']}), 200
else:
return jsonify({'ip': request.environ['HTTP_X_FORWARDED_FOR']}), 200
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=8000)
طلبي والاستجابة:
curl -X GET http://test.api
{
"ip": "Client Ip......"
}
httpbin.org يستخدم هذه الطريقة:
return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
يمنح الرمز أدناه دائمًا عنوان IP العام للعميل (وليس عنوان IP الخاص خلف وكيل).
from flask import request
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
print(request.environ['REMOTE_ADDR'])
else:
print(request.environ['HTTP_X_FORWARDED_FOR']) # if behind a proxy
هذا ينبغي أن يقوم بالمهمة. يوفر عنوان IP العميل (المضيف البعيد).
لاحظ أن هذا الرمز يعمل على جانب الخادم.
from mod_python import apache
req.get_remote_host(apache.REMOTE_NOLOOKUP)