Search code examples
pythonnode.jsreactjsflaskproduction-environment

Serve React production App (local server) through Flask-Python


I'm producing an application with these two technologies: React-app & Flask-Python. Its intended to run a react client to represent data received from Flask-server. The flask server and react client are on the same machine and communicate trough sockets (SocketIO).

In Dev mode, in order to run the application, I have to run the react server with npm start (node) and the flask server with python.

In production mode, after the react server is built, I have to serve the build folder with the serve option available on Node. Otherwise the app will not work properly (I think its because I use react-router, and when I go to another place of my react app, the browser cannot find the URL's specified. When serving the build folder with serve option of Node, no problem shows up).

So, my question is: Can I serve the build folder of my react application with flask instead of serve option of node? I want to do this, in order to eliminate the Node.js dependency so if I want to run my application on another machine, I will not have to install node.


Solution

  • Yes it's possible to do it in flask with static folder/files. You need to create a folder which is called static in your project. Imagine this folder structure:

    ├── server/
    └── static/
        ├── css/
        ├── dist/
        ├── images/
        └── js/
            index.html
    

    For your react app the only thing you need do is to build npm run build.

    In flask you should set this static folder in order to be used. You need in a simplified version this:

    # server.py
    from flask import Flask, render_template
    
    app = Flask(__name__, static_folder="../static/dist", template_folder="../static")
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    @app.route("/hello")
    def hello():
        return "Hello World!”
    
    if __name__ == "__main__":
        app.run()
    

    So the root path / will show react. The /hello path will show the response from flask.