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(增删改查)的更多相关文章

  1. FuelPHP 系列(六) ------ CURD 增删改查

    一.create $article = new Model_Article(); // 或 $article = Model_Article::forge(); // 保存数据,返回新增数据 id $ ...

  2. MySQL的CURD 增删改查

    添加 insert 语法: 单条:insert into 表名('字段1', '字段2', ...) values('值1', '值2', ...) 多条:insert into 表名('字段1', ...

  3. ThinkPHP - CURD增删改查 - 实例 - 搜索功能

    模板代码: /** * 搜索数据 * @return 无返回值 */ public function search(){ //判断并接收参数 //姓名 if ( isset($_POST['usern ...

  4. ThinkPHP - CURD增删改查 - 实例

    目录结构:

  5. ThinkPHP - CURD增删改查操作

    public function show(){ //使用model模型 //1.可以使用 $user = new Model('User'); //2.可以使用 $user = M('User'); ...

  6. 通过flask实现web页面简单的增删改查bootstrap美化版

    通过flask实现web页面简单的增删改查bootstrap美化版 项目目录结构 [root@node1 python]# tree -L 2 . ├── animate.css ├── fileut ...

  7. 通过flask实现web页面简单的增删改查

    通过flask实现web页面简单的增删改查 # 1.后台程序falsk_web01.py #coding:utf-8 from flask import Flask,render_template,r ...

  8. [py]flask从0到1-模板/增删改查

    flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ...

  9. vue实现对数据的增删改查(CURD)

    vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...

  10. Flask蓝图的增删改查

    怎样用flask蓝图来实现增删改查呢?请看下面的内容 这是我们的目录结构 从图中可以看出每一个功能都有一个各自的文件夹 首先我们要自己先来创建一个数据,在Flask_data.py中写入如下内容: S ...

随机推荐

  1. Java数组之Arrays类讲解

    Arrays类 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作. 查 ...

  2. 2022-04-11内部群每日三题-清辉PMP

    1.项目经理从制造商那里收到一个更新信息,说一个必要的设备修理可能会导致他们的可交付成果迟八周时间.项目经理应该怎么做? A.确定关键路径 B.实施沟通管理计划 C.执行假设情景分析 D.对项目进度赶 ...

  3. 【Numpy】安装Anaconda3和调试

    1,在Anaconda官网下载一个对应操作系统的安装包:https://www.anaconda.com/distribution/ 2,然后选版本操作系统和版本号,下载完成后安装 3,windows ...

  4. 网络编程之 requests 模块

    1. get 请求 1 import requests 2 url = 'http://api.xxxx.cn/api/user/stu_info?stu_name=xiaohei' 3 data = ...

  5. 冰冻三尺非一日之寒,记录Java

    一.数据类型 Java是一种强类型语言,什么是强类型语言? 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 Java的数据类型又分为两大类: 1.基本类型:基本类型有分为数值 ...

  6. omcat启动Publishing failed with multiple errors

    新安装一个tomcat插件.启动的时候就弹错误框.但tomcat还能使用. Publishingfailedwithmultipleerrors Resource is out of sync wit ...

  7. bzoj 2594

    很好的一道LCT题目 首先我们可以发现,题目要求的就是最小生成树上的一条树链的最长边的长度,因此我们实际只需动态维护最小生成树即可 然后我们考虑怎么动态维护最小生成树 不难发现,如果涉及在最小生成树上 ...

  8. 前端本地 Nginx 反向代理

    一.问题引入 本地开发遇到线上bug,debug得stash代码切换分支,同时需切换开发环境与生产环境服务,npm run serve 或 npm start 费时 二.webpack-dev-ser ...

  9. openSUSE Tumbleweed 安装原生微信

    优麒麟网站上有![微信原生版](https://www.ubuntukylin.com/applications/106-cn.html)提供下载. 之前用 Ubuntu的时候,直接安装就可以使用. ...

  10. Vue中的input输入框无法输入强制渲染

    刚开始以为是键盘的问题,然后发现别的地方都可以输入,唯独这个input无法输入,可能因为我循环嵌套了三次,太深入无法渲染 后来我发现这个方法可以使用 1 <el-input 2 v-model= ...