问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何学习flask

发布网友 发布时间:2022-04-23 05:28

我来回答

5个回答

懂视网 时间:2022-05-01 09:58

flask-sqlalchemy

使用URL制定数据库

数据库引擎 URL
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite(Unix) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database

SQLite 数 据 库 不 需 要 使 用 服 务 器, 因 此 不 用 指 定 hostname 、 username 和 password 。URL 中的 database 是硬盘上文件的文件名。

  • 配置
    程序使用的数据库 URL 必须保存到 Flask 配置对象的 SQLALCHEMY_DATABASE_URI 键中
  • 配置对象中还有一个很有用的选项,即 SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True时,每次请求结束后都会自动提交数据库中的变动

    from flask.ext.sqlalchemy import SQLAlchemy
    basedir = os.path.abspath(os.path.dirname(__file__))
    app = Flask(__name__)
    app.config[‘SQLALCHEMY_DATABASE_URI‘] =‘sqlite:///‘ + os.path.join(basedir, ‘data.sqlite‘)
    app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True
    db = SQLAlchemy(app)
  • 定义模型
  • class Role(db.Model):
     __tablename__ = ‘roles‘#__tablename__ 定义在数据库中使用的表名
     id = db.Column(db.Integer, primary_key=True)#primary_key如果设为 True ,这列就是表的主键.如果没有定义 __tablename__ ,SQLAlchemy 会使用一个默认名字
     name = db.Column(db.String(64), unique=True)
     def __repr__(self):
     return ‘<Role % r>‘ % self.name
    class User(db.Model):
     __tablename__ = ‘users‘
     id = db.Column(db.Integer, primary_key=True)
     username = db.Column(db.String(64), unique=True, index=True)
     def __repr__(self):
     return ‘<User % r>‘ % self.username

    __repr__&__str__

    最常用的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 二进制文件

    最常使用的SQLAlchemy列选项

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

    关系表达

    关系型数据库使用关系把不同表中的行联系起来。

  • 一对多
  • class Role(db.Model):
     # ...
     users = db.relationship(‘User‘, backref=‘role‘)#添加到 Role 模型中的 users 属性代表这个关系的面向对象视角。对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列表。db.relationship() 的第一个参数表,如果模型类尚未定义,可使用字符串形式指定。db.relationship() 中的 backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。这一属性可替代 role_id 访问 Role 模型,此时获取的是模型对象
    class User(db.Model):
     # ...
     role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘))#关系使用 users 表中的外键连接了两行。添加到 User 模型中的 role_id 列被定义为外键,就是这个外键建立起了关系。传给 db.ForeignKey() 的参数 ‘roles.id‘ 表明,这列的值是 roles 表中行的 id 值。

    db.relationship() 都能自行找到关系中的外键,但有时却无法决定把哪一列作为外键。如果 User 模型中有两个或以上的列定义为 Role 模型的外键,SQLAlchemy 就不知道该使用哪列。如果无法决定外键,你就要为 db.relationship() 提供额外参数,从而确定所用外键

    常用的SQLAlchemy关系选项

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

  • 多对多

  • tags = db.Table(‘tags‘,
     db.Column(‘tag_id‘, db.Integer, db.ForeignKey(‘tag.id‘)),
     db.Column(‘page_id‘, db.Integer, db.ForeignKey(‘page.id‘))
    )
    
    class Page(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     tags = db.relationship(‘Tag‘, secondary=tags,
     backref=db.backref(‘pages‘, lazy=‘dynamic‘))
    
    class Tag(db.Model):
     id = db.Column(db.Integer, primary_key=True)

    数据库操作

  • 创建表
  • python hello.py shell
    >>> from hello import db
    >>> db.create_all()
  • 删除表
  • db.drop_all()
  • 插入行
  • #创建对象,模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。
    admin_role = Role(name=‘Admin‘)
    user_role = Role(name=‘User‘)
    user_susan = User(username=‘susan‘, role=user_role)#role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。
    user_john = User(username=‘john‘, role=admin_role)
    #这些新建对象的 id 属性并没有明确设定,因为主键是由 Flask-SQLAlchemy 管理的。
    print(admin_role.id)#None
    #通过数据库会话管理对数据库所做的改动,在 Flask-SQLAlchemy 中,会话由 db.session 表示。
    ##首先,将对象添加到会话中
    db.session.add(admin_role)
    db.session.add(user_role)
    db.session.add(user_susan)
    db.session.add(user_john)
    #简写:db.session.add_all([admin_role, user_role, user_john, user_susan])
    ##通过提交会话(事务),将对象写入数据库
    db.session.commit()

    会话提交

    数据库会话能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据库。如果在写入会话的过程中发生了错误,整个会话都会失效。
    数据库会话也可 回滚 。调用 db.session.rollback() 后,添加到数据库会话中的所有对象都会还原到它们在数据库时的状态。

  • 修改行
  • admin_role.name = ‘Administrator‘
    db.session.add(admin_role)
    session.commit()
  • 删除行
  • db.session.delete(mod_role)
    session.commit()
  • 查询行

  • 查询全部。Role.query.all()
  • 条件查询(使用过滤器)。User.query.filter_by(role=user_role).all()
  • user_role = Role.query.filter_by(name=‘User‘).first()#filter_by() 等过滤器在 query 对象上调用,返回一个更精确的 query 对象。

    常用过滤器

    过滤器 说 明
    filter() 把过滤器添加到原查询上,返回一个新查询
    filter_by() 把等值过滤器添加到原查询上,返回一个新查询
    limit() 使用指定的值限制原查询返回的结果数量,返回一个新查询
    offset() 偏移原查询返回的结果,返回一个新查询
    order_by() 根据指定条件对原查询结果进行排序,返回一个新查询
    group_by() 根据指定条件对原查询结果进行分组,返回一个新查询

    最常使用的SQLAlchemy查询执行函数

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

    
    #执行 user_role.users 表达式时,隐含的查询会调用 all() 返回一个用户列表。 query 对象是隐藏的,因此无法指定更精确的查询过滤器。
    
    users = user_role.users
    
    #修改了关系的设置,加入了 lazy = ‘dynamic‘ 参数,从而禁止自动执行查询
    
    class Role(db.Model):
    users = db.relationship(‘User‘, backref=‘role‘, lazy=‘dynamic‘)
    
    #顺序排列
    
    user_role.users.order_by(User.username).all()
  • 在视图函数中操作数据库

    @app.route(‘/‘, methods=[‘GET‘, ‘POST‘])
    def index():
     form = NameForm()
     if form.validate_on_submit():
     user = User.query.filter_by(username=form.name.data).first()
     if user is None:
      user = User(username = form.name.data)
      db.session.add(user)
      session[‘known‘] = False
     else:
      session[‘known‘] = True
     session[‘name‘] = form.name.data
     form.name.data = ‘‘
     return redirect(url_for(‘index‘))
     return render_template(‘index.html‘, form = form, name = session.get(‘name‘), known = session.get(‘known‘, False))

    修改模板

    { % extends "base.html" % }
    { % import "bootstrap/wtf.html" as wtf % }
    { % block title % }Flasky{ % endblock % }
    { % block page_content % }
     <div class="page-header">
     <h1>Hello, { % if name % }{{ name }}{ % else % }Stranger{ % endif % }!</h1>
     { % if not known % }
      <p>Pleased to meet you!</p>
     { % else % }
      <p>Happy to see you again!</p>
     { % endif % }
     </div>
     {{ wtf.quick_form(form) }}
    { % endblock % }

    集成 Python shell

    让 Flask-Script 的 shell 命令自动导入特定的对象

    from flask.ext.script import Shell
    def make_shell_context():
     return dict(app=app, db=db, User=User, Role=Role) 
    manager.add_command("shell", Shell(make_context=make_shell_context))

    make_shell_context() 函数注册了程序、数据库实例以及模型,因此这些对象能直接导入 shell

    使用 Flask-Migrate 实现数据库迁移

    创建迁移仓库

    pip install flask-migrate

    配置

    from flask.ext.migrate import Migrate, MigrateCommand
    # ...
    migrate = Migrate(app, db)
    manager.add_command(‘db‘, MigrateCommand)

    在维护数据库迁移之前,要使用 init 子命令创建迁移仓库

    python hello.py db init

    创建迁移脚本

    python hello.py db migrate -m "initial migration"

    更新数据库

    python hello.py db upgrade

    flask学习笔记(-数据库)

    标签:

    热心网友 时间:2022-05-01 07:06

    flask是烧瓶。

    烧瓶是实验室中使用的有颈玻璃器皿,用来盛液体物质。因可以耐一定的热而被称作烧瓶。烧瓶通常有平底和圆底之分,通常具有圆肚细颈的外观。 在化学实验中,试剂量较大而又有液体物质参加反应时使用的容器。

    *英文为“flask”,故也可音译为夫拉斯瓶,通常有平底和圆底之分。平底的叫做平底烧瓶,圆底的叫圆底烧瓶。

    烧瓶通常具有圆肚细颈的外观,与烧杯明显地不同。它的窄口是用来防止溶液溅出或是减少溶液的蒸发,并可配合橡皮塞的使用,来连接其它的玻璃器材。当溶液需要长时间的反应或是加热回流时,一般都会选择使用烧瓶作为容器。*开口没有像烧杯般的突出缺口,倾倒溶液时更易沿外壁流下,所以通常都会用玻棒轻触瓶口以防止溶液沿外壁流下。烧瓶因瓶口很窄,不适用玻棒搅拌,若需要搅拌时,可以手握瓶口微转手腕即可顺利搅拌均匀。若加热回流时,则可於瓶内放入磁搅拌子,以加热搅拌器加以搅拌。烧瓶随著其外观的不同可分平底烧瓶和圆底烧瓶两种。左上图为一平底烧瓶,右上图则为一圆底烧瓶。通常平底烧瓶用在室温下的反应,而圆底烧瓶则用在较高温的反应。这是因为圆底*玻璃厚薄较均匀,可承受较大的温度变化。

    烧瓶(英语:Laboratory flask)是实验室中使用的有颈玻璃器皿,用来盛液体物质。因可以耐一定的热而被称作烧瓶。 在化学实验中,试剂量较大而又有液体物质参加反应时使用的容器。烧瓶都可用于装配气体发生装置。

    平底烧瓶是实验室中使用的一种烧瓶类玻璃器皿,主要用来盛液体物质,可以轻度受热。加热时可不使用石棉网。强烈加热则应使用圆底烧瓶。

    底部为半球形,上部有一个长颈以便容物出入。在平面上立得比较稳。

    ①应放在石棉网上加热,使其受热均匀;加热时,烧瓶外壁应无水滴。

    ②平底烧瓶不能长时间用来加热。

    ③不加热时,若用平底烧瓶作反应容器,无需用铁架台固定,就可以立起来。

    主要用途:(1)液体和固体或液体间的反应器.

    (2)装配气体反应发生器(常温、加热).

    (3)蒸馏或分馏液体(用带支管烧瓶又称蒸馏烧瓶).

    使用注意事项:

    (1)注入的液体不超过其容积的2/3,不少于其体积的1/3.

    (2)加热时使用石棉网,使均匀受热.

    (3)蒸馏或分馏要与胶塞、导管、冷凝器等配套使用.蒸馏烧瓶

    一种用于液体蒸馏或分馏物质的玻璃容器。常与冷凝管、接液管、接液器配套使用。也可装配气体发生器。

    希望我能帮助你解疑释惑。

    热心网友 时间:2022-05-01 08:24

    flask是很好学的,但是如何大项目开发,其实难的不是学,而是组织,

    不防可以看下我的博客,我是刚建的,我想给这个世界留下些什么

    六把刀个人博客-Flask实战

    热心网友 时间:2022-05-01 09:58

    不需要什么基础,从懂的地方开始学,慢慢的一点一点地去学会。

    热心网友 时间:2022-05-01 11:50

    Flask框架适用于python语言,很好的web开发框架。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    华为freebuds4i切歌怎么操作_华为freebuds4i怎么切歌 华为freebuds pro切歌方法_华为freebuds pro怎么切歌 华为耳机怎么切换下一曲 欧美电影,好像是宠物有一个世界,宠物会想办法跟主人的灵魂互换占据 ...的名字,欧洲中世纪,一个王子的继母把他的灵魂和狗的灵魂互换了... 问一部外国电影的名字 剧情记得不大清楚l了 是前几年的片子 灵魂互换的... HUAWEI 华为 AGS2-W09 10.1英寸平板电脑 (香槟金、64GB+4GB、WiFi版... 诛仙3百法和千法差距大吗 微信怎么解除应用授权登录 授权应用删除方法 微信怎么解除应用授权登录授权应用删除方法 【Python基础】flask框架是用来干什么的? 微信直播连麦充费什么意思 flask框架有什么用? 如何理解Flask 跨国电商在微信开直播收取费用是真是假 【Python基础】flask是什么意思? 直播间购买东西微信支付老支付不成功什么原因? 直播间直播的时候在微信付款买的东西不给退怎么办 关于诚信的书 快手直播在微信付款违规吗 关于诚信、孝敬、立志、读书的名言警句 抖音直播微信付款可靠吗 男孩取名寓意好的字有哪些? 关于诚信的书籍 微信直播收费标准是什么? 以诚信守道德为题目得作文 男孩带水名字寓意好的有哪些? 关于我的正能量着讲诚信守道德的作文 讲诚信,守道德作文(以书信的格式) 关于《诚信》为题的800字作文范文 我购买的微信付费直播回放可以删除吗? python flask怎么读 微信直播平台的钱是先付在哪儿 Flask框架怎么样,比起Web.py有哪些不同 微信直播里付款,报警钱还要的回来吗 flask 是做什么的 微信开直播怎么向客人收钱 python flask 怎么组织程序 flask是什么意思 为什么 Flask 有那么多的好评 使用flask开发的网站有哪些 如何部署简单python + flask应用 我win7系统,有网但连不上 梦见周围都是鬼魂,自己想逃却逃不出来 梦到周围一片漆黑害怕 经常梦见周围环境特别的昏暗,看不清楚东西我努力的睁大眼睛想看清。还有... 华为mate30pro手电筒快捷键? 做梦梦见周围的楼房接二连三爆炸了是怎么回事? 榛子仁的做法大全 自己在家怎么炒榛子仁