Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python Flask 学习笔记 —— 三(Flask 扩展学习 )

Python Flask 学习笔记 —— 三(Flask 扩展学习 )

作者头像
Gorit
发布于 2021-12-08 13:55:29
发布于 2021-12-08 13:55:29
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

Python Flask 扩展学习

一、传统的表单验证学习

学习参考:

W3School

Flask 官方文档

设想有这样一个情景,我们需要实现一个简单的登录功能,用户需要输入账号,密码,以及确认密码,服务器后台验证账号密码是否合理,合理的话,就登录成功,提示登录成功!不成功的话,就通过消息闪现告诉用户哪里出错了

1.1 编写前端的表单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <form method="post">
        <label>用户名:label><input type="text" name="username"/><br>
        <label>密码:label><input type="password" name="password" /><br>
        <label>确认密码:label><input type="password" name="password2"/> <br>
        <input type="submit" value="提交"> <br>
    form>
html>

实现效果如下:

1.2 编写 Python 的后台逻辑处理

实现一个简单的登录逻辑处理

  1. 路由需要有 get 和 post 两种逻辑处理 判断请求方式
  2. 获取请求的参数 (flask 中 提供 request 函数 )
  3. 判断参数是否填写 以及 密码是否相同 (参数验证)
  4. 如果判断都没有问题,就返回一个 success
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
出问题,将问题返回到游览器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask
from flask import render_template,request,flash

app = Flask(__name__)

'''
    消息闪现,向网页发送内容
    给模板传递消息
    flash  (需要加密) 需要设置 secret_key
    模板中需要遍历消息
'''
app.secret_key = "ali" # 设置一个 secret_key,才可以使用 消息闪现的功能

@app.route("/", methods=['GET','POST'])
def index():
    # request 是一个请求对象 -> 获取请求方式,数据

    #1. 判断请求方式
    if request.method == 'POST':
    #2、获得请求参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get ('password2')
        print(username,password,password2)
    # 3、验证
        if not all([username,password,password2]):
            print('参数不完整')
            # 编码问题加一个 u
            flash(u"参数不完整")
        elif password != password2:
            print("密码不一致")
            flash(u"密码不一致")
        else:
            return "success"
    return render_template("index.html")


if __name__ == '__main__':
    app.run(host="127.0.0.1",debug=True,port=3000)

我们需要使用到 消息闪现的功能,把信息发送到 前端中,所以前端代码需要修改一下,在 from 下面加上如下的一段 jinjia2 语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    {# 使用遍历,获取闪现的消息  #}
    {% for message in get_flashed_messages(): %}
        {{ message }}
    {%  endfor  %}

1.3 运行效果

  1. 直接提交
  1. 两次密码输入的不一致
  1. 验证成功

写了这么多,其实这些都是前面学习过的内容,今天来学习一下使用 Flask-wtf 来生成我们需要的表达那效果

二、 使用 Flask-WTF 扩展验证表单

使用 witf 创建表单,主要需要如下几步来完成

  1. 安装 flask-wtf:pip install Flask-WTF
  2. 自定义一个表单类
  3. 然后渲染到 HTML 中
  4. 补充验证
  5. 验证需要导入验证函数

2.1 定义表单验证类

为了展示方便,我把表单类定义在同一个文件中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入自定义表单需要的字段
from wtforms import StringField, PasswordField, SubmitField
# 导入 wtf扩展提供的表单验证
from wtforms.validators import DataRequired, EqualTo

class LoginForm(FlaskForm):
	# 这里定义 每个字段,使用 StringField 表示字符串字段,PasswordField 代表密码字段, SubmitField 代表提交字段
	# validators 表示数据验证, DataRequired 验证非空, EqualTo 验证数据是否相等
    username = StringField(u"用户名", validators=[DataRequired()])
    password = PasswordField(u"密码", validators=[DataRequired()])
    password2 = PasswordField(u"确认密码", validators=[DataRequired(), EqualTo("password", "密码填入的不一致")]) # 和第一个比较相同
    submit = SubmitField(u"提交")

2.2 编写前端界面

second.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>wtf 验证title>
head>
<body>
    <form method="post">
    
        {{ form.csrf_token() }} 
        {{ form.username.label }}:{{ form.username }} <br>
        {{ form.password.label }}: {{ form.password }} <br>
        {{ form.password2.label }}: {{ form.password2 }} <br>
        {{ form.submit }}
    form>
body>
html>

2.3 Flask 后台处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/form', methods=['POST','GET'])
def login():
    login_form = LoginForm()
    if request.method == 'POST':
        username = request.form.get ('username')
        password = request.form.get ('password')
        password2 = request.form.get ('password2')

        # 验证参数, wtf 可以一句话实现所有的校验
        # 缺少 CRSF token会导致不通过,需要在 csrf 的东西
        if login_form.validate_on_submit():
            print(username, password)
            return 'success'
        else:
            flash("参数有误")

    # 往模板传值
    return render_template('second.html',form=login_form)

2.4 验证

三、Python 操作数据库

Python 作为一门后端语言,它当然也可以操作数据库,本次操作均已 mysql 为例

如果你还不会 mysql,可以先看这篇文章:MySQL 常用命令一览

Python 操作 mysql 的库有很多,我这里选择使用 pymysql 来演示

3.1 安装 pymysql

应该可以安装的上,我使用虚拟环境的默认环境安装的

使用默认源安装:pip install pymysql

如果速度太慢,可以使用另一个方式:pip3 install pymysql -i https://pypi.douban.com/simple

3.2 配置数据库信息

以下两种方式均可使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymysql

config = {
    "host":"127.0.0.1",
    "user":"root",
    "password":"你的数据库密码",
    "database":"bank"
}

# 方式一
db = pymysql.connect(**config)

# 方式二
db = pymysql.connect("localhost","root","数据库密码","db_name")

3.3 简单的数据库操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymysql

config = {
    "host":"127.0.0.1",
    "user":"root",
    "password":"root",
    "database":"bank"
}

# 连接数据库
db = pymysql.connect(**config)

# 创建一个游标对象
cursor = db.cursor()

# 编写 SQL 语句
s = "select * from student"; # 因为查询不需要提交事务,所以我们可以直接获取数据

# 获取查询的数据
cursor.execute("select * from student") # 执行查询语句
data = cursor.fetchall()

# 获得的数据有多个就是个元组,所以需要循环打印数据
for i in data:
    print(i)

# 如果你还想插入数据,可以这么做
cursor.execute(f"insert into student values({39},'gorit',{18},{97})")
db.commit() # 数据发生了变化,所以需要提交事务

pymysql 的基本操作就讲到这里,只要 sql 语句写的好,就可以使用 pymysql 来实现,而且效率还相对下边的 ORM 更高

四、使用 Flask-SQLAlchemy (ORM)操作数据库

  1. 我们需要用到 Flask-SQLAlchemy 这个扩展,所以我们需要安装它:pip install Flask-SQLAlchemy
  2. 前提装好了 mysql 数据库
  3. 我们会用到 pymysql 的引擎操作数据库,所以这个也要安装上:pip install pymysql

4.1 创建实体类(建表)

  1. 创建一个 Test_sql.py 文件 (创建实体类,并用 该扩展生成相对应的表)
  2. 创建一个 Test_sql_config.cfg 的配置文件 (Flask 的属性配置文件)
  3. 创建一个 operate_new_sql.py 文件 (测试 ORM)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 --
#@File: Test_sql.py
#@author: Gorit
#@contact: gorit@qq.com
#@time: 2020/4/4 17:50

from  flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)
app.config.from_pyfile ("Test_sql_config.cfg") # 把一些必要配置写进配置文件中

db = SQLAlchemy(app) # 实例化数据库,等会测试 ORM 会用到这个

# 创建学生表
class Student(db.Model):
    tablename = "student"
    # 主键
    id = db.Column(db.Integer, primary_key = True) # 主键
    name =db.Column(db.String(64), nullable=False) # 学生姓名,nullable 能否为空
    gender = db.Column(db.Enum("男","女"), nullable=False) # 枚举,只能使用指定的数据,非空
    phone = db.Column(db.String(11)) # 手机号 可以为空

# 创建课程表
class Course(db.Model):
    tablename = "course"
    id = db.Column(db.Integer, primary_key = True) # 主键
    name = db.Column(db.String(64), nullable=False) # 课程名非空
    # teacher_id = db.Column()

# 创建教师表
class Teacher(db.Model):
    tablename = "teacher"
    id = db.Column(db.Integer, primary_key = True) # 主键
    name = db.Column(db.String(64), nullable=False) # 学生姓名,nullable 能否为空
    gender = db.Column(db.Enum("男","女"), nullable=False) # 枚举,只能使用指定的数据,非空
    phone = db.Column(db.String(11)) # 手机号 可以为空

# 创建成绩表
# class Grade(db.Model):
#     tablename = "grade"
#     id = db.Column(db.Integer, primary_key = True) # 主键
#     course_id =
#     grade =
#     student =

if __name__ == '__main__':
    db.create_all()

为什么我要把配置文件单独抽出来,因为不这么做的话,我就得在 FLask 的文件中一个个的使用 app.config‘xxxxx’ = xxxx,会很麻烦,因此把这些内容全部方法文件之中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON_AS_ASCII = False # 返回 json 数据时,关闭转 ASCLLDEBUG = True # 调试模式打开
SECRET_KEY = "sb_3306o233"  # 使用消息闪现必须要配置的内容

# 数据库的配置
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:root@localhost:3306/bank?charset=utf8" # 这里的 +pymysql 是使用它的引擎操作 pymysql。剩下的按照顺序就是账号,密码。服务的 URI + 端口,数据库,字符集等等内容
SQLALCHEMY_COMMIT_ON_TEARDOWN= False # 数据库的配置
SQLALCHEMY_TRACK_MODIFICATIONS = True # 数据库的配置

4.2 单表操作之 —— 增加数据

接下来的数据库操作部分均在 operate_new_sql.py 文件中完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 --
#@File: operate_new_sql.py
#@author: Gorit
#@contact: gorit@qq.com
#@time: 2020/4/4 20:07

# 操作数据库
from Test_sql import db, Student

# db 为实例化的数据库操作对象, Student 为一张表


# ================== 单表增
# 创建学生对象
# 创建好后 id 会自增
s = Student(name="666", gender="女", phone="13324436542")
s1 = Student(name="xxx", gender="女", phone="13324426542")
s2 = Student(name="xxx", gender="男", phone="18324426542")
# 语句 第一种(一次增加一条数据)
# db.session.add(s) 
# db.session.commit()

# 语句 第二种(一次性添加多条数据)
db.session.add_all([s1,s2,s])
db.session.commit()

4.3 单标操作之 —— 查询数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ========================= 单标查

# get 第一种查询, 查询单一的一个
# stu = Student.query.get(1) # 放入的是 id,根据主键查询 局限性很大
# print(stu.name, stu.gender, stu.phone) # stu 是一个学生类对象,所以会直接打印对象 

# all() 查询全部
# stu1 = Student.query.all()
# for i in stu1:
#     print (i.name, i.gender, i.phone)

# filter() 按照条件查询
# stu = Student.query.filter(Student.id <=5)
# stu = Student.query.filter(Student.name == "张三")
# stu = Student.query.filter(Student.gender == "女")
# for i in stu:
#     print (i.name, i.gender, i.phone)

# filter_by() 类似 sql 查询  first() 查询第一个
# stu = Student.query.filter_by(name="张三")
# stu = Student.query.filter_by(name="张三").all() 打印对象
# stu = Student.query.filter_by(name="张三").first()
# print(stu)

上面的可以看出,我们只能做简单的查询,如果高级一点,分组查询,子查询等等,就可能难以实现,所以还是 乖乖的好好学 sql 语句吧,hhhhhh

4.4 单表操作之 —— 修改数据

我们这里接收得到的都是被修改的数据的数量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# =========================== 单表改
# 第一种
# 修改一条数据
count = Student.query.filter(Student.name == "张三").update({"name":"张一"})
print(count) # 返回的是修改了多少条数据
db.session.commit()
print(stu.name, stu.gender, stu.phone)

# 第二种
stu = Student.query.filter(Student.gender == "男").update({"gender":"女"})
print(stu) # 得到是个整数
db.session.commit()

# 批量修改
stu1 = Student.query.filter(Student.gender == "女").all()
for i in stu1:
     i.gender = "男"
     db.session.add(i)
db.session.commit()

4.5 单表操作之 —— 删除数据

将查询的数据删除即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 单表删
stu = Student.query.filter(Student.gender == "女").delete()
print(stu) # 返回 0
db.session.commit()

4.6 小总结

单表数据的增删查看

  1. 增加数据 add 和 commit
  2. 查询 不需要 commit
  3. 需要都要 commit
  4. delete 也需要 commit

五、Flask-SQLAlchemy 中常用字段

5.1 字段类型
5.2 列选
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小记 - Flask基础
Web表单是Web程序的基本功能,它是HTML页面中负责数据采集的部件。表单中有三部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
Naraku
2021/07/29
3K0
小记 - Flask基础
【Web开发】Flask框架基础知识
Flask诞生于2010年,是用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。
zstar
2022/09/19
2.2K0
【Web开发】Flask框架基础知识
使用flask框架实现简单的图书管理(python 3.8)
flask是轻量级的web框架。 浏览器作为client发出HTTP请求,而web服务器负责处理逻辑,而flask帮助我们完成了安全性和数据流的控制,让我们只用关注于业务逻辑本身,避免重复造轮子
用户7886150
2020/12/30
7580
Flask 自定义模型类
模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库。
Devops海洋的渔夫
2020/01/15
1.7K0
Flask 自定义模型类
flask构建AI网站(后端基础)
2、会泄露Web应用的绝对路径,及Python解释器的路径(可以配合写文件漏洞向指定目录的文件内写入构造好的恶意代码,利用方式可以参考安全客的这篇文章:文件解压之过 Python中的代码执行)
用户6841540
2025/03/24
2560
Flask框架入门与实战:从基础应用到数据库集成
文章链接:https://cloud.tencent.com/developer/article/2465456
一键难忘
2024/11/14
3920
Flask 扫盲系列-数据库
在前面的学习中,我们已经简单搭建了一个在线股票走势查询系统,并且了解了 Flask 中的上下文,那么今天我们一起来学习下 Flask 中的数据库操作。
周萝卜
2020/05/22
8190
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
在 Web 应用中,连接数据库是一项基本任务,而用户登录功能是很多应用的核心部分。本文将演示如何使用 Flask 框架连接数据库,并实现一个简单的用户登录功能。将创建一个名为 user 的数据库表,其中包含账号、密码和名字字段。还将实现一个登录页面,以及登录成功后跳转到的页面,显示用户姓名。
GeekLiHua
2025/01/21
2530
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
Flask数据库
Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的。它使用结构化的查询语言。关系型数据库的列定义了表中表示的实体的数据属性。比如:商品表里有name、price、number等。 Flask本身不限定数据库的选择,你可以选择SQL或NOSQL的任何一种。也可以选择更方便的SQLALchemy,类似于Django的ORM。SQLALchemy实际上是对数据库的抽象,让开发者不用直接和SQL语句打交道,而是通过Python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。
py3study
2020/01/16
3.1K0
基于flask的网页聊天室(二)
接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下
py3study
2020/01/16
1.2K0
我用Flask写了一个图书作者管理项目(附完整代码)
这次给大家带来的是一个非常小的Flask案例,刚好也与我们之前学习的Flask知识紧紧相结合。
Python进击者
2019/10/31
6720
玩了下flask,很轻量级的一个web开发框架
安装flask pip install flask *** #新建一个项目 #然后导入 from flask import Flask #指定app名称 app=(__name__) #指定路由 @app.route(‘/’) def index(): return(‘hello‘) if __name==’main’: app.run() flask 新建起来非常的简单,7行代码就可以搞定了 入口文件可以设置很多参数 app.run(host,port,debug,opt
kirin
2020/05/09
1.2K0
Python Web 之 Flask-SQLAlchemy 框架
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间做一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。简单说,ORM是一个可以使我们更简单的操作数据库的框架。
arcticfox
2019/10/30
2.9K0
Python Web 之 Flask-SQLAlchemy 框架
图书馆数据库系统
library.py """ 分析图书馆案例 - 1.数据库配置 - 作者模型(一方) - 书籍模型(多方) - 2.添加测试数据 - 3.添加作者,书籍 - 4.删除作者,删除书籍 """ from flask import Flask, render_template, request, redirect,flash from flask_sqlalchemy import SQLAlchemy from flask_wtf.csrf import CSRFProtect app = Fl
小闫同学啊
2019/07/18
2.5K0
flask数据操纵
在Django框架中内部已经提供ORM这样的框架,来实现对象关系映射,方便我们操作数据库。如果想在Flask中也达到这样效果,需要安装一个第三方来支持。 SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。
py3study
2020/01/15
1.4K0
Python Flask 入门指南
Python Flask 是一种基于 Python 的微框架,它提供了一种简单而灵活的方式来构建 Web 应用程序。本篇文章将介绍 Flask 的基本概念、安装和配置、路由、模板、表单、数据库以及部署等方面的内容。
疯狂的KK
2023/03/17
2.5K0
从头搭建一个在线聊天室(三)
随着我们项目功能越来越多,把所有的逻辑代码都写在一个文件里已经不太合适了,下面就通过 flask 的工厂模式,把项目代码拆分开。
周萝卜
2019/07/17
2.1K0
从头搭建一个在线聊天室(三)
Flask框架在Python面试中的应用与实战
Flask,作为轻量级且灵活的Python Web开发框架,因其简洁的API、强大的扩展性以及对初学者友好的特性,广受开发者和企业的青睐。在Python面试中,对Flask框架的理解与应用能力往往是考察的重点之一。本篇博客将深入浅出地探讨Flask在面试中的常见问题、易错点及应对策略,并结合实例代码进行讲解。
Jimaks
2024/04/21
4780
Python Flask实现修改和删除数据
继续使用查询和添加数据时的数据表和数据,新建一个 update_and_delete.py 文件,复制查询和添加数据的代码过来,代码如下:
Python碎片公众号
2021/02/26
1.8K0
Python Flask实现修改和删除数据
Flask 从0到0.1 part-02
这个前提的话我们需要两个模块,即pymysql和sqlalchemy,前者用于连接mysql,后者是他提供了一种名为ORM的技术,使得我们不用通过Mysql的原生指令来执行命令,而是通过Python操作普通对象似的执行mysql语句。
用户9691112
2023/05/18
1.1K0
Flask 从0到0.1 part-02
相关推荐
小记 - Flask基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验