Learn how to use Dash Bio for next-gen sequencing & quality control. 🧬Register for the Oct 27 webinar.

Internal Server Error Dash app serving a Flask Server: A name collision occurred between blueprints

I’m working with a Dash App inside a Flask Server.

This is how I instantiate the Flask Server:

from flask import Flask, redirect
server = Flask(__name__, template_folder="../frontend/templates",
               instance_relative_config=True)

This is the create_dash_app function:

import dash
def create_dash_app(server):

    dash_app = dash.Dash(
    __name__,
    server=server,
    url_base_pathname='/dash/',
    external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']
    )

    dash_app.config['suppress_callback_exceptions'] = True

    dash_app.layout = html.H3("Lorem ipsum... ")
    
    return dash_app.server

At one of my server routes I have the following:

@server.route('/filter')
def filter_stuff():
    
    <some code>
   
    create_dash_app()
    redirect("/dash")

The point is that for my use case a user may want to see the dash app, go back to the filter route, apply some filters and check the changings in the dash app.
Unfortunately, when I do that I get the following:

> AssertionError: A name collision occurred between blueprints
> <flask.blueprints.Blueprint object at 0x11905bcd0> and
> <flask.blueprints.Blueprint object at 0x118acbad0>. Both share the
> same name "_dash_dash_assets". Blueprints that are created on the fly
> need unique names.

Given my little experience with Flask and Dash I guess it’s something trivial that I’m missing. Please tell me if there is additional info you may need.

EDIT: I’ve found a workaround which I’m ashamed of:

from flask import Flask, redirect
from multiprocessing import Value
counter = Value('i', 0)

server = Flask(__name__, template_folder="../frontend/templates",
               instance_relative_config=True)


@server.route('/filter')
def filter_stuff():
    with counter.get_lock():
        counter.value += 1
        out = counter.value
    <some code>
   
    dash_address = "/dash"+str(out)+"/"
    create_dash_app(server, dash_address)
    
    redirect(dash_address)


import dash
def create_dash_app(server, dash_address):

    dash_app = dash.Dash(
    __name__,
    server=server,
    url_base_pathname=dash_address,
    external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']
    )

    dash_app.config['suppress_callback_exceptions'] = True

    dash_app.layout = html.H3("Lorem ipsum... ")
    
    return dash_app.server

As you can see I’m using a counter to redirect to a new page each time. I wonder if some people might die reading this.

Thank you