返回介绍

应用中的导出功能

发布于 2025-01-02 21:54:01 字数 1958 浏览 0 评论 0 收藏 0

所有支持后台导出任务的核心组件现已到位。 剩下的就是将这个功能连接到应用,以便用户发起请求并通过电子邮件发送用户动态给他们。

下面是新的 export_posts 视图函数:

app/main/routes.py :导出用户动态路由和视图函数。

@bp.route('/export_posts')
@login_required
def export_posts():
    if current_user.get_task_in_progress('export_posts'):
        flash(_('An export task is currently in progress'))
    else:
        current_user.launch_task('export_posts', _('Exporting posts...'))
        db.session.commit()
    return redirect(url_for('main.user', username=current_user.username))

该函数首先检查用户是否有未完成的导出任务,并在这种情况下只是闪现消息。 对同一用户同时执行两个导出任务是没有意义的,可以避免。 我可以使用前面实现的 get_task_in_progress() 方法来检查这种情况。

如果用户没有正在运行的导出任务,则调用 launch_task() 来启动它。 第一个参数是将传递给 RQ worker 的函数的名称,前缀为 app.tasks. 。 第二个参数只是一个友好的文本描述,将会显示给用户。 这两个值都会被写入数据库中的 Task 对象。 该函数以重定向到用户个人主页结束。

现在我需要暴露该路由的链接,以便用户可以请求导出。 我认为最合适的地方是在用户个人主页,只有在用户查看他们自己的主页时,链接在“编辑个人资料”链接下面显示:

app/templates/user.html :用户个人主页的导出链接。

                ...
                <p>
                    <a href="{{ url_for('main.edit_profile') }}">
                        {{ _('Edit your profile') }}
                    </a>
                </p>
                {% if not current_user.get_task_in_progress('export_posts') %}
                <p>
                    <a href="{{ url_for('main.export_posts') }}">
                        {{ _('Export your posts') }}
                    </a>
                </p>
                ...
                {% endif %}

此链接的渲染是有条件的,因为我不希望它在用户已经有导出任务执行时出现。

此时的后台作业是可以运作的,但是不会向用户提供任何反馈。 如果你想尝试一下,你可以按如下方式启动应用和 RQ worker:

  • 确保 Redis 正在运行
  • 打开一个终端窗口,启动至少一个 RQ worker 实例。本处你可以运行命令 rq worker microblog-tasks
  • 再打开另一个终端窗口,使用 flask run (记得先设置 FLASK_APP 变量) 命令启动 Flask 应用

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文