Flask项目实战:创建电影网站(2)
flask网站制作后台时候常见流程总结
安利一个神神器:
创建数据库
下面是创建User数据库,需要导入
db
库
#coding:utf8
from flask import Flask
from datetime import datetime
from app import db
#会员数据模型
class User(db.Model):
__tablename__ = "user"
__table_args__ = {"useexisting": True}
id = db.Column(db.Integer,primary_key=True)#编号
name = db.Column(db.String(100),unique=True)#昵称
pwd = db.Column(db.String(100))#密码
email = db.Column(db.String(100),unique=True)#邮箱
phone = db.Column(db.String(11),unique=True)#手机号
info = db.Column(db.Text)#个性简介
face = db.Column(db.String(255),unique=True)#头像
addtime = db.Column(db.DateTime,index=True,default=datetime.utcnow)#注册时间
uuid = db.Column(db.String(255),unique=True)#唯一标识符
#(设置外键的第二步)
userlogs = db.relationship('Userlog',backref = 'user')#会员日志外键关系关联
comments = db.relationship('Comment', backref='user') # 评论外键关系关联
moviecols = db.relationship('Moviecol', backref='user') # 收藏外键关系关联
def __repr__(self):
return '<User %r>' % self.name
然后在入口里面写入
创建表:
if __name__ == "__main__":
db.create_all()
创建数据库完成
添加数据示例:
if __name__ == "__main__":
role = Role(
name="超级管理员",
auths="2323"
)
db.session.add(role)
db.session.commit()
在代码中删除数据示例:
@admin.route('/tag/del/<int:id>',methods=["GET"])
@admin_login_req
def tag_del(id=None):
tag = Tag.query.filter_by(id=id).first_or_404()
db.session.delete(tag);
db.session.commit()
flash("删除标签成功!","ok")
return redirect(url_for('admin.tag_list',page=1))
有时候会出现创建不成功,或者已经创建成功还是报错,查看
User
结构里面的语句,或者百度直接搜索关键字。
__table_args__ = {"useexisting": True}
操作验证
装饰器验证
在代码里面需要各种操作。比如每次操作都要判断admin
是否已经登录,每个函数前面要添加装饰器。
装饰器写法:
def admin_login_req(f):
@wraps(f)
def decorated_function(*args,**kwargs):
if "admin" not in session :
return redirect(url_for("admin.login",next=request.url))
return f(*args,**kwargs)
return decorated_function
代码示例:
@admin.route("/")
@admin_login_req
def index():
return render_template('admin/index.html')
表格验证
对
html
模板里面的每一个form
创建一个对应的验证类.如添加标签:
class TagForm(FlaskForm):
tagname = StringField(
label='名称',
validators=[ # 验证器
DataRequired("请输入标签")
],
description="标签",
render_kw={
"class ": "form-control",
"placeholder": "请输入标签名称!",
"id":"input_name",
# "required": "required"
}
)
submit = SubmitField(
"编辑",
render_kw={
"class ": "btn btn-primary"
}
)
读取数据操作数据
此时在视图
views.py
中进行判断:
@admin.route('/tag/edit/<int:id>/',methods=["POST","GET"])
@admin_login_req
def tag_edit(id=None):
form = TagForm()
#从数据库中查询标签id,返回标签数据
tag = Tag.query.get_or_404(id)
#表单提交的话,执行
if form.validate_on_submit():
data = form.data #读取表单数据
tag_count = Tag.query.filter_by(name=data['tagname']).count()#查看标签数量
if tag.name == data["tagname"] and tag_count == 1:
flash("名称已经存在!",'err')
return redirect(url_for('admin.tag_edit',id=id))
tag.name = data['tagname']
db.session.add(tag)#添加表单数据
db.session.commit()
flash("添加标签成功!",'ok')
redirect(url_for('admin.tag_edit',id=id))
return render_template('admin/tag_edit.html',form=form,tag=tag)
html中的模板
{% extends 'admin/admin.html' %}
{% block content %}
<!--内容-->
<section class="content-header">
<h1>微电影管理系统</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> 标签管理</a></li>
<li class="active">修改标签</li>
</ol>
</section>
<section class="content" id="showcontent">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">修改标签</h3>
</div>
<form role="form" METHOD="POST" action="{{url_for('admin.tag_edit',id=tag.id)}}">
<div class="box-body">
{% for msg in get_flashed_messages(category_filter=['err'])%}
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> 操作失败</h4>
{{msg}}
</div>
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['ok'])%}
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-check"></i> 操作成功</h4>
{{msg}}
</div>
{% endfor %}
<div class="form-group">
{{form.tagname(value=tag.name)}}
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
<input name="id" value="{{tag.id}}" type="hidden">
{% for err in form.tagname.errors%}
<div class="col-md-12" style="color:#ff0000">{{err}}</div>
{%endfor%}
</div>
</div>
<div class="box-footer">
{{form.submit}}
{{form.csrf_token}}
</div>
</form>
</div>
</div>
</div>
</section>
<!--内容-->
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$('#id-2-1').addClass('active');
$('#id-2-2').addClass('active');
})
</script>
{% endblock %}
简化一下就是:
{% extends 'admin/admin.html' %}
{% block content %}
<form role="form" METHOD="POST" action="{{url_for('admin.tag_edit',id=tag.id)}}">
<div class="box-body">
{% for msg in get_flashed_messages(category_filter=['err'])%}
<h4><i class="icon fa fa-ban"></i> 操作失败</h4>
{{msg}}
</div>
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['ok'])%}
<h4><i class="icon fa fa-check"></i> 操作成功</h4>
{{msg}}
</div>
{% endfor %}
<div class="form-group">
{{form.tagname(value=tag.name)}}
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
<input name="id" value="{{tag.id}}" type="hidden">
{% for err in form.tagname.errors%}
<div class="col-md-12" style="color:#ff0000">{{err}}</div>
{%endfor%}
</div>
</div>
<div class="box-footer">
{{form.submit}}
{{form.csrf_token}}
</div>
</form>
{% endblock %}
{% block js %}
<script>
</script>
{% endblock %}
其中
form
对应TagForm
里面的内容
Flask项目实战:创建电影网站(2)的更多相关文章
- KNN算法项目实战——改进约会网站的配对效果
KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...
- Flask项目实战:创建电影网站-创世纪(1)
以后要养成写博客的习惯,用来做笔记.本人看的东西很多很杂,但因为工作中很少涉及,造成看了之后就忘,或者看了就看了,但是没有融入的自己的知识体系里面. 写博客一方面是做记录,一方面是给这段时间业余学习的 ...
- Python框架 Flask 项目实战教程
本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...
- FastAPI小项目实战:电影列表(Vue3 + FastAPI)
假期过半, FastAPI + Vue3项目实战 视频也算录完了,尽管项目简单(2张表 共7个接口 4个页面) 起因 在6月底的时候开始录制了FastAPI官方文档中的新手教程部分(实际还没有官网文档 ...
- Flask项目实战:创建电影网站(3)后台的增删改查
添加预告 根据需求数据库创建表格 需求数据库,关键字title logo # 上映预告 class Preview(db.Model): __tablename__ = "preview&q ...
- flask项目实战--论坛
项目结构搭建 1:用pycharm创建flask bbs项目 2:分别创建config.py.exts.py.models.py.manage.py文件 创建一个apps包存放前台,后台,公共的模块 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-3.微信网站扫码支付介绍
笔记 3.微信网站扫码支付介绍 简介:讲解微信网页扫码支付 1.扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...
- Flask项目之手机端租房网站的实战开发(三)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
随机推荐
- Mybatis 的动态SQL,批量增删查改
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 批量增删改的接口: public interface BookService { //批量增加 int ...
- Java实现 蓝桥杯VIP 算法提高 选择排序
算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB 选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- Java实现 蓝桥杯 历届试题 波动数列
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...
- Java实现第九届蓝桥杯全球变暖
全球变暖 题目描述 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ...
- java实现第六届蓝桥杯机器人数目
机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有:4个轮子,4个传感器 他们一共订购了100套机器人,收到了轮子6 ...
- 哪些年,我们玩过的Git
作者:玩世不恭的Coder公众号:玩世不恭的Coder时间:2020-06-05说明:本文为原创文章,未经允许不可转载,转载前请联系作者 哪些年,我们玩过的Git 前言一.前期工作常用基本概念的理解G ...
- 循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用
在我前面随笔<循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用>里面曾经介绍过一些常规的界面组件的处理,主要介绍到单文本输入框.多文本框.下拉列 ...
- 在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext())
在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext()) install g ...
- springMVC 异常
springMVC 异常 0.依赖(不只是本次案例所需) <?xml version="1.0" encoding="UTF-8"?> <p ...
- 2个线程A-B-A-B或者B-A-B-A循环输出
代码: /** * 两个线程循环打印输出a-b-a-b */ public class AandBforTOthread { private static Object o = new Object( ...