سؤال

أقوم بعمل موقع ويب حيث يمكن للمستخدمين تسجيل الدخول وتنزيل الملفات ، باستخدام ملف 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top