flask基础知识点

1.GET/POST

常用响应逻辑
响应对象 return response # 返回自定义的响应对象
返回JSON return jsonify(json_dict)
重定向 return redirect(‘http://www.itheima.com’)
url_for
自定义状态码本质仍是包装为Reponse对象 return ‘状态码为 666’, 666
cookie

session

请求钩子

SCSRF
二. CSRF CSRF:
跨站请求伪造, 是一种常见的攻击网站的方式 是一种针对状态保持的攻击形式

  1. CSRF的攻击过程 (重点) 黑客网站会使用表单的隐藏字段来发起跨站请求 浏览器会执行该跨站请求, 并自动携带cookie到指定的路由, 由于cookie中保存了当前用户的 sid, 所以可以通过免密码验证, 直接实现转账处理
  2. CSRF保护 生成随机令牌, 派发到cookie和表单中 在提交表单时, 验证cookie和表单中保存的令牌是否一致

ORM

创建表
db.create_all()

删除表
db.drop_all()

插入一条数据
user = User(name=‘zs’)
db.session.add(user)
db.session.commit()

查询所有用户数据
User.query.all()

查询有多少个用户
User.query.count()

查询第1个用户
User.query.first()

查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).all()
User.query.filter(User.id==4).all()

查询名字结尾字符为g的所有用户[开始 / 包含]
User.query.filter(User.name.endswith(“g”)).all()
User.query.filter(User.name.startswith(“g”)).all()
User.query.filter(User.name.contains(“g”)).all()

查询名字和邮箱都以li开头的所有用户[2种方式]
User.query.filter(User.name.startswith(“li”), User.email.startswith(“li”)).all()
User.query.filter(and_(User.name.startswith(“li”), User.email.startswith(“li”))).all()

查询age是25 或者 emailitheima.com结尾的所有用户
User.query.filter(or_(User.name.startswith(“li”), User.email.startswith(“li”))).all()

查询名字不等于wang的所有用户[2种方式]
User.query.filter(not_(User.name==“wang”)).all()
User.query.filter(User.name!=“wang”).all()

查询id为[1, 3, 5, 7, 9]的用户
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()

所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个
User.query.order_by(User.age, User.id.desc()).limit(5)

分页查询, 每页3个, 查询第2页的数据
pn = User.query.paginate(2, 3)
pn.items pn.page pn.pages

多表关系
一对多

class User(db.Model): # 一个用户对应多个收货地址 一的一方
tablename = “users”
# 定义类属性 记录字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
addresses = db.relationship(“Address”, backref=“user”)

class Address(db.Model): # 多的一方
tablename = “addresses”
id = db.Column(db.Integer, primary_key=True)
detail = db.Column(db.String(64))
user_id = db.Column(db.Integer, db.ForeignKey(“users.id”)) # 在多的一方设置外键

数据显示&表单添加

数据显示
定义路由函数,并将 Author 数据传到模板
@app.route(’/’, methods=[‘GET’, ‘POST’])
def index():
# 如果是GET请求
if request.method == ‘GET’:
authors = Author.query.all() # type: list[Author]
return render_template(“book_test.html”, authors=authors)
模版关键代码

    {% for author in authors %}
  • {{ author.name }}
    • {% for book in author.books %}
    • {{ book.name }}
    • {% endfor %}
    {% endfor %}
表单添加

定义表单类



实际操作顺序: 1.python 文件 db init 2.python 文件 db migrate -m"版本名(注释)" 3.python 文件 db upgrade 然后观察表结构 4.根据需求修改模型 5.python 文件 db migrate -m"新版本名(注释)" 6.python 文件 db upgrade 然后观察表结构 7.若返回版本,则利用 python 文件 db history查看版本号 8.python 文件 db downgrade(upgrade) 版本号 蓝图 蓝图/Blueprint对象用起来和一个应用/Flask对象差不多,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效 使用蓝图可以分为三个步骤 1,创建一个蓝图对象 admin=Blueprint('admin',__name__)

2,在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器
@admin.route(’/’)
def admin_home():
return ‘admin_home’

3,在应用对象上注册这个蓝图对象
app.register_blueprint(admin,url_prefix=’/admin’)

当这个应用启动后,通过/admin/可以访问到蓝图中定义的视图函数

注册静态路由
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_admin目录设置为静态目录
admin = Blueprint(“admin”,name,static_folder=‘static_admin’)
app.register_blueprint(admin,url_prefix=’/admin’)

现在就可以使用/admin/static_admin/ 访问static_admin目录下的静态文件了 定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。下面的示例将为 static_admin 文件夹的路由设置为 /lib
admin = Blueprint(“admin”,name,static_folder=‘static_admin’,static_url_path=’/lib’)
app.register_blueprint(admin,url_prefix=’/admin’)
设置模版目录
蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录
admin = Blueprint(‘admin’,name,templat

NoSQL:一类新出现的数据库(not only sql)
泛指非关系型的数据库
nosq一般可以存储多种数据类型, 除了基本类型(数字、字符串、日期),还可以存储json、html等文件类型
数据以键值方式存取, 不能像关系型数据库一样使用外键建立表之间的关系, 不适合用于关系特别复杂的数据查询场景
每种nosql数据库都有自己的api和语法, 不支持SQL语法
“事务”的支持:sql对事务的支持非常完善,而nosql基本不支持事务

NoSQL中的产品种类相当多, 各有自己擅长的业务场景:

Mongodb
Redis
Hbase hadoop
Cassandra hadoop
Redis 优势
性能极高 – 内存型数据库,读写速度极快
丰富的数据类型 – 支持存储 Strings, Lists, Hashes, Sets 及 Ordered Sets 等多种数据类型。
原子性 – Redis的所有操作都是原子性的,并且支持事务 (不支持回滚)。
数据持久化 – 可以将内存数据保存到磁盘中, 并提供多种存储机制。
数据备份 – 支持主从模式 (master - slave) 的数据备份。
集群 – 支持集群, 并实现了哨兵机制。
丰富的特性 – 设置过期时间, 发布/订阅, 通知等机制。
Redis应用场景
session存储 (性能更好, 方便设置过期时间)
购物车 (以请求令牌token作为key,记录当前用户购物车中的商品及其数量)
网页缓存 (将 请求的url/返回的网页内容 作为redis的key/value进行缓存)
实时排行 (利用zset的数据权重分析数据排行, 按排名展示数据

redis集群
分类
软件层面
硬件层面
软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。

硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。

搭建集群
当前拥有两台主机172.16.179.130、172.16.179.131,这⾥的IP在使⽤时要改为实际值
参考阅读
redis集群搭建 http://www.cnblogs.com/wuxl360/p/5920330.html
[Python]搭建redis集群 http://blog.5ibc.net/p/51020.html

猜你喜欢

转载自blog.csdn.net/qq_43030934/article/details/83350941