flask网站制作后台时候常见流程总结

安利一个神神器:

百度脑图PC版

创建数据库

下面是创建User数据库,需要导入db

  1. #coding:utf8
  2. from flask import Flask
  3. from datetime import datetime
  4. from app import db
  5. #会员数据模型
  6. class User(db.Model):
  7. __tablename__ = "user"
  8. __table_args__ = {"useexisting": True}
  9. id = db.Column(db.Integer,primary_key=True)#编号
  10. name = db.Column(db.String(100),unique=True)#昵称
  11. pwd = db.Column(db.String(100))#密码
  12. email = db.Column(db.String(100),unique=True)#邮箱
  13. phone = db.Column(db.String(11),unique=True)#手机号
  14. info = db.Column(db.Text)#个性简介
  15. face = db.Column(db.String(255),unique=True)#头像
  16. addtime = db.Column(db.DateTime,index=True,default=datetime.utcnow)#注册时间
  17. uuid = db.Column(db.String(255),unique=True)#唯一标识符
  18. #(设置外键的第二步)
  19. userlogs = db.relationship('Userlog',backref = 'user')#会员日志外键关系关联
  20. comments = db.relationship('Comment', backref='user') # 评论外键关系关联
  21. moviecols = db.relationship('Moviecol', backref='user') # 收藏外键关系关联
  22. def __repr__(self):
  23. return '<User %r>' % self.name

然后在入口里面写入

创建表:

  1. if __name__ == "__main__":
  2. db.create_all()

创建数据库完成

添加数据示例:

  1. if __name__ == "__main__":
  2. role = Role(
  3. name="超级管理员",
  4. auths="2323"
  5. )
  6. db.session.add(role)
  7. db.session.commit()

在代码中删除数据示例:

  1. @admin.route('/tag/del/<int:id>',methods=["GET"])
  2. @admin_login_req
  3. def tag_del(id=None):
  4. tag = Tag.query.filter_by(id=id).first_or_404()
  5. db.session.delete(tag);
  6. db.session.commit()
  7. flash("删除标签成功!","ok")
  8. return redirect(url_for('admin.tag_list',page=1))

有时候会出现创建不成功,或者已经创建成功还是报错,查看User结构里面的语句,或者百度直接搜索关键字。

  1. __table_args__ = {"useexisting": True}

操作验证

装饰器验证

在代码里面需要各种操作。比如每次操作都要判断admin是否已经登录,每个函数前面要添加装饰器。

装饰器写法:

  1. def admin_login_req(f):
  2. @wraps(f)
  3. def decorated_function(*args,**kwargs):
  4. if "admin" not in session :
  5. return redirect(url_for("admin.login",next=request.url))
  6. return f(*args,**kwargs)
  7. return decorated_function

代码示例:

  1. @admin.route("/")
  2. @admin_login_req
  3. def index():
  4. return render_template('admin/index.html')

表格验证

html模板里面的每一个form创建一个对应的验证类.如添加标签:

  1. class TagForm(FlaskForm):
  2. tagname = StringField(
  3. label='名称',
  4. validators=[ # 验证器
  5. DataRequired("请输入标签")
  6. ],
  7. description="标签",
  8. render_kw={
  9. "class ": "form-control",
  10. "placeholder": "请输入标签名称!",
  11. "id":"input_name",
  12. # "required": "required"
  13. }
  14. )
  15. submit = SubmitField(
  16. "编辑",
  17. render_kw={
  18. "class ": "btn btn-primary"
  19. }
  20. )

读取数据操作数据

此时在视图views.py中进行判断:

  1. @admin.route('/tag/edit/<int:id>/',methods=["POST","GET"])
  2. @admin_login_req
  3. def tag_edit(id=None):
  4. form = TagForm()
  5. #从数据库中查询标签id,返回标签数据
  6. tag = Tag.query.get_or_404(id)
  7. #表单提交的话,执行
  8. if form.validate_on_submit():
  9. data = form.data #读取表单数据
  10. tag_count = Tag.query.filter_by(name=data['tagname']).count()#查看标签数量
  11. if tag.name == data["tagname"] and tag_count == 1:
  12. flash("名称已经存在!",'err')
  13. return redirect(url_for('admin.tag_edit',id=id))
  14. tag.name = data['tagname']
  15. db.session.add(tag)#添加表单数据
  16. db.session.commit()
  17. flash("添加标签成功!",'ok')
  18. redirect(url_for('admin.tag_edit',id=id))
  19. return render_template('admin/tag_edit.html',form=form,tag=tag)

html中的模板

  1. {% extends 'admin/admin.html' %}
  2. {% block content %}
  3. <!--内容-->
  4. <section class="content-header">
  5. <h1>微电影管理系统</h1>
  6. <ol class="breadcrumb">
  7. <li><a href="#"><i class="fa fa-dashboard"></i> 标签管理</a></li>
  8. <li class="active">修改标签</li>
  9. </ol>
  10. </section>
  11. <section class="content" id="showcontent">
  12. <div class="row">
  13. <div class="col-md-12">
  14. <div class="box box-primary">
  15. <div class="box-header with-border">
  16. <h3 class="box-title">修改标签</h3>
  17. </div>
  18. <form role="form" METHOD="POST" action="{{url_for('admin.tag_edit',id=tag.id)}}">
  19. <div class="box-body">
  20. {% for msg in get_flashed_messages(category_filter=['err'])%}
  21. <div class="alert alert-danger alert-dismissible">
  22. <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
  23. <h4><i class="icon fa fa-ban"></i> 操作失败</h4>
  24. {{msg}}
  25. </div>
  26. {% endfor %}
  27. {% for msg in get_flashed_messages(category_filter=['ok'])%}
  28. <div class="alert alert-success alert-dismissible">
  29. <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
  30. <h4><i class="icon fa fa-check"></i> 操作成功</h4>
  31. {{msg}}
  32. </div>
  33. {% endfor %}
  34. <div class="form-group">
  35. {{form.tagname(value=tag.name)}}
  36. <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
  37. <input name="id" value="{{tag.id}}" type="hidden">
  38. {% for err in form.tagname.errors%}
  39. <div class="col-md-12" style="color:#ff0000">{{err}}</div>
  40. {%endfor%}
  41. </div>
  42. </div>
  43. <div class="box-footer">
  44. {{form.submit}}
  45. {{form.csrf_token}}
  46. </div>
  47. </form>
  48. </div>
  49. </div>
  50. </div>
  51. </section>
  52. <!--内容-->
  53. {% endblock %}
  54. {% block js %}
  55. <script>
  56. $(document).ready(function () {
  57. $('#id-2-1').addClass('active');
  58. $('#id-2-2').addClass('active');
  59. })
  60. </script>
  61. {% endblock %}

简化一下就是:

  1. {% extends 'admin/admin.html' %}
  2. {% block content %}
  3. <form role="form" METHOD="POST" action="{{url_for('admin.tag_edit',id=tag.id)}}">
  4. <div class="box-body">
  5. {% for msg in get_flashed_messages(category_filter=['err'])%}
  6. <h4><i class="icon fa fa-ban"></i> 操作失败</h4>
  7. {{msg}}
  8. </div>
  9. {% endfor %}
  10. {% for msg in get_flashed_messages(category_filter=['ok'])%}
  11. <h4><i class="icon fa fa-check"></i> 操作成功</h4>
  12. {{msg}}
  13. </div>
  14. {% endfor %}
  15. <div class="form-group">
  16. {{form.tagname(value=tag.name)}}
  17. <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
  18. <input name="id" value="{{tag.id}}" type="hidden">
  19. {% for err in form.tagname.errors%}
  20. <div class="col-md-12" style="color:#ff0000">{{err}}</div>
  21. {%endfor%}
  22. </div>
  23. </div>
  24. <div class="box-footer">
  25. {{form.submit}}
  26. {{form.csrf_token}}
  27. </div>
  28. </form>
  29. {% endblock %}
  30. {% block js %}
  31. <script>
  32. </script>
  33. {% endblock %}

其中form对应TagForm里面的内容

Flask项目实战:创建电影网站(2)的更多相关文章

  1. KNN算法项目实战——改进约会网站的配对效果

    KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...

  2. Flask项目实战:创建电影网站-创世纪(1)

    以后要养成写博客的习惯,用来做笔记.本人看的东西很多很杂,但因为工作中很少涉及,造成看了之后就忘,或者看了就看了,但是没有融入的自己的知识体系里面. 写博客一方面是做记录,一方面是给这段时间业余学习的 ...

  3. Python框架 Flask 项目实战教程

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...

  4. FastAPI小项目实战:电影列表(Vue3 + FastAPI)

    假期过半, FastAPI + Vue3项目实战 视频也算录完了,尽管项目简单(2张表 共7个接口 4个页面) 起因 在6月底的时候开始录制了FastAPI官方文档中的新手教程部分(实际还没有官网文档 ...

  5. Flask项目实战:创建电影网站(3)后台的增删改查

    添加预告 根据需求数据库创建表格 需求数据库,关键字title logo # 上映预告 class Preview(db.Model): __tablename__ = "preview&q ...

  6. flask项目实战--论坛

    项目结构搭建 1:用pycharm创建flask bbs项目 2:分别创建config.py.exts.py.models.py.manage.py文件 创建一个apps包存放前台,后台,公共的模块 ...

  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-3.微信网站扫码支付介绍

    笔记 3.微信网站扫码支付介绍     简介:讲解微信网页扫码支付         1.扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php ...

  8. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总

    2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...

  9. Flask项目之手机端租房网站的实战开发(三)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

随机推荐

  1. Rocket - interrupts - NullIntSource

    https://mp.weixin.qq.com/s/Fn3u2OSLAzPDrlZTiLfikg 简单介绍NullIntSource的实现. 1. 简单介绍 NullIntSource实现一个不会发 ...

  2. Rocket - diplomacy - enumerateBits

    https://mp.weixin.qq.com/s/KsZqe9W_DM6W6JecK_irvA   介绍AddressSet.enumerateBits方法的实现,主要是x & (-x)的 ...

  3. Chisel3 - util - RRArbiter

    https://mp.weixin.qq.com/s/GcNIFkHfa0gW0HKkKvHZEQ     循环优先级(Round Robin)仲裁器.   参考链接: https://github. ...

  4. ASP.NET实现一个在线音乐统计网站(歌手,音乐,角色……增删改查)

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的完结部分(前面由于没有时间整理了,直接发一个大完结吧) 第一部分 第二部分 源码已上传GitHub:这里有 ...

  5. Java实现 LeetCode 821 字符的最短距离(暴力)

    821. 字符的最短距离 给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleet ...

  6. Java 蓝桥杯 算法训练(VIP) 最大体积

    最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...

  7. Java实现 LeetCode 479 最大回文数乘积

    479. 最大回文数乘积 你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x ...

  8. Java实现算法竞赛入门经典例题-蚂蚁

    问题描述 一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒. 当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计). 给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂 ...

  9. WinUI 3试玩报告

    1. 什么是 WinUI 3 在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI.Wi ...

  10. FTP 常用命令

    1. 准备 1.1 ftp 信息: ftp 服务器地址:192.168.168.10 用户名:will 密码:123 1.2 ftp 工具 使用 Windows 命令行: “开始” 按钮-> 搜 ...