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:
跨站请求伪造, 是一种常见的攻击网站的方式 是一种针对状态保持的攻击形式
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 或者 email
以itheima.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)
模版关键代码
定义表单类
作者名: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