2015-06-03 23 views
20

Tôi đang xây dựng ứng dụng Flask với React, tôi đã gặp vấn đề với định tuyến.Flask và React routing

Các backend có trách nhiệm là một API, do đó một số tuyến như sau:

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

và các tuyến đường chính dẫn đến Phản ứng:

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

Tôi đang sử dụng react-router trong Ứng dụng React, mọi thứ hoạt động tốt, phản ứng-router đưa tôi đến /something và tôi nhận được hiển thị, nhưng khi tôi làm mới trang trên /something thì ứng dụng Flask sẽ xử lý cuộc gọi này và tôi nhận được lỗi Not Found.

Giải pháp tốt nhất là gì? Tôi đã suy nghĩ về việc chuyển hướng tất cả các cuộc gọi không gọi số /api/v1/... đến / nó không lý tưởng vì tôi sẽ lấy lại trang chủ của ứng dụng của tôi, không hiển thị chế độ xem Phản hồi.

+1

Cách nhanh nhất và dễ nhất nếu bạn không muốn chương trình phụ trợ của mình xử lý các url không phải là sử dụng api lịch sử HTML5. Việc hủy kích hoạt nó sẽ dẫn đến các url băm như '/ #/something' và tải lại chúng sẽ luôn kích hoạt chế độ xem'/'trên phần cuối. Nếu không, bạn cần phải xử lý các yêu cầu trên chương trình phụ trợ của bạn hoặc chuyển hướng chúng đến ứng dụng phản ứng của bạn, do đó cần phân tích yêu cầu và kích hoạt thay đổi vị trí nếu url được yêu cầu không phải là '/'. – sthzg

+0

Điều đó có vẻ giống như một số giải pháp, cảm ơn! – knowbody

+3

Tôi không nghĩ đó là một giải pháp tốt. Đó là năm 2015, bạn thực sự nên sử dụng API lịch sử. –

Trả lời

23

Chúng tôi đã sử dụng catch-all URLs cho việc này.

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

Bạn cũng có thể đi một dặm thêm và tái sử dụng các hệ thống Flask routing để phù hợp với path để các tuyến đường tương tự như khách hàng, do đó bạn có thể nhúng các khách hàng dữ liệu sẽ cần như JSON bên trong phản ứng HTML.

+1

nếu tất cả các tuyến đường sẽ được hướng dẫn để bắt tất cả các chức năng, làm thế nào bạn sẽ tách các tuyến api phụ trợ và các tuyến đường phản ứng khi tôi thực hiện một cuộc gọi yêu cầu ajax từ giao diện người dùng? –

+4

@shangyeshen Đăng ký các tuyến API trước khi bắt tất cả để chúng được ưu tiên. –

+0

@ DanAbramov cảm ơn sự giúp đỡ của bạn! –