파이썬 (제 경우 2.6)을 사용 하는 Flask 마이크로 프레임 워크 ( Werkzeug 기반 )를 사용 하여 사용자가 로그온하고 파일을 다운로드 할 수있는 웹 사이트를 만들고 있습니다 .
로그온 할 때 (로깅 목적으로) 사용자의 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 설명서를 참조하십시오 .
HTTP_X_FORWARDED_FOR
므로 각 요청에 대해 localhost로 끝나지 않도록하십시오.
프록시는 이것을 약간 까다로울 수 있습니다. 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']
request.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))
127.0.0.1
프록시로 인한 반품은 별로 도움이되지 않습니다.
다른 밸런서 (예 : AWS Application Balancer) 뒤에 Nginx를 사용하는 경우 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
Gunicorn 및 Nginx 환경을 사용하는 경우 다음 코드 템플릿이 적합합니다.
addr_ip4 = request.remote_addr