I have a flask back-end with API routes which are accessed by a React single page application, created using the create-react-app boilerplate. When using the create-react-app built-in dev server, my Flask back end works, no problem with that.
Now, I would like to serve the built (using npm run build
) static react app from my Flask server. Building the react app leads to the following directory structure:
- build
- static
- css
- style.[crypto].css
- style.[crypto].css.map
- js
- main.[crypto].js
- main.[crypto].js.map
- index.html
- service-worker.js
- [more meta files]
By [crypto], I mean the randomly generated strings generated at build time.
Having recieved the index.html
file, the browser then makes the following requests:
- GET /static/css/main.[crypto].css
- GET /static/css/main.[crypto].css
- GET /service-worker.js
My question is then: how should I go about serving these files ? I came up with this:
from flask import Blueprint, send_from_directory
static = Blueprint('static', __name__)
@static.route('/')
def serve_static_index():
return send_from_directory('../client/build/', 'index.html')
@static.route('/static/<path:path>') # serve whatever the client requested in the static folder
def serve_static(path):
return send_from_directory('../client/build/static/', path)
@static.route('/service-worker.js')
def serve_worker():
return send_from_directory('../client/build/', 'service-worker.js')
This way, the static assets are successfully served. But it is not a very elegant solution.
On the other hand, I could incorporate this with the built-in flask static utilities. But I do not understand how to configure this.
I really do not know how to handle this, to the point that it's making me reconsider my use of create-react-app, as it is forcing me to structure my static folder in a very specific an inconvenient way: There is no way for me to change how the app requests static content from the server.
Overall: Is my solution robust enough ? Is there a way to use built in flask features to serve these assets ? Is there a better way to use create-react-app ? Any input is appreciated. I can provide more information if needed.
Thanks for reading !