Web2py:来自 layout.html 的数据库查询
Web2py: Database queries from within layout.html
我有兴趣在我的应用程序的每个页面上显示最近搜索的术语(存储在数据库中)。乍一看,layout.html 似乎是这个函数的最佳位置。我需要 运行 数据库查询,它们看起来像这样:
{{import pymongo}}
{{db = pymongo.MongoClient()}}
{{result = db.collection.distinct("search_term")}}
{{etc...}}
我不确定这是不是最明智的想法。在安全方面,我是否应该关注从视图中 运行ning 数据库查询?还有其他选择吗?
不存在安全问题,因为视图是在服务器上执行的。然而,更好的做法是将该代码移动到模型文件,然后简单地在布局中显示结果(模型文件中定义的任何对象都将在视图的执行环境中可用)。
在模型文件中:
import pymongo
db = pymongo.MongoClient()
result = db.collection.distinct("search_term")
然后在layout.html:
{{for record in result:}}
[code to display record]
{{pass}}
另一种选择是将代码移动到模块中并简单地在布局中导入和调用函数(想法是将视图限制为仅显示与显示相关的代码,特别是因为它有点难以阅读并在视图中调试 Python 代码)。
我有兴趣在我的应用程序的每个页面上显示最近搜索的术语(存储在数据库中)。乍一看,layout.html 似乎是这个函数的最佳位置。我需要 运行 数据库查询,它们看起来像这样:
{{import pymongo}}
{{db = pymongo.MongoClient()}}
{{result = db.collection.distinct("search_term")}}
{{etc...}}
我不确定这是不是最明智的想法。在安全方面,我是否应该关注从视图中 运行ning 数据库查询?还有其他选择吗?
不存在安全问题,因为视图是在服务器上执行的。然而,更好的做法是将该代码移动到模型文件,然后简单地在布局中显示结果(模型文件中定义的任何对象都将在视图的执行环境中可用)。
在模型文件中:
import pymongo
db = pymongo.MongoClient()
result = db.collection.distinct("search_term")
然后在layout.html:
{{for record in result:}}
[code to display record]
{{pass}}
另一种选择是将代码移动到模块中并简单地在布局中导入和调用函数(想法是将视图限制为仅显示与显示相关的代码,特别是因为它有点难以阅读并在视图中调试 Python 代码)。