Python / Flask:如何判断用户在页面上花费的时间? (数据录入/时间日志应用)

时间:2017-09-20 02:35:14

标签: python postgresql flask

我已经看到了使用Javascript查看用户在页面上花费多长时间的答案,但我对JS的了解却很少(更不用说将JS集成到我的Python / Flask框架中)。

我的目标是创建一个用户可以输入数据的Web应用程序,同时记录执行任务所花费的时间(持续时间和白天的时间)。

我使用Python,Flask,WTForms和SQLAlchemy来完成大部分功能。从我的views.py文件中,我已经配置了这个:

@app.route('/logpage', methods=['GET', 'POST'])
@login_required
def logpage():
    form = LogForm()

    if form.validate_on_submit():
        entry = LogData(sessionid=form.sessionid.data, user_id=current_user.get_id(), endtime=datetime.utcnow())
        db.session.add(entry)
        db.session.commit()

        return redirect(url_for('home'))

    return render_template('logpage.html', form=form)

当用户点击提交时,会话ID,用户ID和结束时间被记录到PostgreSQL服务器。我尝试在表单验证之前设置pageload = datetime.utcnow(),希望它能存储页面加载的时间,但它似乎与结束时间保存的时间相同。

我试图找出一种方法将当前日期时间写入SQL条目/行并在表单验证时进入同一行,但我不知道如何两次写入同一行。也许用主键和连接它们的东西?我会继续调查这个。

我想要一种方法来保存此页面加载的日期时间,以便将其与表单提交的时间进行比较。有没有一个直接的方法来实现这个没有JavaScript?

1 个答案:

答案 0 :(得分:1)

您可以使用Flask会话来跟踪开始时间。它是在浏览器cookie之上实现的。

http://flask.pocoo.org/docs/0.12/quickstart/#sessions

您需要为应用程序实现密钥(如快速入门示例所示),然后您可以将session对象用作用户特定信息的键值存储。

对于您的特定用例,它可能类似于:

@app.route('/logpage', methods=['GET', 'POST'])
@login_required
def logpage():
    form = LogForm()

    if form.validate_on_submit():
        entry = LogData(sessionid=form.sessionid.data, user_id=current_user.get_id(), 
                        starttime=session.pop('start_time', None), endtime=datetime.utcnow())
        db.session.add(entry)
        db.session.commit()

        return redirect(url_for('home'))

    session['start_time'] = datetime.utcnow()

    return render_template('logpage.html', form=form)
表单验证之前

pageload = datetime.utcnow()没有效果,因为:

  • 此变量将是函数范围的本地变量,并且在函数完成后不会持续存在
  • 即使变量不是函数调用范围的本地变量,也会为GET和POST调用相同的函数,因此当用户发布表单时它将被覆盖

还有一点需要注意的是,您无法信任用户使用Cookie或允许使用JavaScript,因此您应该考虑您的程序如何处理数据库中的空启动时间。