Flask框架重点知识总结回顾

简介: Flask框架重点知识总结回顾

1.加载应用程序配置

加载应用程序配置有三种方式:

1/从配置对象中加载配置信息from_object

2/从配置文件中加载配置信息

3/从环境变量中加载配置信息


重点掌握第1种,在工作中,我们的项目在启动的时候,需要预先设置一些配置信息,为了方便管理,便于维护,我们将所有的配置信息,封装在一个类中,然后再进行使用,下面是代码的实现过程,大家可以看一下:

1# 1.导入Flask类
 2from flask import Flask
 3# 2.创建Flask对象接收一个参数__name__,它会指向程序所有的包
 4app = Flask(__name__)
 5# 配置对象,里面定义需要给APP添加的一系列配置
 6class Config(object):
 7    DEBUG = True
 8
 9# 从配置对象中加载配置
10app.config.from_object(Config)
11
12# 3.装饰器的作用是将路由映射到视图函数index
13@app.route("/")
14def index():
15    return 'Hello World'
16
17# 4.Flask应用程序实例的run方法,启动WEB服务器
18if __name__ == '__main__':
19    app.run()


提示: 运行测试,在修改代码之后直接保存,会自动重启服务器 通过:app.config.get('DEBUG') 可以获取到配置的信息





2.路由定义

2.1指定请求方式

methods,它有很多参数,但是我们需要掌握最常用的两个

1.GET是请求,浏览器第一次请求的时候是此get请求

2.POST是提交,这种方式更加的安全,所有的信息是打包进行提交的,我们在防止csrf攻击的时候,就是在post请求的时候,验证csrf_token

具体使用:

1@app.route('/demo',methods=['GET','POST'])
2def demo():
3   # 直接从请求中取到请求方式进行返回
4   return request.method

2.2重定向

redirect('路径')路径既可以是外链地址,又可以是视图函数的地址,是字符串的形式.(tip:在使用外链地址的时候,记得在前面加http://)


url_for('函数名',key=value)反解析,通过视图函数的名称,返回一个地址,经常配合redirect使用

1@app.route('/demo1/<int:user_id>')
2def demo1(user_id):
3   return 'hello %d' % user_id
4
5# 重定向
6@app.route('/demo5')
7def demo5():
8   # 使用url_for生成指定视图函数所对应的url
9   return redirect(url_for('demo1',user_id=100))

2.3返回json

response=jsonify(dict)

json数据其实是一个字符串,里面是一个字典,如:'{"name":"zhangsan","age":"10"}',要注意的是,json对象的属性名称和字符串必须由双引号引起来,否则会报错.


json和dict相互转换:

1# 使用之前需要导入一个类
2from flask import json
3# 1.json转换成字典
4dict = json.loads(json)
5# 2.字典转换成json
6json = json.dumps(dict)

2.4自定义状态码

response=make_response()

自定义状态码:

response.status = 200

自定义响应头:

response.headers["Content-Type"]="application/json"

自定义cookie:

response.set_cookie("name","aaa")




3.Request请求

args

是请求信息,地址栏数据 ,问号后面,如www.baidu.com?key=value&key=value

data

是json/xml等,非表单post提交的请求

form

表单post请求提交的

cookies

是存储在浏览器里面的信息

属性 说明 类型
data 记录请求的数据,并转换为字符串,非表单数据 *
args 记录请求中的查询参数 MultiDict
form 记录请求中的表单数据 MultiDict
cookies 记录请求中的cookie信息 Dict




4.请求钩子

请求钩子有四种:我们重点掌握的只有两种:

before_request在每次请求前执行,在该装饰函数中,一旦return,视图函数不再执行

after_request如果没有抛出错误,每次请求后都执行(在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理)




5.状态保持

5.1cookie

cookie就是网站为了辨别用户的身份,进行会话跟踪而存储在用户本地的数据(通常是经过加密处理的),因为浏览器请求是无状态的,需要cookie才能在下次访问的时候知道上次做了什么,要不然每一次的刷新页面就是一次新的请求,什么记录都没有,好像我们从来没有来过一样,用户体验贼差,有了cookie就知道了用户浏览的状态,比如是否登陆过,之前看过写什么之类的.


这里有一个名词:同源策略,简单的来说,就是不同的网站之间的cookies不能共享


在运用的时候,代码如下:

1requestfrom flask import Flask,make_response,request
 2app = Flask(__name__)
 3# 设置cookies值
 4@app.route('/set_cookie')
 5def set_cookie():
 6    response = make_response("set cookie")
 7    response.set_cookie("name","xiaoyan",10) #10秒的有效期
 8    return response
 9# 获取cookie值
10@app.route('/get_cookie')
11def get_cookie():
12    # 获取cookie的时候是可以根据cookie的键名来获取cookie值的
13    # name = request.cookies["name"]但是这样错误的时候程序会崩掉,还是用get友好一点
14    # 可以根据cookie的内容来推荐商品信息
15    name = request.cookies.get("name")
16    return "获取到cookie,name is %s" % name
17
18if __name__ == '__main__':
19    app.run(debug=True)

5.2session

session是保存在服务器的,对于敏感,重要的信息,建议存储在服务器端,比如用户名,余额等等.

cookie中只保存sessionID,在浏览器发起请求的时候,会连带着cookie,将sessionID一起发送给服务器,服务器根据sessionID提取session的值,每一个用户想服务器请求的时候,都会给其开辟对应的空间保存session信息.

在使用session的时候一定要设置秘钥

1from flask import Flask,session
 2app = Flask(__name__)
 3# 设置秘钥
 4app.config["SECRET_KEY"] = "dfdfdfd"
 5# 设置session
 6@app.route('/set_session/<path:name>') # path是字符串
 7def set_session(name):
 8    session["name"]=name
 9    session["age"]="13"
10    return "set session"
11# 获取session的内容
12@app.route('get_session')
13def get_session():
14    name = session.get('name')
15    age = session.get("age")
16    return "name is %s,age is %s"% (name,age)
17if __name__ = '__main__':
18    app.run(debug=True)

session的存储依赖于cookie,在cookie保存的session编号session编号生成,需要进行加密,所以需要设置secret_key secret_key的作用参考:https://segmentfault.com/q/1010000007295395




6.上下文

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息

请求上下文应用上下文,重点掌握请求上下文

request封装了HTTP请求的内容,针对的是HTTP请求

user = request.args.get('user')获取的是get请求的参数


session用来记录请求会话中的信息,针对的是用户信息

session['name'] = user.id可以记录用户信息,

还可以通过session.get('name')




7.模板

7.1自定义过滤器

有两种形式,一种是先定义函数,再添加到过滤器列表中,另一种是装饰器的形式.重点掌握第一种.

1# 先定义一个函数
 2def do_listreverse(li):
 3   # 通过原列表创建一个新列表
 4   temp_li = list(li)
 5   # 将新列表进行反转
 6   temp_li.reverse()
 7   return temp_li
 8# 第一个参数是上面定义的函数名,
 9# 第二个参数是过滤器的名字
10app.add_template_filter(do_listreverse,'lireverse')

7.2模板中html代码

有宏/继承/包含

我们需要重点掌握的就是继承:继承指的是将公共部分我们抽取到父模板中,供子类使用的形式

父模板(base.html)中使用多个block组成

1{% block top %}
 2   顶部菜单
 3{% endblock top %}
 4
 5{% block content %}
 6   正文内容
 7{% endblock content %}
 8
 9{% block bottom %}
10   底部
11{% endblock bottom %}


子模板在使用的时候先继承

1{% extends 'base.html' %}
2{% block content %}
3   子模板自己的内容
4{% endblock content%}


注意:在父模板中时正常的html页面,但是在子模板中直接写extends和block,不需要再写head标签,body标签这些了.


7.3模板中特殊变量函数

重点掌握的有两个

7.3.1request

就是flask中代表当前请求的request对象:

1{{ request.url }}
2输出:http://127.0.0.1

7.3.2url_for()

url_for 会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不必担心模板中渲染出错的连接

1{{ url_for('home) }}
2/



8.数据库

点我查看详细知识点

8.1Flask中使用数据库

8.1.1Flask-SQLAlchemy

SQLAlchemy是对数据库的抽象,让我们不用直接和SQL语句打交道,而是通过python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升.是一个关系型数据库的框架,它提供了高层的ORM和底层的原生数据库操作.


8.1.2ORM类

类名称 类属性 类的对象
数据库表名 数据库的字段 数据库表中的一行一行的数据


8.2一对多的关系

1/我们在定义模型的时候要继承的类db.Model

2/添加外键的时候要添加在多方

3/添加关系的时候添加在一方

1class Role(db.Model):
 2   ...
 3   # 关键代码
 4   添加关系
 5   us = db.relationship('User',backref='role',lazy='dynamic')
 6   ...
 7class User(db.Model):
 8   ...
 9   # 添加外键
10   role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))


其中relationship描述了Role和User的关系

第一个参数为对应参照的类"User"

第二个参数backref为类User,反向引用属性,即给多方指定内容访问一方

第三个参数lazy决定了什么时候SQLAlchemy从数据库中加载数据

  • 动态(dynamic):这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式

第四个参数secondary:指定多对多关系中关系表的名字


8.3数据的增删改

增加:

db.session.add()

db.session.add_all()

删除:

db.session.delete()

修改:

user.name = xiaoyan

提交:

db.session.commit()

回滚:

db.session.rollback()

8.4数据库的查询

模型类.query.过滤器.执行器

12条语句:

1/查询所有用户数据:

User.query.all()

2/查询有多少个用户:

User.query.count()

3/查询第一个用户

User.query.all()[0]

4/查询id为4的用户(3种方式)

User.query.get(4)

User.query.filter_by(id=4).fitst()

User.query.filter(User.id==4).first()

5/查询名字结尾字符为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()

6/查询名字不等于wang的所有数据[2种方式]

User.query.filter(User.name!='wang').all()


from sqlalchemy import not_

User.query.filter(not_(User.name=='wang')).all

7/查询名字和邮箱都以li开头的所有数据[2种方式]

User.query.filter(User.name.startswith('li'),User.email.startswith('li')).all()


from sqlalchemy import and_

User.query.filter(and_(User.name.startswith('li'),User.email.startswith('li'))).all()

8/查询password是123456或者email以itheima.com结尾的所有数据

from sqlalchemy import or_

User.query.filter(or_(User.password=='123456',User.email.endswith('itheima.com'))).all()

9/查询id为[1,3,5,7,9]的用户列表

User.query.filter(User.id.in_([1,3,5,7,9])).all()

10/查询name为liu的角色数据

user = User.query.filter(User.name=='liu').first()

role = Role.query.filter(Role.id==user.role_id).first()

11/查询所有用户数据,并以邮箱排序

User.query.order_by(User.email).all()升序

User.query.order_by(User.email.desc()).all()降序

12/每页3个,查询第2页的数据

paginate = User.query.paginate(page,per_page,Error_out)

paginate = User.query.paginate(2,3,False)

page哪一页

per_page每页多少条数据

Error_outFalse查不到不报错

8.5数据库的迁移

数据库的迁移配合Flask_script使用

命令:

创建文件夹(此过程,只执行一次):

python xxx.py db init

生成指定版本迁移文件(每次改变的时候都需要执行):

python xxx.py db migrate -m 'sss'

升级或者降级:

python xxx.py db upgrade/downgrade[version]

查看最新/当前/历史版本:

python xxxx.py db show/current/history


8.6蓝图

点我查看详细知识点

将项目模块化的工具:

特点:

1/有自己的静态文件,模板文件

2/如果有静态文件,可以配置url_prefix去访问当前蓝图目录下的静态文件

3/蓝图本质上实现的原理(从源代码中看)


使用步骤:

1/创建蓝图对象(Blueprint)

admin = Blueprint('admin',__name__)

2/使用蓝图装饰函数

1@admin.route('/')
2def admin_home():
3   return 'admin_home'

3/将蓝图注册到app中(register_blueprint)

app.register_blueprint(admin,url_prefix='/admin')

相关文章
|
2月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
4月前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
224 71
|
3月前
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
133 60
|
4月前
|
搜索推荐 API 开发者
Django框架和Flask框架的适用场景分别是什么?
总体而言,Django 更适合需要全面功能和大规模开发的场景,而 Flask 则更适合灵活性要求高、小型项目或特定需求的开发。当然,具体的选择还应根据项目的具体情况、团队的技术能力和偏好等因素来综合考虑。在实际应用中,开发者可以根据项目的特点和需求,灵活选择使用这两个框架,或者结合它们的优势来构建更强大的 Web 应用程序。
183 64
|
4月前
|
安全 数据安全/隐私保护 开发者
Flask框架的安全性如何?
安全是一个持续的过程,需要不断地关注和更新。随着新的安全威胁的出现和技术的发展,开发者需要及时了解并采取相应的措施来应对,以确保 Flask 应用始终处于安全的状态。
193 63
|
4月前
|
开发者 数据库管理 Python
Django框架和Flask框架的区别
总体而言,Django 适合需要快速搭建大型应用的开发者,而 Flask 则更适合有特定需求和追求灵活性的开发者。
188 64
|
4月前
|
安全 网络安全 数据安全/隐私保护
Flask框架的安全机制与其他框架相比有哪些优势和劣势?
总的来说,Flask 的安全机制在灵活性和可扩展性方面有其独特优势,但也需要开发者在安全方面投入更多的精力和努力,以确保应用的安全可靠运行。
100 12
|
5月前
|
Python
Flask学习笔记(二):基于Flask框架上传图片到服务器端并原名保存
关于如何使用Flask框架上传图片到服务器端并以其原名保存的教程。
175 1
|
5月前
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
61 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
|
5月前
|
JSON 测试技术 数据库
Python的Flask框架
【10月更文挑战第4天】Python的Flask框架