首页 > 解决方案 > Flask 在多个路由 NameError 中使用虚拟数据:未定义名称“产品”

问题描述

在我的第一个 Flask 应用程序上工作,一个电子商务网站,我正在学习使用虚拟数据。我有一个品牌页面(显示多个品牌)、一个单独的品牌页面(品牌的所有产品)和一个显示 1 个产品的产品页面,该页面呈现来自数组的数据。

我下面的代码有 3 条路线 -

@app.route('/brands', methods=['GET','POST']),

@app.route('/brands/<string:product_brand>', methods=['GET','POST']),

@app.route('/brands/Brand1/<int:product_id>', methods=['GET','POST'])

我在路线中有虚拟数据 -

@app.route('/brands', methods=['GET','POST']),

@app.route('/brands/<string:product_brand>', methods=['GET','POST']),


/brandsroute 有一个名为brands 的数组,它可以正常工作并且可以在以HTML 渲染时提取数据 -

{% for brand in brandnames %}
{{ brand.name }} 

这将为Brand1第一个循环呈现


/brands/<string:product_brand>/有一个名为 products 的数组,路线使用变量 product_brand。如果变量不是品牌数组的一部分(在第一条路线中),则会引发 404 错误。否则,根据 product_brand 的值显示即将推出的页面或品牌页面。这工作正常,可以在 html 中呈现 -

{% for product in products %}
{{ product.name }}

这将为example text第一个循环呈现

我什至可以通过将 href 设置为 - 来设置链接以转到第三条路线

{{ url_for('product', product_id = product.product_id ) }}

这呈现为/brands/Brand1/1正确的链接端点,并应显示 id 为 1 的产品的产品页面。


但是,当我尝试设置第三条路线时,我已经完成了第二条和第一条路线;我似乎无法从上一条路线的数组(品牌和产品数组)中读取数据。我不知道我是如何设法将数据从品牌数组传递到第二条路线(if product_brand not in brands)但不能做(if product_id not in products

每当我单击指向的链接或手动转到 URL(例如/brands/Brand1/1)时,我都会收到NameError: name 'products' is not defined错误消息。

我的部分路线代码如下:

@app.route('/brands', methods=['GET','POST'])
def brands():
    brands = [
        {
            'name': 'Brand1',
            'image': 'B1.jpg'
        },
        {
            'name': 'Brand2',
            'image': 'B2.jpg'
        },
        {
            'name': 'Brand3',
            'image': 'B3.jpg'
        }
        {
            'name': 'Sale',
            'image': 'S1.jpg'
        }
    ]
    
    return render_template('brands.html', title='Brands', brandnames=brands)

@app.route('/brands/<string:product_brand>', methods=['GET','POST'])
def productbrand(product_brand):
    
    products = [
        {
            'brand': 'Brand1',
            'name': 'example text',
            'thumbname': 'e.g.text',
            'cart_thumb': 'small.jpg',
            'product_id': '1',
            'price': '100',
            'sale':'Yes',
            'product_large_1': 'L1.jpg',
            'product_large_2': 'L2.jpg',
            'product_large_3': 'L3.jpg',
            'product_thumb_1': 'T1.jpg',
            'product_thumb_2': 'T2.jpg',
            'product_thumb_3': 'T3.jpg'
        },
        {
            'brand': 'Brand2',
            'name': 'example text',
            'thumbname': 'e.g.text',
            'cart_thumb': 'small.jpg',
            'product_id': '2',
            'price': '200',
            'sale':'Yes',
            'product_large_1': 'L1.jpg',
            'product_large_2': 'L2.jpg',
            'product_large_3': 'L3.jpg',
            'product_thumb_1': 'T1.jpg',
            'product_thumb_2': 'T2.jpg',
            'product_thumb_3': 'T3.jpg'
        },
        {
            'brand': 'Brand1',
            'name': 'example text',
            'thumbname': 'e.g.text',
            'cart_thumb': 'small.jpg',
            'product_id': '3',
            'price': '100',
            'sale':'No',
            'product_large_1': 'L1.jpg',
            'product_large_2': 'L2.jpg',
            'product_large_3': 'L3.jpg',
            'product_thumb_1': 'T1.jpg',
            'product_thumb_2': 'T2.jpg',
            'product_thumb_3': 'T3.jpg'
        }
    ]

    if product_brand not in brands():
        abort(404)
    elif product_brand not in ['Brand1', 'Sale']:
        return render_template('comingsoon.html', product_brand=product_brand)
    else:
        return render_template('brandpage.html', product_brand=product_brand, products=products)
   



@app.route('/brands/Brand1/<int:product_id>', methods=['GET','POST'])
def product(product_id):
    
    return render_template('product.html', title='Product', products=products, product_id=product_id)

标签: pythonflaskjinja2

解决方案


productsid 下定义,productbrand但您也尝试使用它product。移动products到全局范围将解决它。


推荐阅读