Flask基础

目录
一、Flask基础
二、数据库连接配置
三、模板
四、表单
五、数据库

Flask框架

一、Flask基础

1.初始化(创建工程)

直接使用PyCharm创建Flask工程或者使用以下步骤:

(1)安装flask库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask

(2)安装flask-sqlalchemy库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask-sqlalchemy

(3)创建应用文件

app.py

from flask import Flask
app = Flask(__name__)


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

2.定义路由及视图函数

@app.route('/路由路径')
def 视图函数名(参数列表):
    业务逻辑处理代码
    return render_template/url_for/...

3.启动服务器

(1)直接运行

直接运行app.py

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

(2)命令行

  • 只允许本地访问
...\> set FLASK_APP=app.py
...\> flask run
  • 允许跨域访问
...\> set FLASK_APP=app.py
...\> flask run --host=0.0.0.0

--host 参数告诉 Web 服务器在哪个网络接口上监听客户端发来的连接。默认情况 下,Flask 的 Web 开发服务器监听 localhost 上的连接,因此服务器在默认情况下只接受运行服务器的计算机发送的连接。

二、数据库连接配置

(1)定义数据库表Model类

class 模型名(db.Model):
    # 主键ID
    id = db.Column(db.Integer, primary_key=True)
    # 字段1
    字段1 = db.Column(db.字段数据类型)
    # 字段2
    字段2 = db.Column(db.字段数据类型)
    .........

    def __init__(self, 字段1, 字段2):
        self.字段1 = 字段1
        self.字段2 = 字段2
        .........

(2)创建sqlite数据库

配置sqlite数据库

app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

在Python shell控制台下

...\> flask shell
>>> from 应用名 import db
>>> db.create_all()

三、模板

1.使用模板

  • 1.在 templates 文件夹下创建html模板文件。
  • 2.从 flask 中导入 render_template 函数。
  • 3.在视图函数中,使用 render_template 函数,渲染模板(只需要填写模板的名字,不需要填写 templates 这个文件夹的路径)。
from flask import Flask, render_template
app = Flask(__name__)


@app.route('/路由路径')
def 视图函数名(参数列表):
    业务逻辑处理代码
    return render_template('模板文件名.html', 参数字典)

模板中使用的参数将由render_template的参数字典传入。

2.模板语法

(1)if分支结构

{% if 表达式 %}
    ......
{% elif 表达式 %}
    ......
{% else %}
    ......
{% endif %}

(2) for循环遍历列表和字典

{% for 变量 in 可迭代对象 %}
    迭代渲染内容
{% endfor %}

(3)过滤器

{{ 变量|过滤器 }}

常用过滤器

  • 1.default
{{ 变量|default:替代值 }}

如果当前变量没有值,则会使用参数中的值来代
替。

  • 2.length
    返回一个序列或者字典的长度。
  • 3.escape
    转义字符,会将<、>等符号转义成HTML中的符号。
  • 4.truncate
    :截取length长度的字符串。

(4)继承

{% extends '模板名' %}
{% block 块名 %}
    渲染内容
{% endblock %}

3.使用Flask-Bootstrap集成Bootstrap

(1)使用Flask-Bootstrap

  • 1.安装Flask-Bootstrap框架扩展
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask-bootstrap
  • 2.初始化 Flask-Bootstrap(注册应用扩展)
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap(app)

(2)url_for

url_for(视图函数名称)

可根据视图函数名生成路径。

(3)加载静态文件

url_for('static',filename='路径')

四、表单

1.配置

(1)安装Flask-WTF 框架扩展

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask-wtf

(2)配置秘钥

app.config['SECRET_KEY'] = '秘钥'

(3)导入库

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

2.表单类

class 表单名Form(FlaskForm):
    字段名 = StringField("标签名", validators=[DataRequired()])
    submit = SubmitField("Submit")

WTForms支持的HTML标准字段

字段类型 说明
BooleanField 复选框,值为True和False
DateField 文本字段,值为datetime.date格式
DateTimeField 文本字段,值为datetime.datetime格式
DecimalField 文本字段,值为decimal.Decimal
FileField 文件上传字段
HiddenField 隐藏的文本字段
MultipleFileField 多文件上传字段
FieldList 一组指定类型的字段
FloatField 文本字段,值为浮点数
FormField 把一个表单作为字段嵌入另一个表单
IntegerField 文本字段,值为整数
PasswordField 密码文本字段
RadioField 一组单选按钮
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
SubmitField 表单提交按钮
StringField 文本字段
TextAreaField 多行文本字段

WTForms验证函数

验证函数 说明
DataRequired 确保转换类型后字段中有数据
Email 验证电子邮件地址
EqualTo 比较两个字段的值;常用于要求输入两次密码进行确认的情况
InputRequired 确保转换类型前字段中有数据
IPAddress 验证IPv4网络地址
Length 验证输入字符串的长度
MacAddress 验证MAC地址
NumberRange 验证输入的值在数字范围之内
Optional 允许字段中没有输入,将跳过其他验证函数
Regexp 使用正则表达式验证输入值
URL 验证URL
UUID 验证UUID
AnyOf 确保输入值在一组可能的值中
NoneOf 确保输入值不在一组可能的值中

3.渲染

模板

<form>
    {{ form.hidden_tag() }}
    {{ form.name.label }} {{ form.name(id='', class='', title='') }}
    {{ form.submit() }}
</form>

五、数据库

1.配置数据库

(1)安装Flask-SQLAlchemy框架扩展

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask-sqlalchemy

(2)配置FLask-SQLAlchemy数据库URL

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost:3306/数据库名'
数据库引擎 URL
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite(Linux,macOS) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database

2.编写模型

class 模型名(db.Model):
    __tablename__ = '表名'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    字段1 = db.Column(db.字段类型, unique, nullable, default)
    字段2 = db.Column(db.字段类型, unique, nullable, default)
    .........
    关系字段1 = db.relationship('关联模型', backref='反向引用名')
    关系字段2 = db.relationship('关联模型', backref='反向引用名')
    .........

    def __repr__(self):
        return '模型名({})'.format(self.字段)

示例:

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return 'Role({})'.format(self.name)


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return 'User({})'.format(self.username)

常用的SQLAlchemy列类型

类型名 Python类型 说明
Integer int 普通整数,通常是32位
SmallInteger int 取值范围小的整数,通常是16位
BigInteger int或long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode字符串
UnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何Python对象 自动使用Pickle序列化
LargeBinary str 二进制blob

常用的SQLAlchemy列选项

选项名 说明
primary_key 如果设为True,列为表的主键
unique 如果设为True,列不允许出现重复的值
index 如果设为True,为列创建索引,提升查询效率
nullable 如果设为True,列允许使用空值;如果设为False,列不允许使用空值
default 为列定义默认值

3.模型关系

常用的SQLAlchemy关系选项

选项名 说明
backref 在关系的另一个模型中添加反向引用
primaryjoin 明确指定两个模型之间使用的联结条件;只在模棱两可的关系中需要指定
lazy 指定如何加载相关记录,可选值有select(首次访问时按需加载)、immediate(源对象加载后就加载)、joined(加载记录,但使用联结)、subquery(立即加载,但使用子查询),noload(永不加载)和dynamic(不加载记录,但提供加载记录的查询)
uselist 如果设为False,不使用列表,而使用标量值
order_by 指定关系中记录的排序方式
secondary 指定多对多关系中关联表的名称
secondaryjoin SQLAlchemy无法自行决定时,指定多对多关系中的二级联结条件

4.数据库操作

(1)创建表

...\> flask shell
>>> from 应用名 import db
>>> db.create_all()

(2)增删改查

①插入记录

示例:

  • 1.在内存中创建对象
...\> flask shell
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john', role=admin_role)
>>> user_susan = User(username='susan', role=user_role)
>>> user_david = User(username='david', role=user_role)
  • 2.加入数据库会话并提交
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
>>> db.session.commit()

>>> db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])
>>> db.session.commit()

②更新记录

示例:

>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()

注意:不允许修改id的值。

③删除记录

示例:

>>> db.session.delete(mod_role)
>>> db.session.commit()

④查询

模型名.query.filter_by(过滤器).执行方法()
  • 查看生成的SQL语句
str(模型名.query.filter_by(过滤器))

示例:


常用的SQLAlchemy查询过滤器

过滤器 说明
filter() 把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上,返回一个新查询
limit() 使用指定的值限制原查询返回的结果数量,返回一个新查询
offset() 偏移原查询返回的结果,返回一个新查询

常用的SQLAlchemy查询执行方法

方法 说明
all() 以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果没有结果,则返回None
first_or_404() 返回查询的第一个结果,如果没有结果,则终止请求,返回404错误响应
get() 返回指定主键对应的行,如果没有对应的行,则返回None
get_or_404() 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应
count() 返回查询结果的数量
paginate() 返回一个Paginate对象,包含指定范围内的结果

(3)删除表

...\> flask shell
>>> from 应用名 import db
>>> db.delete_all()

5.数据库迁移

(1)安装Flask-Migrate框架扩展

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask-migrate

(2)创建迁移仓库

  • 1.注册
from flask_migrate import Migrate
migrate = Migrate(app, db)
  • 2.初始化
...\> flask db init

(3)执行迁移命令

...\> flask db migrate
...\> flask db upgrade

警告:可能导致数据丢失!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342