文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
应用中的导出功能
所有支持后台导出任务的核心组件现已到位。 剩下的就是将这个功能连接到应用,以便用户发起请求并通过电子邮件发送用户动态给他们。
下面是新的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论