2016-07-07 12 views
0

Ich habe zwei Dienste, die in docker-compose, frontend und backend laufen, beide entwickelt mit Kolben.REST-Aufrufe zu Flask-Dienst machen, der auf anderem Port läuft

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 

Ich bin Hosting einen einfachen REST-API im Backend

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

Was ist der beste Weg, um diese API in Frontend zu konsumieren? Ich denke, finden Sie eine Möglichkeit, aber ich bin nicht sicher, was die Eingabe

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

Haben Sie überlegt, die URL zu dem Endpunkt zu verwenden, den Sie konsumieren möchten? So funktioniert jede Anfrage im Web. – davidism

+0

@davidism - Ahh du meinst 'r = requests.get ('http://example.com/api/weather:9000')'. Im Grunde versuchte ich 'url_for' Funktion in der Flasche und wurde verwirrt – kampta

+0

Ist das der Standard Weg? – kampta

Antwort

1

Ohne Ihre Einrichtung umgesetzt haben, zu requests.get() sollte ich in der Regel machen REST ruft Anfragen unter Verwendung von einem Verfahren ähnlich der folgenden Umsetzung.

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 

Sie können eine Klasse erstellen, die alle api Anrufe auf die gleiche URL machen werden, und nur den Endpunkt ändern.

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)