পাইথনের জন্য ফ্লাস্ক ব্যবহার করে দর্শকদের আইপি ঠিকানা পান


220

আমি এমন একটি ওয়েবসাইট তৈরি করছি যেখানে ব্যবহারকারীরা ফ্ল্যাশ মাইক্রো-ফ্রেমওয়ার্ক ( ওয়ার্কজেগের উপর ভিত্তি করে ) যা পাইথন ব্যবহার করে (আমার ক্ষেত্রে 2.6) ব্যবহার করে ফাইলগুলি লগইন করতে এবং ফাইলগুলি ডাউনলোড করতে পারে ।

লগ ইন করার সময় (লগিংয়ের উদ্দেশ্যে) আমার আইপি ঠিকানাটি পাওয়া দরকার। কেউ কি জানেন, এটা কিভাবে করে? পাইথনের সাথে এটি করার কোনও উপায় আছে?

উত্তর:


295

কীভাবে অনুরোধ অবজেক্টটি অ্যাক্সেস করবেন ডকুমেন্টেশন দেখুন এবং তারপরে এই একই অনুরোধ অবজেক্ট, বৈশিষ্ট্য থেকে পান 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

আরও তথ্যের জন্য ওয়ার্কজেগ ডকুমেন্টেশন দেখুন


1
কিছু সময়, এটি দরকারী হতে পারে: অনুরোধ.একসেস_আউউর্ট [0]
জনাথন প্রেটস

46
Nginx হিসাবে, এটি নীচে আসল আইপি ঠিকানা প্রেরণ করে HTTP_X_FORWARDED_FORযাতে প্রতিটি অনুরোধের জন্য লোকালহোস্টের সাথে শেষ না হয় তা নিশ্চিত করুন।
মজাদার টুরেক 17

95

প্রক্সিগুলি এটিকে কিছুটা জটিল করে তুলতে পারে, যদি আপনি এটি ব্যবহার করে থাকেন তবে প্রক্সিফিক্স ( ফ্লাস্ক ডক্স ) পরীক্ষা করে দেখুন make কটাক্ষপাত request.environআপনার নির্দিষ্ট পরিবেশে। Nginx দিয়ে আমি মাঝে মাঝে এরকম কিছু করব:

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

প্রক্সিগুলি, যেমন এনজিনেক্স, ফরোয়ার্ড ঠিকানাগুলি যখন অনুরোধ শিরোনামের মধ্যে সাধারণত মূল আইপি অন্তর্ভুক্ত করে।

আপডেট ফ্লাস্ক-সুরক্ষা বাস্তবায়ন দেখুন । আবার, প্রয়োগের আগে প্রক্সিফিক্স সম্পর্কে ডকুমেন্টেশন পর্যালোচনা। আপনার সমাধান আপনার নির্দিষ্ট পরিবেশের উপর নির্ভর করে পরিবর্তিত হতে পারে।


2
আপনি যখন আপনার বিপরীত প্রক্সি কনফিগারেশনে উপযুক্ত ক্ষেত্রগুলি সেট করেন এটি কাজ করে। উত্পাদন ব্যবহৃত হয়।
ড্রানর

3
@ DRhnr হ্যাঁ। উপরের কোডটি কাজ করে যদি উদাহরণস্বরূপ nginx আপনি সেট করেছেন: প্রক্সি_সেট_হেডার এক্স-রিয়েল-আইপি $ রিমোট_এডিডিআর;
pors

@ পোর্স - এটি কাজ করে। আমার মতো আপনার এনগিনেক্স কনফিডে একই সেটিংস রয়েছে। কিন্তু আমি এখনও বুঝতে পারি না কেন কোড: অনুরোধ.হেডারস.জেট ('এক্স-রিয়েল-আইপি', অনুরোধ.রেমোট_এডিডিআর) কাজ করে না। দ্রষ্টব্য, স্বজ্ঞাতভাবে আমি শিরোনামের কাছ থেকে মানটি পেয়েছিলাম এবং 'এক্স-রিয়েল-আইপি' নামটি ব্যবহার করতাম যেমনটি আমার এনজিনেক্স কনফ।
lostdorje

82

প্রকৃতপক্ষে, আপনি যা পাবেন তা হ'ল কেবল যখন নিম্নলিখিতটি পাবেন তখন আপনি সার্ভারের ঠিকানা পাবেন:

request.remote_addr

আপনি যদি ক্লায়েন্টের আইপি ঠিকানা চান, তবে নিম্নলিখিতগুলি ব্যবহার করুন:

request.environ['REMOTE_ADDR']

4
আপনি যদি কেবল একটি বিপরীত প্রক্সি পিছনে থাকেন, না?
রাই-

3
@ এমনিটেক আমি বলব যে আপনার কোডটি আপনি কোনও প্রক্সি পিছনে রয়েছেন কিনা তা বিবেচনা করা উচিত নয়। এই বিকল্পটি যদি বিপরীত প্রক্সি নির্বিশেষে নির্ভরযোগ্যভাবে কাজ করে এবং অন্যরা ধরে নেয় যে আপনি বিপরীত প্রক্সিটির পিছনে নন, তবে এটি পছন্দ করা উচিত। (আমি যদি সহজেই একটি বিপরীত প্রক্সি স্থাপন করতে পারি তবে আমি এটি পরীক্ষা করে দেখি তবে এই মুহুর্তের চেয়ে আমার আরও বেশি সময় লাগবে))
জেএমপিসি 26

@ jpmc26: এটি আদৌ কাজ করার কারণ আমি দেখতে পাচ্ছি না। request.remote_addrবিপরীত প্রক্সি বিশ্বাসযোগ্য কিনা তার উপর নির্ভর করে এমন কোনও সংস্থার মতো যা দূরবর্তী ঠিকানা পাওয়া উচিত sounds
রাই-

3
মোড_উইজি ব্যবহার করে, অনুরোধ.আরমোট_এডিডিআর প্রতিবার সার্ভারের ঠিকানা ফেরত দিয়েছে। অনুরোধ। পরিবেশ ['REMOTE_ADDR'] আমাকে ক্লায়েন্টের সর্বজনীন আইপি ঠিকানা পেয়েছে। আমি কি কিছু মিস করছি?
চিডো

@ jpmc26 আপনি ঘন ঘন না যত্ন যদি আপনি দূরবর্তী কোন প্রক্সি পিছনে করছি প্রয়োজন নেই। আপনি যদি হন তবে আপনার সাথে সংযোগের চেয়ে আইপিটি দূরবর্তী প্রক্সি সার্ভারের হবে এবং আসল ক্লায়েন্টের আইপি পেতে আপনাকে যোগ হওয়া শিরোনামের উপর নির্ভর করতে হবে। যদি আপনি না হন তবে সেই শিরোনামগুলি সাধারণত উপস্থিত থাকবে না এবং আপনি সংযোগ আইপিটি ক্লায়েন্ট আইপি হিসাবে ব্যবহার করতে চাইবেন। এবং আপনি অগত্যা কেবলমাত্র শিরোনামটি পরীক্ষা করতে পারেন এবং এটি উপস্থিত না থাকলে সংযোগ আইপিতে ফিরে যেতে পারেন কারণ আপনি যদি কোনও বিপরীত প্রক্সিটির পিছনে না থাকেন তবে কোনও ক্লায়েন্ট তাদের আইপি ফাঁকি দিতে পারে, যা অনেক পরিস্থিতিতে সুরক্ষার সমস্যা হয়ে দাঁড়াবে ।
মার্ক অ্যামেরি

28

ব্যবহারকারীর আইপি ঠিকানা নিম্নলিখিত স্নিপেট ব্যবহার করে পুনরুদ্ধার করা যেতে পারে:

from flask import request
print(request.remote_addr)

3
অ্যাপটি যদি এনজিনেক্সের মতো প্রক্সি সার্ভারের পিছনে চলতে থাকে তবে এটি সত্য নয় । যা প্রায়শই প্রযোজনায় থাকে।
দতাশামান

17

আমার কাছে এনগিনেক্স এবং নীগিনেক্স কনফিগার নীচে রয়েছে :

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;
        }
}

@ তীর্থ-আর সমাধান আমার পক্ষে কাজ করেছে

#!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......"
}

13

নীচের কোডটি সর্বদা ক্লায়েন্টের সর্বজনীন আইপি দেয় (এবং প্রক্সিটির পিছনে কোনও ব্যক্তিগত আইপি নয়)।

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

এই উত্তরটি আমার ব্লগ অনুসারে আমার এনগিনেক্স কনফিগারেশন পরিবর্তনের সাথে আমার পক্ষে কাজ করেছে। ক্যালভিন.মে
রোমানো


3

আপনি যদি অন্যান্য ব্যালেন্সারের পিছনে Nginx ব্যবহার করেন, উদাহরণস্বরূপ AWS অ্যাপ্লিকেশন ব্যালেন্সার, HTTP_X_FORWARDED_FOR ঠিকানার তালিকা ফেরত দেয় returns এটি ঠিক করা যেতে পারে:

if 'X-Forwarded-For' in request.headers:
    proxy_data = request.headers['X-Forwarded-For']
    ip_list = proxy_data.split(',')
    user_ip = ip_list[0]  # first address in list is User IP
else:
    user_ip = request.remote_addr  # For local development


0

এটি কাজ করা উচিত। এটি ক্লায়েন্টের আইপি ঠিকানা (রিমোট হোস্ট) সরবরাহ করে।

নোট করুন যে এই কোডটি সার্ভারের পাশ দিয়ে চলছে।

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.