python - 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'])
,
/brands
route 有一个名为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)
解决方案
products
id 下定义,productbrand
但您也尝试使用它product
。移动products
到全局范围将解决它。
推荐阅读
- vba - PowerPoint VBA - 基于水平轴数据标签的图表颜色
- reactiveui - ReactiveUI WhenActivated 在 Android 上抛出 ObjectDisposedException
- python - 用另一列中的值替换熊猫列值
- python - 连接到 Firestore 上的辅助数据库
- python - Can't record screen using mss and cv2
- javascript - Angular 2/4/5 (Not AngularJS) :- how can I take .offset().top of an element?
- xml - 使用 shell 脚本更新同一 xml 文件中的文本
- twitter-bootstrap - css3:制作标题导航菜单
- angular - Angular 6 对 .NET Web API 的跨域 POST 请求返回 401(未经授权)
- firebase - 在创建云函数以响应特定节点上的 onDisconnect 事件时需要帮助 - Firebase