Home > Back-end >  How can I create a Dynamic Route in Flask from an existing View?
How can I create a Dynamic Route in Flask from an existing View?

Time:05-24

I am somewhat stuck trying to figure out how to configure a route in Flask properly. I'll try and give some contextual information first:

My web app allows Users to join Clubs. A user can join 1 or many clubs.

Each Club has a dashboard page, and I am serving that to the user via Blueprint:

Route:

@club_bp.route("/clubdashboard/<int:Club_id>", methods=["GET"])
@login_required
def clubdashboard(Club_id):
    """Logged-in User Club Dashboard."""
    selectedClub=Club.query.get(Club_id)
    
    return render_template(
        "clubdashboard.html",
        title="Club Dashboard",
        current_user=current_user,
        clubname=selectedClub.name,
        members = selectedClub.members
    )

Jinja2 Template Snippet:

          <div  aria-labelledby="navbarDropdown">
            {% for club in current_user.users %}
            <a  href="{{ url_for('club_bp.clubdashboard', Club_id=club.id) }}">{{ club.name }}</a>
            {% endfor %}
          </div>

The currentuser.users property contains a List of id values for clubs the user is a member of (the .users property is crappy naming on my part, it's on my todo list to fix it.)

The Jinja snippet creates a dropdown menu in the navbar to allow the clubdashboard route to serve an individual dashboard per club.

What I am looking to do is within the Club Dashboard view have a link called "Customize" that, in future, can do a bunch of things (not exactly relevant just yet), but first i'd like to just figure out how to serve the page properly.

For any individual club dashboard I get a URL such as:

http://127.0.0.1:5000/clubdashboard/763074009760399361

What i'd like is simply to serve a URL like this:

http://127.0.0.1:5000/clubdashboard/763074009760399361/customize

But I can't seem to figure out how to do it. Any ideas on where to start would be greatly appreciated.

CodePudding user response:

Simply add the route:

@club_bp.route("/clubdashboard/<int:club_id>/customize", methods=["GET"])
@login_required
def club_customize(club_id):
    """Customize whatever is specific to your club"""
    return "TODO: Actually make it work"

And then you can route to it with a simple url_for("club_bp.club_customize", club_id=club.id)

CodePudding user response:

I've managed to get it working how i'd like. Not sure if it's exactly the best way to do it so happy to be corrected still, but here goes:

In my existing Dashboard route, I took the club ID value and stored it in a user session variable:


    @club_bp.route("/clubdashboard/<int:Club_id>", methods=["GET"])
    @login_required
    def clubdashboard(Club_id):
        """Logged-in User Club Dashboard."""
        selectedClub=Club.query.get(Club_id)
        session['selectedclubid'] = selectedClub.id
    
        return render_template(
            "clubdashboard.html",
            title="Club Dashboard",
            current_user=current_user,
            clubname=selectedClub.name,
            members = selectedClub.members
        )

I then pass the session variable into the Club Rules (Customise) route from the Jinja template:

<a  href="{{ url_for('club_bp.rules', Club_id=session['selectedclubid']) }}">Club Rules</a>

Route:

    @club_bp.route("/clubdashboard/<int:Club_id>/rules", methods=["GET"])
    @login_required
    def rules(Club_id):
        """Logged-in User Club Dashboard."""
        selectedClub=Club.query.get(Club_id)
        
        return render_template(
            "clubrules.html",
            title="Club Rules",
            current_user=current_user,
            clubname=selectedClub.name,
            members = selectedClub.members
        )

This route performs a query for the relevant data and displays. I might have been overthinking the issue.

  • Related