Flask 实战 - 编写业务逻辑

优质
小牛编辑
127浏览
2023-12-01

我们的业务逻辑代码主要在 controllers 目录中,新建一个 todo.py 文件, 核心代码如下 (完整代码参考这里),代码说明可以参考注释:

  1. # -*- coding: utf-8 -*-
  2. import flask
  3. from flask import request, redirect, flash, render_template, url_for
  4. from application.extensions import db
  5. from application.models import Todo
  6. todo_bp = flask.Blueprint(
  7. 'todo',
  8. __name__,
  9. template_folder='../templates'
  10. )
  11. # 主页
  12. @todo_bp.route('/', methods=['GET', 'POST'])
  13. def index():
  14. todo = Todo.query.order_by('-id')
  15. _form = request.form
  16. if request.method == 'POST':
  17. # 添加任务
  18. title = _form["title"]
  19. td = Todo(title=title)
  20. try:
  21. td.store_to_db() # 将数据保存到数据库
  22. flash("add task successfully!")
  23. return redirect(url_for('todo.index'))
  24. except Exception as e:
  25. print e
  26. flash("fail to add task!")
  27. return render_template('index.html', todo=todo)
  28. # 删除任务
  29. @todo_bp.route('/<int:todo_id>/del')
  30. def del_todo(todo_id):
  31. todo = Todo.query.filter_by(id=todo_id).first()
  32. if todo:
  33. todo.delete_todo()
  34. flash("delete task successfully")
  35. return redirect(url_for('todo.index'))
  36. # 编辑 (更新) 任务
  37. @todo_bp.route('/<int:todo_id>/edit', methods=['GET', 'POST'])
  38. def edit(todo_id):
  39. todo = Todo.query.filter_by(id=todo_id).first()
  40. if request.method == 'POST':
  41. Todo.query.filter_by(
  42. id=todo_id
  43. ).update({
  44. Todo.title: request.form['title']
  45. })
  46. db.session.commit()
  47. flash("update successfully!")
  48. return redirect(url_for('todo.index'))
  49. return render_template('edit.html', todo=todo)
  50. # 标记任务完成
  51. @todo_bp.route('/<int:todo_id>/done')
  52. def done(todo_id):
  53. todo = Todo.query.filter_by(id=todo_id).first()
  54. if todo:
  55. Todo.query.filter_by(id=todo_id).update({Todo.status: True})
  56. db.session.commit()
  57. flash("task is completed!")
  58. return redirect(url_for('todo.index'))
  59. # 重置任务
  60. @todo_bp.route('/<int:todo_id>/redo')
  61. def redo(todo_id):
  62. todo = Todo.query.filter_by(id=todo_id).first()
  63. if todo:
  64. Todo.query.filter_by(id=todo_id).update({Todo.status: False})
  65. flash("redo successfully!")
  66. db.session.commit()
  67. return redirect(url_for('todo.index'))
  68. # 404 处理
  69. @todo_bp.errorhandler(404)
  70. def page_not_found():
  71. return render_template('404.html'), 404

上面只是核心的业务逻辑,关于模板渲染,数据模型的定义等可以参考完整代码

由于该项目的业务逻辑比较简单,因此也就不做过多介绍,相信读者可以轻松看懂代码,如果有问题,也可以在 github 上面提 issue,欢迎指正。