首页 > 解决方案 > 如何最小化我的 Flask webapp 中的路由数量

问题描述

我试图在我的简单服装电子商务网站中尽量减少路线和数据库表的数量。我的网站有四个产品类别:外套、衬衫、裤子、鞋。

每个类别目前在数据库中都有自己的表:

class Coat(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
description = db.Column(db.Text, nullable=True)
price = db.Column(db.Float)
image1 = db.Column(db.String(100), nullable=True, default='default.jpg')
image2 = db.Column(db.String(100), nullable=True)

我想将所有产品组合到一个数据库中,其中“类别”是该产品数据库中的一列。

每个类别目前也有自己的路线和模板:

@app.route('/coats')
def coats():
products = Coat.query.all()
return render_template('coats.html', products=products, title='Coats')

{% extends "base.html" %}
{% block content %}
    {% for product in products %}
        <div class="product">
            <a href="{{ url_for('product_coat', id=product.id) }}">
            <img src="static/images/coats/{{ product.image1 }}" class="image"></a>
            <p class="name">{{ product.name }}</p>
            <p class="price">{{ product.price }}</p>
        </div>
    {% endfor %}
{% endblock %}

当点击产品链接时,会显示一个产品页面,再次为每个类别使用单独的路线:

@app.route('/product_coat/<id>', methods=['GET', 'POST'])
def product_coat(id):
product = Coat.query.get(id)
return render_template('product_coat.html', title='Product', 
    product=product)

目前我在“base.html”中的导航栏看起来像这样:

<nav>
    <a href="{{ url_for('coats') }}"><h3>Coats</h3></a>
    <a href="{{ url_for('shirts') }}"><h3>Shirts</h3></a>
    <a href="{{ url_for('trousers') }}"><h3>Trousers</h3></a>
    <a href="{{ url_for('shoes') }}"><h3>Shoes</h3></a>
</nav>

我意识到这是一个相当大的帖子,所以总结一下,

如果我要将所有四个数据库表合并到一个带有新“类别”列的产品表中,我将如何

  1. 为这些类别创建导航栏链接?
  2. 创建一个处理仅显示所选类别的产品的路线?

谢谢阅读。

标签: pythonsqliteflasksqlalchemy

解决方案


您可以将查询参数传递给新路由,

@app.route('/product/', methods=['GET'])
def product_list(id):
  item = request.args.get('item')
  product = products.all.filter(type=item)
  return render_template(f"{item}.html", title=item,product=product)

然后当您加载页面时,您可以调用url/?item=coat它会过滤数据。

*该产品过滤线可能不正确。


推荐阅读