zoukankan      html  css  js  c++  java
  • 深入理解flask 笔记

    ===sqlalchemy创建的数据模型中:
    1 字段是属性   【模型中定义的字段是类属性,表单中定义的字段也是类字段

    2 若数据库不支持bool类型,则sqlalchemy会自动将bool转成0和1

    3 若不显示指明表名,则表名为模型名的小写

    4 sqlalchemy默认的__init__会将定义的类属性作为__init__的关键字参数

    ===查询语句:User是名,不是实例名

    1 User.query.all()

    2 User.query.limit(10).all()

    3 User.query.order_by(User.age).all()

    3 User.query.order_by(User.age.desc()).all()

    3 User.query.first()

    3 通过主键获取一行数据:User.query.get()

    3 过滤:filter 和filter_by,但filter_by只能查找确切值:User.query.filter_by(username='haha').all()    User.query.filter(User.username='haha').all()   

    filter 还支持 in_ or_ not_

    db.session.query(func.count(Gift.id), Gift.isbn).filter(
    Gift.launched == False,
    Gift.isbn.in_(isbn_list),
    Gift.status == 1).group_by(
    Gift.isbn).all()

    3 add、delete和update都要commit,查询不需要

     delete 要先查询出再删

    user = User.query.first()

    db.session.delete(user)

    db.session.commit()

    增加记录:

    user = User()
    db.session.add(user)
    db.session.commit()

    ===模型关系

    一对多时,外键在多的那一方

    uid = Column(Integer, ForeignKey('user.id'), nullable=False) #user是表名,id是表中的字段

     综上,ForeignKey里的是表名,relationship里的是类名  

    =====db.session.commit帮我们实现了事务

    ======Jinja模板中的变量可以是任意python对象,只要他能被python的str()方法转换成一个字符串

    =======

    {%if   %}  if里可以有过滤器

    {% else %}

    {% endif %}

    ======

    {%for   a in b %}   循环内有个特殊 变量 loop,获取循环的一些信息,如迭代次数

    {% endfor %}

    =====for 和 if 嵌套

    Jinja2 还支持。宏类似于 Python 代码中的函数

     需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中, 以避免重复:
    {% include 'common.html' %}
    另一种重复使用代码的强大方式是模板继承,它类似于 Python 代码中的类继承

    block 标签定义的元素可在衍生模板中修改

    ====

    若url_for中的url带参数,可以通过关键字参数的形式传入url_for:url_for('web.book_detail', isbn=current_gift.isbn)

    ==============

    jinja对Flask提供的特有支持:request、config、session、url_for 、get_flashed_messages()、g

    =========Bootstrap是一些列CSS样式的集合

    get_or_404  first_or_404

    ============

    字段检查器都可以接受一个message参数,表示检测没通过时返回的信息

    ==========从flask_wtf中import的form才有validate_on_submit这个方法,从wtforms引入的form没有此方法

    form.validate_on_submit() 会1)判断请求是否为post请求2)字段是否通过校验

    ===========

     g对象保存每个特定请求的临时数据,是线程安全的,请求结束时,这个对象就销毁了

    ==========

    通常abort和errorhandler一起用,abort返回一个http错误码,errorhandler处理这个错误码

    errorhandler可以接收多个错误码

    =========类视图函数的定义  MethodView

    ======

    from flask_restful import reqparse
    self.paser = reqparse.RequestParser() #参数解析器
    self.paser.add_argument('wfids',required=True,location=['args','headers']) #从URL参数中或HTTP请求头中找出wfids变量
    args = self.paser.parse_args()  #获取参数的解析结果
    =========
    在return语句中,若返回的是一个元组,第2个内容作为http状态码,还可以用字典作为第3个参数,表示响应头内容
    =========

    通过curl发送get请求:curl http://localhost:5000/api/post/1
    发送post请求:curl -d "title=HAHA" -d "tag=python" http://localhost:5000/api/post

    curl中使用-X来创建put请求 curl -X PUT -d "tile=haha" -d "token=***" http://localhost:5000/api/post/110

    =========

    对于api,为了进行身份认证,可以使用token,token通常都设过期时间,这样即使token被窃取了也只能用一段时间

    from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
    def generate_token(self, expiration=600):  #生成token
            s = Serializer(secret_key=current_app.config['SECRET_KEY'], expires_in=expiration)
            return s.dumps({'id': self.id}).decode('utf-8')
    #######解析token
    def parse_token(token): s
    = Serializer(secret_key=current_app.config['SECRET_KEY']) try: data = s.loads(token.encode('utf-8')) except: return False uid = data.get('id')

    =========

    sql 优势:支持事务(持久性、隔离性、原子性、一致性)
    劣势:慢(postgre其实也不慢)、可扩展性差(不能把数据拆分到多个库,如A-H的存入一个库,I-P的存入一个库,因为join需要获取整张表的数据)

    nosql:劣势:不支持事务
    优势:快(不用调优就很快)、可扩展、无固定表结构

    BJSON是二进制json,允许把json存为二级制格式,而不是字符串,这样能节省大量空间

    =================

  • 相关阅读:
    ping与telnet的区别
    TCP连接的建立与关闭
    网络的7层协议
    oracle数据库中,分天查询数目
    求某个字符在字符串中的第5个位置
    高精度乘
    高精度加法
    二叉排序树(建树,先序,中序,后序遍历)
    求哈夫曼树的带权路径长度和
    HDU_1237_简单计算器
  • 原文地址:https://www.cnblogs.com/testzcy/p/11803691.html
Copyright © 2011-2022 走看看