2013-06-03 2 views
1

Возможно ли получить IP-адрес сервера программным способом в запросе на бутылку?получить адрес сервера из бутылки

Мне нужно вернуть ссылку на файл на сервере внутри запроса и знать IP. Бутылка будет запущена на сервере с разными IP-адресами, и все эти IP-адреса будут обслуживать запросы.

В настоящее время я выглядит следующим образом:

from bottle import * 
import json 
@get('/file') 
def getAFileLink(): 
    # some logic here for the right filename to return 
    # server runs now on e.g. 10.0.0.1 and 10.10.0.1 
    # every client should see the IP from the server in the right subnet 
    return json.dumps({'url': 'http://127.0.0.1:1337/some/file.abc'}) 

@route('/some/<filename>') 
def getStaticFile(filename): 
    return static_file(filename, root="/srv/static/files") 

if __name__ == "__main__": 
    run(host='0.0.0.0', port=1337) 
+0

Кто делает маршрутизацию запроса? Вы находитесь за балансировщиком нагрузки? Или ваши клиенты должны быть осведомлены о узле (сервере)? (Я бы советовал по-разному в зависимости от ответа.) –

+0

Маршрутизация из руководства по бутылке: она используется, когда вы хотите обслуживать статические файлы. – reox

ответ

2

Если ваши серверы не находятся за балансировщиком нагрузки, просто используйте HTTP-заголовок Host.

@route('/file') 
def getAFileLink(): 
    host = bottle.request.get_header('host') 
    return {'url': 'http://{}/some/file.abc'.format(host)} 
1

Почему вы используете свой сервер на том же IP, что и ссылка, что вы вернетесь?

import socket 
socket.gethostbyname(socket.gethostname()) 
0

Дайте попробовать на bottle.request.url (docs).

Если вам нужна только схема и имя хоста, используйте urlparse, чтобы получить его.

0

вы можете использовать:

from bottle import request 
urlparts = request.urlparts 
print urlparts.scheme 
print urlparts.netloc 

docs

Смежные вопросы