2015-06-03 4 views
20

Я создаю приложение Flask с React, у меня возникла проблема с маршрутизацией.Flask and React routing

Бэкэнд отвечает быть API, поэтому некоторые маршруты выглядеть следующим образом:

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

и основной маршрут, который ведет к React:

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

Я использую react-router в React приложение, все работает нормально, реагирует маршрутизатор принимает меня к /something, и я получаю визуализированный вид, но когда я обновляю страницу на /something, тогда приложение Flask позаботится об этом вызове, и я получаю ошибку Not Found.

Какое оптимальное решение? Я думал о перенаправлении всех вызовов, которые не звонят /api/v1/..., до /, это не идеально, поскольку я верну домашнюю страницу своего приложения, а не визуализирую представление React.

+1

Самый быстрый и простой способ, если вы не хотите, чтобы ваш backend обрабатывал URL-адреса, нельзя использовать историю HTML5 history. Деактивация этого приведет к URL-адресам hashbang, например '/ #/something', и их перезагрузка всегда будет запускать представление'/'на сервере. В противном случае вам нужно либо обрабатывать запросы на своем сервере, либо перенаправлять их в свое приложение-ответ, что, в свою очередь, необходимо проанализировать запрос и инициировать изменение местоположения, если запрошенный URL не является '/'. – sthzg

+0

Это похоже на какое-то решение, спасибо! – knowbody

+3

Я не думаю, что это хорошее решение. Это 2015 год, вы действительно должны использовать API истории. –

ответ

23

Для этого мы использовали catch-all URLs.

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() 

Вы также можете пойти дополнительные мили и использовать систему Flask routing, чтобы соответствовать path к тем же маршрутам, как клиент, так что вы можете встраивать клиент данные будут нуждаться в JSON в ответе HTML.

+1

, если все маршруты будут направлены на то, чтобы поймать все функции, как бы вы отделили бэкэнд-маршруты api и реагировали на маршруты, когда я делаю запрос запроса ajax от внешнего конца? –

+4

@shangyeshen Регистрировать API-маршруты до того, как все они будут иметь приоритет. –

+0

@ DanAbramov за вашу помощь! –