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;
}
}
#!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_addr
IP를 사용하다
언급URL : https://stackoverflow.com/questions/3759981/get-ip-address-of-visitors-using-flask-for-python
'programing' 카테고리의 다른 글
팬더 Data Frame을 되돌리는 올바른 방법? (0) | 2023.01.30 |
---|---|
'DBNAME.hibernate_sequence' 테이블이 존재하지 않습니다. (0) | 2023.01.30 |
Axios를 사용하여 Blob으로 저장되는 POST 이미지 - VUEJS (0) | 2023.01.30 |
Media Session Compat:S+(버전 31 이상)를 대상으로 하려면 보류 중 생성 시 FLAG_IMMOBLE 또는 FLAG_MUTABLE 중 하나를 지정해야 합니다.의도 (0) | 2023.01.30 |
Nginx 403은 모든 파일에 대해 금지됩니다. (0) | 2023.01.30 |