Flask for Python을 사용하여 방문자의 IP 주소 가져 오기 하여 사용자가 로그온하고 파일을 다운로드 할

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

로그온 할 때 (로깅 목적으로) 사용자의 IP 주소를 가져와야합니다. 누구든지 이것을하는 방법을 알고 있습니까? 분명히 파이썬으로 할 수있는 방법이 있습니까?



답변

Request 오브젝트에 액세스하는 방법에 대한 문서를 참조한 다음 동일한 동일한 Request 오브젝트 인 속성을 가져 오십시오 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 주소를 검색 할 수 있습니다.

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


답변

아래 코드는 항상 클라이언트의 퍼블릭 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


답변

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

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