使REST调用在不同端口上运行的flask服务

时间:2016-07-07 13:46:47

标签: rest docker flask python-requests docker-compose

我在docker-composefrontendbackend中运行了两项服务,这两项服务都是使用flask开发的。

frontend:
  restart: always
  build: ./frontend
  expose:
    - "8000"
  command: /usr/local/bin/gunicorn --bind :8000 run:application

backend:
  restart: always
  build: ./backend
  expose:
    - "9000"
  command: /usr/local/bin/gunicorn --bind :9000 run:application

我在后端托管一个简单的REST API

@app.route('/api/weather', methods=['GET'])
def get_weather():
    super_cool_function()
    return jsonify({'temperature': 100})

在前端使用此API的最佳方法是什么?我想跟随是一种方式,但我不确定应该是requests.get()

的输入
@app.route('/hello')
def hello():
    r = requests.get()
    return render_template('hello.html', temperature=r.json()['temperature'])

1 个答案:

答案 0 :(得分:1)

如果没有实现您的设置,我通常会通过实现类似于以下的方法来使用请求进行REST调用。

def get_weather(data):
    # Set api endpoint to what's needed
    endpoint = 'http://example.com/api/weather:9000'

    # Do any work needed specific to api prior to call

    # Send request and get response
    response = requests.get(url=endpoint, data=data)

    # Process response
    result = process(response)
    return result

您可以创建一个类,该类将对同一个URL进行所有api调用,只需更改端点。

class ApiCaller():
    def __init__(self, base_url, port):
        self.base_url = base_url
        self.port = port

    def __get_url(self, endpoint):
        return '%s%s%s' % (self.base_url, endpoint, self.port)

    def get_weather(self, data):
        endpoint = 'weather' 
        return requests.get(url=self.__get_url(endpoint), data=data)

    def get_hello(self, data)
        endpoint = 'hello'
        return requests.get(url=self.__get_url(endpoint), data=data)