Flask CURD(增删改查)
1.创建flask项目
2.修改配置文件:
'''
config.py 保存项目配置
'''
导入Flask模块
from flask import Flask
额外安装: 数据库操作模块
from flask_sqlalchemy import SQLAlchemy
额外导入, csrf防护
from flask_wtf import CSRFProtect
数据库对象
db = SQLAlchemy()
配置类定义Flask项目配置
class Config(object):
'''项目配置信息'''
DEBUG=True # 开启调试模式
# 数据库
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@127.0.0.1:3306/books'
SQLALCHEMY_TRACK_MODIFICATIONS= True
SQLALCHEMY_ECHO= True
SECRET_KEY = "sdfdfdfdxfddesfdgb^$" # 加密字符串 csrf需要用session也需要用
def create_app():
'''创建app对象'''
app =Flask(name)
# 2. 使用csrf保护应用程序
CSRFProtect(app)
app.config.from_object(Config) # 通过配置类加载配置信息
# 初始化数据库配置
db.init_app(app)
#导入蓝图
from apps.users import users
from apps.book import book
app.register_blueprint(users, url_prefix="/") #用户蓝图/模块
app.register_blueprint(book, url_prefix="/book")# 书籍模块
return app
3.修改启动文件:
from config import create_app,db #配置文件中
from flask_script import Manager # 扩展db指令
from flask_migrate import Migrate,MigrateCommand # 数据库迁移库
app = create_app()
manager = Manager(app) # 命令管理类
migrate = Migrate(app,db=db) #创建迁移对象
manager.add_command('db',MigrateCommand) #扩展新的数据库操作指令db
if name == 'main':
manager.run() #启动
4. 创建数据库:
'''
如果是团队开发:
最快方案: 项目经理把models写完!个人按照自己需求微调!!!
'''
from config import db # 导入数据库对象
from datetime import datetime
用户模型(id,name,pwd,phone,email,addr,创建时间)
class Users(db.Model):
__tablename="users"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(50),nullable=False,index=True,unique=True) #不为空,索引加快访问速度,名字唯一
pwd = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(20))
phone = db.Column(db.String(20))
addr = db.Column(db.String(20)) #地址
create_time = db.Column(db.DATE,default=datetime.now()) # 时间默认为系统当前日期
def __str__(self):
return f'名字:{self.name},电话:{self.phone}'
作者
class Author(db.Model):
__tablename = "author"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50), nullable=False, index=True, unique=True) # 不为空,索引加快访问速度,名字唯一
# 1方配置关系,配置反向引用的名字
books = db.relationship('Books',backref='author')
书籍(id,名字,价格,作者id,出版日期)
class Books(db.Model):
__tablename = "books"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50), nullable=False, index=True, unique=True) # 不为空,索引加快访问速度,名字唯一
price = db.Column(db.String(50))
create_time = db.Column(db.DATE,default=datetime.now())
# 多方外键: 书籍.author.作者名字
author_id = db.Column(db.Integer,db.ForeignKey('author.id'))#或Author.id
5:用户蓝图(登陆注册):
from flask import Blueprint,render_template,request,session,redirect,url_for # redirect ,url_for重定向跳转
users = Blueprint('users',name) #模块名/蓝图名叫users
from .models import Users,db
@users.route('/') # 路由定义!
def index():
return render_template('/index.html') # 跳转到模板!
@users.route('/register',methods=["GET",'POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
else:
username = request.form.get('username')
password = request.form.get('password')
email = request.form.get('email')
phone = request.form.get('phone')
addr = request.form.get('addr')
create_time = request.form.get('create_time')
user = Users(name=username,pwd=password,email=email,phone=phone,addr=addr,create_time=create_time)
db.session.add(user)
db.session.commit()
return render_template('login.html')
@users.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
user = Users.query.filter_by(name=username).first()
if user is not None:
print('用户名存在')
if user.pwd == password:
print('登录成功')
return redirect('/book/readerall')
else:
print('密码不正确')
return redirect('/login')
else:
print('用户名不存在')
return redirect('/login')
7书籍列表蓝图:
from flask import Blueprint,render_template,request,session,redirect,url_for # redirect ,url_for重定向跳转
book = Blueprint('book',name) #模块名/蓝图名叫users
from .models import Books,Users,db,Author
@book.route('/add',methods=["GET",'POST'])
def add():
if request.method == 'GET':
authors = Author.query.all()
return render_template('add.html',authors=authors)
else:
name = request.form.get('name')
price = request.form.get('price')
create_time = request.form.get('create_time')
author_id = request.form.get('author_id')
print(name)
book1 = Books(name=name,price=price,create_time=create_time,author_id=author_id)
db.session.add(book1)
db.session.commit()
# books = Books.query.all()
# return render_template('books.html', books=books)
return redirect('/book/readerall')
@book.route('/delete/int:id')
def delete(id):
book1 = Books.query.get(id)
db.session.delete(book1)
db.session.commit()
# books = Books.query.all()
# return render_template('books.html', books=books)
return redirect('/book/readerall')
@book.route('/update/int:id',methods=["GET","POST"])
def update(id):
if request.method == 'GET':
book1 = Books.query.get(id)
authors = Author.query.all()
return render_template('update.html',authors=authors,book1=book1)
else:
book1 = Books.query.get(id)
name = request.form.get('name')
price = request.form.get('price')
create_time = request.form.get('create_time')
author_id = request.form.get('author_id')
book1.name = name
book1.price = price
book1.create_time = create_time
book1.author_id = author_id
db.session.commit()
# books = Books.query.all()
# return render_template('books.html', books=books)
return redirect('/book/readerall')
@book.route('/readerall',methods=['GET','POST'])
def reader_all():
if request.method == 'GET':
paginate = Books.query.paginate(1, 2) # 默认显示第1页 # 获取页数
page = int(request.args.get('page',1))
if page <= 0:
page = 1
if page >= paginate.pages: # 共3页, 输入30-->显示最大页3
page = paginate.pages #最大页数
paginate = Books.query.paginate(page, 2)# 重新查询
books = paginate.items # 当前页数据(默认是第1页数据)
return render_template('books.html',books=books,paginate=paginate)
else:
name = request.form.get('name')
print(Books.query.filter(Books.name.contains(name)))
paginate = Books.query.filter(Books.name.contains(name)).paginate(1,2)
books = paginate.items
return render_template('books.html',books=books,paginate=paginate)
迁移数据库:
初始化数据库:python manage.py db init
数据库迁移:python manage.py db migrate
生成数据库: python manage.py db upgrade
前端网上找找模板
Flask CURD(增删改查)的更多相关文章
- FuelPHP 系列(六) ------ CURD 增删改查
一.create $article = new Model_Article(); // 或 $article = Model_Article::forge(); // 保存数据,返回新增数据 id $ ...
- MySQL的CURD 增删改查
添加 insert 语法: 单条:insert into 表名('字段1', '字段2', ...) values('值1', '值2', ...) 多条:insert into 表名('字段1', ...
- ThinkPHP - CURD增删改查 - 实例 - 搜索功能
模板代码: /** * 搜索数据 * @return 无返回值 */ public function search(){ //判断并接收参数 //姓名 if ( isset($_POST['usern ...
- ThinkPHP - CURD增删改查 - 实例
目录结构:
- ThinkPHP - CURD增删改查操作
public function show(){ //使用model模型 //1.可以使用 $user = new Model('User'); //2.可以使用 $user = M('User'); ...
- 通过flask实现web页面简单的增删改查bootstrap美化版
通过flask实现web页面简单的增删改查bootstrap美化版 项目目录结构 [root@node1 python]# tree -L 2 . ├── animate.css ├── fileut ...
- 通过flask实现web页面简单的增删改查
通过flask实现web页面简单的增删改查 # 1.后台程序falsk_web01.py #coding:utf-8 from flask import Flask,render_template,r ...
- [py]flask从0到1-模板/增删改查
flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ...
- vue实现对数据的增删改查(CURD)
vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...
- Flask蓝图的增删改查
怎样用flask蓝图来实现增删改查呢?请看下面的内容 这是我们的目录结构 从图中可以看出每一个功能都有一个各自的文件夹 首先我们要自己先来创建一个数据,在Flask_data.py中写入如下内容: S ...
随机推荐
- 【剑指Offer】【数组】顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...
- VUE中如何使用MOCK
安装mockjs npm install mockjs 可以使用数据模板生成模拟数据. Mock.mock( rurl?, rtype?, template ) ) // 或者 Mock.mock( ...
- 2022-3-18内部群每日三题-清辉PMP
1.在评估项目活动现状的会议中,团队发现存在一些影响可交付成果的风险.项目经理应该怎么做? A.跟踪已发现的风险,识别和分析新风险,并评估整个项目的风险过程有效性 B.记录风险管理信息用于经验教训 C ...
- 记录 windows RabbitMq 安装教程
安装地址:https://www.rabbitmq.com/ RabbitMq 官网下载如下两个exe文件,otp_win64_22.0.exe 文件是rabbitmq的运行环境,必须安装!!! 傻子 ...
- [2007年NOIP普及组] 纪念品分组
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不 ...
- .NET CORE 下收发邮件之 MAILKIT
背景 利用代码发送邮件在工作中还是比较常见的,相信大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址 ...
- CH9121小结
当通过网络配置工具将CH9121设置成UDP SERVER模式时,同时通过SRT-NET设置将PC设置成UDP并与CH9121用网线连接.将CH9121配置好与PC信息相匹配的端口号与IP地址,PC端 ...
- SQL优化:distribute by 小数据场景处理数据倾斜
distribute by rand() distribute by :用来控制map输出结果的分发,即map端如何拆分数据给reduce端. 会根据distribute by 后边定义的列,根据re ...
- 苹果公司对蓝牙免提AT指令的扩充
介绍 苹果公司对蓝牙HF profile进行了一些HF AT指令的扩充.不过为了兼容起见,尽量实现HF标准规范规定的内容,如果标准规范没有规定相应的内容,为了适配苹果设备新增的功能,还是可以适应苹果公 ...
- JAVA第四五次大作业及期中考试总结
21201411-李英涵 继承与多态blog2 前言: 期中考试的题目还可以,因为给了类图,但是难度也逐渐升高. pta中的四的第一题和第三题较为简单,因为第一题的正则 ...