Skip to content
Advertisement

How to create multiple routes dynamically for same function and pass data which is fetched on the basis of Unique ID to single template in FLASK

I am a newbie to FLASK.

I am creating an e-commerce site in flask and I want to create multiple routes dynamically for same function and pass data which is fetched on the basis of Unique ID to single template in FLASK.

Let me explain it.

I have a table in DB as below:

id category slug
1 cat1 slug1
2 cat2 slug2
3 cat3 slug3
4 cat4 slug4

my python code is:

for (data in db):
    @app.route('/data["slug"]')
    def product_display(data["id"]):
        id = data["id"]
        products = fetch_products(id)
        return render_template('products.html', products=products)

Please let me know if this code will work or not. If no then what should be the logic?

Thanks in advance.

Advertisement

Answer

I think your asking for how to use variables in routes?

@app.route('/<slug>')
def product_display(slug):
    category = Category.query.filter_by(slug=slug).first_or_404()
    products = Product.query.filter_by(category_id=category.id).all()
    return render_template('products.html', category=category, products=products

Read up more on route variables in the docs

Generating links to all categories

You comment mentions ‘ that variable should be coming from for loop of data fetched from DB’ the best way I can parse that you want, say, a listing of all current categories (like a navigation bar in an online shop)

You might add a second route:

@app.route('/all-categories')
def all_categories():
    categories = Category.query.all()
    return render_template('all_categories.html', categories=categories)

Then in your all_categories.html you would ‘build’ the urls to the first route:

<ul>
{% for category in categories %}
    <li><a href="{{ url_for('product_display', slug=category.slug) }}">{{ category.slug }} (or title...)</li>
{% endfor %}
</ul>

So both routes work together to get that ‘looped data’ from the database

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement