前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Web开发】Flask框架基础知识

【Web开发】Flask框架基础知识

作者头像
zstar
发布于 2022-09-19 07:37:49
发布于 2022-09-19 07:37:49
2.1K00
代码可运行
举报
文章被收录于专栏:往期博文往期博文
运行总次数:0
代码可运行

本篇主要是黑马程序员的Flask快速入门教程的笔记

Flask简介

Flask诞生于2010年,是用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。

Flask的常用扩展包:

  • Flask-SQLalchemy:操作数据库
  • Flask-migrate:管理迁移数据库;
  • Flask-Mail:邮件;
  • Flask-WTF:表单;
  • Flask-Bable:提供国际化和本地化支持,翻译;
  • Flask-script:插入脚本;
  • Flask-Login:认证用户状态;
  • Flask-OpenID:认证;
  • Flask-RESTful:开发REST API的工具;
  • Flask-Bootstrap:集成前端Twitter Bootstrap框架;
  • Flask-Moment:本地化日期和时间;
  • Flask-Admin:简单而可扩展的管理接口的框架

相关文档: 中文文档:http://docs.jinkan.org/docs/flask/ 英文文档:http://flask.pocoo.org/docs/0.12/

Flask安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install flask

我安装的版本是Flask 2.1.3

拓展命令: 将当前环境打包成requirements.txt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip freeze >requirements.txt

将需要的环境一起安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install -r requirements.txt

基本框架

在Pycharm中,可以直接新建一个Flask模板文件,运行后,可以在浏览器在中输出Hello World。

相关注释如下:

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

# 指向程序所在的模块
app = Flask(__name__)


# 将路由映射到视图函数index
@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    # 启动WEB服务器
    app.run()

路由请求方式限定

默认情况下,路由仅支持Get请求方式,可用下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    return 'Hello World!'

路由传递参数

在路由中使用<>可以传递参数,使用int可以限定整形数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/orders/<int:order_id>')
def order(order_id):
    print(type(order_id))  # 类型为int
    return 'this is order %d' % order_id

Jinja2模板引擎

Jinja2:是Python下一个被广泛应用的模板引擎,是Flask内置的模板语言。

简单使用

Jinja2提供了render_template函数,来渲染html文件。 下面简单来使用一下:

先导入render_template

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template

在templates文件夹下新建index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
测试Jinja2
</body>
</html>

进行调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/', methods=['GET', 'POST'])
def index():
    return render_template('index.html')

注释

使用 {# #} 进行可以进行注释

变量/控制语句

在路由函数里,可以自定义变量,然后在render_template函数中进行参数传递,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/', methods=['GET', 'POST'])
def index():
    my_list = [1, 2, 3, 4, 5]
    return render_template('index.html', num_list=my_list)

num_list对应html文件中的变量。

在html中循环输出: index.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body>
{% for num in num_list %}
    {{ num }}
{% endfor %}
</body>

小技巧:先写for,再按Tab可使用代码补全

输出效果:

过滤器

过滤器即Flask提供的一些函数,可以直接进行调用简化操作。

例如:使用lower可以实现字符串转小写, 使用length可以获取列表长度。 输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body>
{#字符串转小写#}
<p>{{ 'HELLO' | lower }}</p>
{#获取列表长度#}
<p>{{ [1,2,3,4,5,6] | length }}</p>
</body>

输出:

注:使用连续的|可以同时使用多个过滤器

更多过滤器总结:

字符串操作

  • safe:禁用转义
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ '<em>hello</em>' | safe }}</p>
  • capitalize:把变量值的首字母转成大写,其余字母转小写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'hello' | capitalize }}</p>
  • lower:把值转成小写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'HELLO' | lower }}</p>
  • upper:把值转成大写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'hello' | upper }}</p>
  • title:把值中的每个单词的首字母都转成大写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'hello' | title }}</p>
  • reverse:字符串反转
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'olleh' | reverse }}</p>
  • format:格式化输出
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ '%s is %d' | format('name',17) }}</p>
  • striptags:渲染之前把值中所有的HTML标签都删掉
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ '<em>hello</em>' | striptags }}</p>
  • truncate: 字符串截断
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ 'hello every one' | truncate(9)}}</p>

列表操作

  • first:取第一个元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ [1,2,3,4,5,6] | first }}</p>
  • last:取最后一个元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ [1,2,3,4,5,6] | last }}</p>
  • length:获取列表长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>{{ [6,2,3,1,5,4] | sort }}</p>

语句块过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% filter upper %}
    一大堆文字
{% endfilter %}

Flask-WTF表单

在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能

以最常见的登录验证为例,这里以普通实现方式和WTF表单方式实现进行比较。

普通方式

html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
</form>

app.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template, request, flash

# 指向程序所在的模块
app = Flask(__name__)

# Flask-WTF需要配置参数SECRET_KEY
app.secret_key = 'zstar'


@app.route('/', methods=['GET', 'POST'])
def hello_world():
    # 1. 判断请求方式是post
    if request.method == 'POST':
        # 2. 获取参数, 并效验参数完整性, 如果有问题就进行flash
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        if not all([username, password, password2]):
            flash('params error')

        # 3. 效验密码
        elif password != password2:
            flash('password error')

        # 4. 没有问题就返回'success'
        else:
            print(username)
            return 'success'

    return render_template('index.html')


if __name__ == '__main__':
    # 启动WEB服务器
    app.run()

代码说明: 后端使用request.form.get的来获取前端表单数据 验证主要来验证两次登录输入密码是否一致 提示信息使用flash来进行映射,前端使用get_flashed_messages来获取映射的信息。

WTF表单方式

html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {#设置csrf_token(python3版本不需要)#}
    {{ form.csrf_token() }}
    {{ form.username.label }}{{ form.username }}<br>
    {{ form.password.label }}{{ form.password }}<br>
    {{ form.password2.label }}{{ form.password2 }}<br>
    {{ form.input }}<br>
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
</form>
</body>
</html>

app.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from imp import reload
from flask import Flask, render_template, request, flash
# 导入wtf扩展的表单类
from flask_wtf import FlaskForm

# 导入自定义表单需要的字段
from wtforms import SubmitField, StringField, PasswordField

# 导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired, EqualTo

# # 解决编码问题
# import sys
# reload(sys)

app = Flask(__name__)
app.config['SECRET_KEY'] = 'zstar'


# 自定义表单类,文本字段、密码字段、提交按钮
# 需要自定义一个表单类
class RegisterForm(FlaskForm):
    username = StringField('用户名:', validators=[DataRequired()])
    password = PasswordField('密码:', validators=[DataRequired()])
    password2 = PasswordField('确认密码:', validators=[DataRequired(), EqualTo('password', '密码输入不一致')])
    input = SubmitField('提交')


# 定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route('/form', methods=['GET', 'POST'])
def form():
    register_form = RegisterForm()

    if request.method == 'POST':
        # 调用validate_on_submit方法, 可以一次性执行完所有的验证函数的逻辑
        if register_form.validate_on_submit():
            # 进入这里就表示所有的逻辑都验证成功
            username = request.form.get('username')
            password = request.form.get('password')
            password2 = request.form.get('password2')
            print(username)
            return 'success'
        else:
            flash('参数有误')

    return render_template('index.html', form=register_form)


if __name__ == '__main__':
    # 启动WEB服务器
    app.run()

代码说明: 使用WTF表单方式的好处是对于密码一致性的不再需要单独进行验证,而是在后端直接将表单封装了成了一个类。 其中,StringField指定了表单提交的数据类型为String,DataRequired表明该项为必填项,EqualTo封装了两个表单的一致性比较过程,最后调用register_form.validate_on_submit来一次性提交所有的验证逻辑。 前端方面,通过form可以直接对接到后端定义的表单属性,其中python2需要添加 {{ form.csrf_token() }}来指定表单的token,在python3版本中,实测不需要该语句也能运行。

WTForms支持的HTML标准字段有下面这些:

字段对象

说明

StringField

文本字段

TextAreaField

多行文本字段

PasswordField

密码文本字段

HiddenField

隐藏文件字段

DateField

文本字段,值为datetime.date文本格式

DateTimeField

文本字段,值为datetime.datetime文本格式

IntegerField

文本字段,值为整数

DecimalField

文本字段,值为decimal.Decimal

FloatField

文本字段,值为浮点数

BooleanField

复选框,值为True和False

RadioField

—组单选框

SelectField

下拉列表

SelectMutipleField

下拉列表,可选择多个值

FileField

文件上传字段

submitField

表单提交按钮

FormField

把表单作为字段嵌入另—个表单

FieldList

—组指定类型的字段

WTForms常用验证函数:

验证函数

说明

DataRequired

确保字段中有数据

EqualTo

比较两个字段的值,常用于比较两次密码输入

Length

验证输入的字符串长度

NumberRange

验证输入的值在数字范围内

URL

验证URL

AnyOf

验证输入值在可选列表中

NoneOf

验证输入值不在可选列表中

数据库

在flask中,可以利用SQLAlchemy来进行数据库的操作。

SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。

flask-sqlalchemy安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install flask-sqlalchemy
pip install mysqlclient

直接安装mysqlclient可能会安装失败,我去官网下了轮子: mysqlclient-1.4.6-cp37-cp37m-win_amd64:https://pan.baidu.com/s/1TiLRPUWjQc8HS7ELlGcxHw?pwd=8888

安装mysql

安装mysql可以参阅这篇博文:Windows10安装MySQL傻瓜式教程(图文教程)

使用下面的命令可以启动/停止mysql服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 停止mysql服务
net stop mysql57 
# 启动mysql服务
net start mysql57

安装好之后,可以通过Navicat连接本地数据库进行可视化:

使用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


class Config(object):
    """配置参数"""
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql://root:你的密码@127.0.0.1:3306/zstar"

    # 设置sqlalchemy自动更跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = True

    # 查询时会显示原始SQL语句
    app.config['SQLALCHEMY_ECHO'] = True


# 连接数据库
app.config.from_object(Config)

# 创建数据库aqlalchemy工具对象
db = SQLAlchemy(app)


class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    user = db.relationship('User', backref='role')


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True, index=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))


@app.route("/")
    # 第一种查询方式
    from sqlalchemy import text
    sql = text("select * from roles")
    result = db.engine.execute(sql)
    for row in result:
        print(row)
    # 第二种查询方式
    # print(Role.query.all())
    # print(Role.query.filter_by(id=2).first())

@app.route("/create")
def create():
    role1 = Role(name="admin")
    # session记录对象任务
    db.session.add(role1)
    # 提交任务到数据库中
    db.session.commit()
    return "The Role is created"

# 创建表:
# db.create_all()

# 删除表
# db.drop_all()


if __name__ == '__main__':
    app.run()

本例中,首先需要手动创建数据库zstar,然后配置数据库连接ip和账号密码mysql://root:你的密码@127.0.0.1:3306/zstar,之后使用db.create_all()会创建前面定义出的数据表,同理db.drop_all()会删除前面定义出的数据表。这两句实测必须放在if __name__ == '__main__':外面,否则不会被运行,未知具体原因。

本例中,我定义了两个接口,第一个根目录接口,分别尝试了通过sql来从直接查询和调用对象进行查询的两种查询方式,第二个/create接口,实现了向数据表Role中插入一个名称为admin的用户数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
小记 - Flask基础
Web表单是Web程序的基本功能,它是HTML页面中负责数据采集的部件。表单中有三部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
Naraku
2021/07/29
3K0
小记 - Flask基础
Python Flask 学习笔记 —— 三(Flask 扩展学习 )
设想有这样一个情景,我们需要实现一个简单的登录功能,用户需要输入账号,密码,以及确认密码,服务器后台验证账号密码是否合理,合理的话,就登录成功,提示登录成功!不成功的话,就通过消息闪现告诉用户哪里出错了
Gorit
2021/12/08
1.1K0
Python Flask 学习笔记 —— 三(Flask 扩展学习 )
【一周掌握Flask框架学习笔记】Template模板Html页面编写
在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。
天道Vax的时间宝藏
2021/08/11
2.7K0
玩了下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
使用flask框架实现简单的图书管理(python 3.8)
flask是轻量级的web框架。 浏览器作为client发出HTTP请求,而web服务器负责处理逻辑,而flask帮助我们完成了安全性和数据流的控制,让我们只用关注于业务逻辑本身,避免重复造轮子
用户7886150
2020/12/30
7380
Flask web表单 Flask-WTF表单扩展
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
Devops海洋的渔夫
2019/12/19
2.3K0
flask构建AI网站(后端基础)
2、会泄露Web应用的绝对路径,及Python解释器的路径(可以配合写文件漏洞向指定目录的文件内写入构造好的恶意代码,利用方式可以参考安全客的这篇文章:文件解压之过 Python中的代码执行)
用户6841540
2025/03/24
1690
Flask框架入门与实战:从基础应用到数据库集成
文章链接:https://cloud.tencent.com/developer/article/2465456
一键难忘
2024/11/14
3000
Flask表单之WTForms和flask-wtf
Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。还有其它一些功能:CSRF保护,文件上传等。
菲宇
2020/08/11
4.2K0
Python Web开发:构建动态Web应用
Python已经成为一门流行的编程语言,广泛用于Web开发。它提供了众多优秀的框架和库,使得构建强大的Web应用变得更加容易。本文将深入介绍Python Web开发的基本原理,包括使用Flask框架创建一个简单的Web应用,并展示如何处理路由、模板、表单和数据库。
海拥
2023/09/19
5320
Python Web开发:构建动态Web应用
Flask 系列之 FlaskForm
首先,我们在 todolist 目录中创建一个 forms.py 文件,定义一个注册的表单类, 用于完成用户注册。示例代码如下所示:
py3study
2020/01/16
1.5K0
Flask 系列之 FlaskForm
Flask 系列之 LoginManag
通过使用 flask-login 进行会话管理的相关操作,并完成用户合法性登陆和退出。
py3study
2020/01/16
4730
Flask模板
在模板中{{ variable }}结构表示变量,是一种特殊的占位符,告诉模板引擎这个位置的值,从渲染模板时使用的数据中获取;Jinja2除了能识别基本类型的变量,还能识别{};
py3study
2020/01/16
2.7K0
大白话说Python+Flask入门(三)
我能想到的是,大概率是这部分知识,应该是超出了我现在的水平了,也就是说我存在知识断层了,整体感觉真的是一知半解。
软件测试君
2023/11/23
2750
大白话说Python+Flask入门(三)
Python Flask 入门指南
Python Flask 是一种基于 Python 的微框架,它提供了一种简单而灵活的方式来构建 Web 应用程序。本篇文章将介绍 Flask 的基本概念、安装和配置、路由、模板、表单、数据库以及部署等方面的内容。
疯狂的KK
2023/03/17
2.5K0
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
在 Web 应用中,连接数据库是一项基本任务,而用户登录功能是很多应用的核心部分。本文将演示如何使用 Flask 框架连接数据库,并实现一个简单的用户登录功能。将创建一个名为 user 的数据库表,其中包含账号、密码和名字字段。还将实现一个登录页面,以及登录成功后跳转到的页面,显示用户姓名。
GeekLiHua
2025/01/21
1740
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
Flask 入门系列教程(四)
在 WEB 应用当中,表单是和用户交互的最常见的方式之一,学习好表单,是非常重要的,用户登录注册、撰写文章等等操作都离不开表单的功能。表单的处理并不简单,除了要创建表单,还需要做相关的验证,还有错误提示等等。这些操作如果都从头开始编写,那么就太复杂了,不过幸运的是,我们有强大的 WTForms 帮助我们解决。
周萝卜
2020/10/10
1.4K0
Flask 入门系列教程(四)
小白学Flask第九天| 看看模板的那些事(一)
在Flask当中的模板被称为Jinja2模板,那么我们怎么去使用模板呢?大家可以看到下面两块代码:
Python进击者
2019/09/19
5480
小白学Flask第九天| 看看模板的那些事(一)
从头搭建一个在线聊天室(三)
随着我们项目功能越来越多,把所有的逻辑代码都写在一个文件里已经不太合适了,下面就通过 flask 的工厂模式,把项目代码拆分开。
周萝卜
2019/07/17
2.1K0
从头搭建一个在线聊天室(三)
Flask 自定义模型类
模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库。
Devops海洋的渔夫
2020/01/15
1.7K0
Flask 自定义模型类
相关推荐
小记 - Flask基础
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • Flask简介
  • Flask安装
  • 基本框架
  • 路由请求方式限定
  • 路由传递参数
  • Jinja2模板引擎
    • 简单使用
    • 注释
    • 变量/控制语句
  • 过滤器
    • 字符串操作
    • 列表操作
    • 语句块过滤
  • Flask-WTF表单
    • 普通方式
    • WTF表单方式
  • 数据库
    • flask-sqlalchemy安装
    • 安装mysql
    • 使用示例
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档