2015-06-03 3 views
20

Ich baue die Flask App mit React, ich hatte Probleme mit dem Routing.Flask und React Routing

Das Backend ist verantwortlich eine API zu sein, damit einige Routen wie folgt aussehen:

@app.route('/api/v1/do-something/', methods=["GET"]) 
def do_something(): 
    return something() 

und der Hauptstraße, die zu den führt zu Reagieren:

@app.route('/') 
def index(): 
    return render_template('index.html') 

ich react-router in der bin mit Reagiere App, alles funktioniert gut, react-router bringt mich zu und ich bekomme die gerenderte Ansicht, aber wenn ich die Seite auf /something aktualisiere, dann kümmert sich Flask App um diesen Anruf und ich bekomme Not Found Fehler.

Was ist die beste Lösung? Ich dachte über das Umleiten aller Anrufe, die nicht anrufen /api/v1/... zu / ist es nicht ideal, da ich die Homepage meiner App, nicht gerendert React Ansicht zurück erhalten werde.

+1

Der schnellste und einfachste Weg, wenn Sie nicht möchten, dass Ihr Backend die URLs behandelt, ist die Verwendung der HTML5-History-API. Das Deaktivieren führt zu Hashbang-URLs wie '/ #/something' und das erneute Laden wird immer die'/'Ansicht auf dem Backend auslösen. Andernfalls müssen Sie entweder die Anfragen in Ihrem Backend bearbeiten oder sie an Ihre React-App weiterleiten, die wiederum die Anfrage analysieren und die Standortänderung auslösen muss, wenn die angeforderte URL nicht '/' ist. – sthzg

+0

Das scheint eine Art Lösung zu sein, danke! – knowbody

+3

Ich denke nicht, dass es eine gute Lösung ist. Es ist 2015, du solltest wirklich die History API benutzen. –

Antwort

23

Wir verwendeten catch-all URLs für diese.

from flask import Flask 
app = Flask(__name__) 

@app.route('/', defaults={'path': ''}) 
@app.route('/<path:path>') 
def catch_all(path): 
    return 'You want path: %s' % path 

if __name__ == '__main__': 
    app.run() 

können Sie auch eine extra Meile und Wiederverwendung der Flask routing System gehen path auf die gleichen Strecken wie Client entsprechen, so dass Sie die Daten-Client innerhalb der HTML-Antwort müssen als JSON einbetten können.

+1

Wenn alle Routen angewiesen werden, alle Funktionen zu erfassen, wie würden Sie Backend-API-Routen trennen und Routen reagieren, wenn ich vom Front-End aus einen AJAX-Request-Aufruf mache? –

+4

@shangyeshen API-Routen vor dem Catch-All registrieren, damit sie Vorrang haben. –

+0

@ DanAbramov danke für Ihre Hilfe! –