【问题标题】:Display more posts on same page with Flask?使用 Flask 在同一页面上显示更多帖子?
【发布时间】:2014-11-09 18:11:41
【问题描述】:

我正在用 python 和烧瓶构建图像上传器。我已经在我的 VPS 上启动并运行了

http://107.170.119.38/ 

应用程序可以正常显示前 25 张图像,但第 25 张图像之后的任何内容都不会显示在任何地方。我正在尝试添加一个按钮,让我可以显示接下来的 25 张图像。这是我的代码示例

@app.route('/', methods=['GET', 'POST'])
def get_more_pics():
    g.db = connect_db()
    cur = g.db.execute('select filename, label from pics order by id desc limit 25')
    more_pics = [dict("filename": row[0], "label": row[1]) for row in cur.fetchall()]
    g.db.close()
    return render_template('upload.html', more_pics=more_pics)

def upload_pic():
if request.method == 'POST':
    file = request.files['file']
    label = request.form['label']
    try:
        extension = file.filename.rsplit('.', 1)[1].lower()
    except IndexError, e:
        abort(404)
    if file and check_extension(extension):
        # Salt and hash the file contents
        filename = md5(file.read() + str(round(time.time() * 1000))).hexdigest() + '.' + extension
        file.seek(0)  # Move cursor back to beginning so we can write to disk
        file.save(os.path.join(app.config['UPLOAD_DIR'], filename))
        add_pic(filename, label)
        gen_thumbnail(filename)
        return redirect(url_for('show_pic', filename=filename))
    else:
        # Bad file extension
        abort(404)
else:
    return render_template('upload.html', pics=get_last_pics())


@app.route('/show')
def show_pic():
    filename = request.args.get('filename', '')
    t = (filename,)
    cur = g.db.execute('select label from pics where filename=?', t)
    label = cur.fetchone()[0]
    return render_template('upload.html', filename=filename, label=label)

# Return a list of the last 25 uploaded images
def get_last_pics():
    try:
        cur = g.db.execute('select filename, label from pics order by id desc limit 25')
        filenames = []
        for row in cur.fetchall():
            filenames.append({"filename": row[0], "label": row[1] or ''})
        return filenames
    except:
        return []

在jinja2模板文件中:

<input type="button" value="Get More Pics" onclick="{{ more_pics }}">
    <ul>
        {% for pic in more_pics %}
        <li class="thumb">
        <a href="{{ url_for('show_pic', filename=pic.filename) }}"><img class="thumb" src="{{ pic_path('thumb2_'+pic.filename) }}"></a></li>
        {% endfor %}
    </ul>

总而言之,我不知道如何让 get_more_pics() 函数显示接下来的 25 张图像。任何帮助将不胜感激

【问题讨论】:

  • 您在查询中包含limit 25。这将始终将您限制在前 25 个结果中。

标签: python sqlite flask jinja2


【解决方案1】:

您需要在 SQL 中添加 offset 参数:

select filename, label from pics order by id desc limit 25 offset 0

您必须将它传递到您的 SQL 中,因为第一页将是 0,然后是 25,然后是 50,等等。最好将 25 分解为参数而不是硬编码它,并且将偏移量计算为页面和限制的乘积。

另外,请记住 LIMIT 和 OFFSET 不一定适用于所有数据库,尽管它们确实适用于 SQLite 和 MySQL,但语法可能会有所不同。例如。甲骨文:http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php

另一种方法是使用更高级别的方法,例如 ORM。

【讨论】:

  • 谢谢。当我在命令提示符下运行它时有效,但我似乎无法让它在我的模板中显示结果。啊!!
  • 如果这可行,那么您可能在其他地方遇到了问题。也许接受这个答案并问你的下一个问题,如果它是一个公共项目,可能会发布一个源代码链接?
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2014-02-18
相关资源
最近更新 更多