Flask基础

作者: Recalcitrant | 来源:发表于2019-08-07 12:01 被阅读4次

    目录
    一、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', 参数字典)
    

    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
    

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

    相关文章

      网友评论

        本文标题:Flask基础

        本文链接:https://www.haomeiwen.com/subject/rqvbdctx.html