programing

Flask for Python을 사용하여 방문자의 IP 주소 가져오기

sourcetip 2023. 1. 30. 22:52
반응형

Flask for Python을 사용하여 방문자의 IP 주소 가져오기

Python(저의 경우 2.6)을 사용하는 Flask 마이크로프레임워크(Werkzeug 기반)를 사용하여 사용자가 로그인하고 파일을 다운로드할 수 있는 웹사이트를 만들고 있습니다.

로그인을 할 때 사용자의 IP 주소를 취득해야 합니다(로그를 위해).이거 할 줄 아는 사람 있어요?Python으로 할 수 있는 방법이 있을까요?

Request 객체에 액세스하여 동일한 Request 객체인 Atribute에서 가져오는 방법에 대한 설명서를 참조하십시오.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(Flask docs)를 사용하고 있는 경우는 반드시 체크해 주세요.을 보다.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(프록시의 배후에 있는 프라이빗 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

Nginx가 있고 아래 Nginx Configuration이 있습니다.

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

@sengtha-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......"
}

사용자의 IP 주소는 다음 스니펫을 사용하여 검색할 수 있습니다.

from flask import request
print(request.remote_addr)

httpbin.org 에서는 다음 방법을 사용합니다.

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

다른 밸런서 뒤에서 Nginx를 사용하는 경우(예: AWS 애플리케이션 밸런서, HTTP_X_FORWARDED_)FOR은 주소 목록을 반환합니다.다음과 같이 수정할 수 있습니다.

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

다음은 가장 간단한 솔루션과 프로덕션에서의 사용 방법입니다.

from flask import Flask, request
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
# Set environment from any X-Forwarded-For headers if proxy is configured properly
app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1)

@app.before_request
def before_process():
   ip_address = request.remote_addr

더하다include proxy_params로./etc/nginx/sites-available/$project.

  location / {
    proxy_pass http://unix:$project_dir/gunicorn.sock;
    include proxy_params;
  }

include proxy_params는 ProxyFix에 의해 해석된 다음 헤더를 전송합니다.

$ sudo cat /etc/nginx/proxy_params 
proxy_set_header Host $http_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;

Gunicorn 및 Nginx 환경을 사용하는 경우 다음 코드 템플릿이 작동합니다.

addr_ip4 = request.remote_addr

이거면 될 거야클라이언트 IP 주소(리모트호스트)를 제공합니다.

이 코드는 서버측에서 동작하고 있는 것에 주의해 주세요.

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)

Google Cloud App Engine에서는 위의 작업을 전혀 받지 못했습니다.하지만 이것은 효과가 있었다.

ip = request.headers['X-Appengine-User-Ip']

하신 <고객명>님request.remote_addrIP를 사용하다

언급URL : https://stackoverflow.com/questions/3759981/get-ip-address-of-visitors-using-flask-for-python

반응형