我正在玩Flask以更好地理解它。我有一个简单的应用程序查询大型数据库并返回一个随机元素。以下代码无效,但我确切知道它失败的地方。当random.randint()获取列表中的随机元素时,它失败了。但是我的日志中没有显示错误,这是什么原因?如果我使用硬编码值而不是随机int,它可以工作。我用curl来测试它。我剪断了数据库代码,因为它似乎是正确的。
from flask import Flask, render_template, request
import sqlite3
import random
app = Flask(__name__)
def show_home_page():
return render_template("home.html")
def get_random_element():
# <snipped>: Do some sql queries and populate a list called P_LIST
r = random.randint(0, len(P_LIST)) # This line silently fails.
r_e = P_LIST[r] # Never seems to get here
print "get_random_element", r_e # Never prints this line!!
return r_e
@app.route('/')
def server():
return show_home_page()
@app.route('/element', methods=['POST', 'GET'])
def random():
if request.method == 'GET':
p = request.args.get('q', '')
print "Request:", p
if p == 'random' or p == '':
p = get_random_element()
print "Random element:", p
else:
print "Else:", p
return render_template('random.html', element=p)
return show_home_page()
if __name__ == '__main__':
app.run()
答案 0 :(得分:1)
您已通过定义名为random
的函数重新定义random()
。
@app.route('/element', methods=['POST', 'GET'])
def random():
...
这会影响导入的模块,导致您看到的问题。当您import random
再次get_random_element()
时,您的代码可以访问模块 random
而不是本地函数random()
。
通过重命名该函数来修复此问题,也许将其称为element()
,因为这是路径名称。
答案 1 :(得分:0)
这是我不明白的事情,但这里正在发生的事情。我需要在random()函数中随机导入。否则全局“导入随机”声明似乎不够。不知道为什么。因此在random()中添加一个导入行使其工作。 如果有人能够解释这一点,我将不胜感激。
编辑:现在我明白发生了什么。函数名称random()导致某种冲突。如果我将它改为rand(),现在只需一次全局导入就可以正常工作。