1 偏函数partial()
from functools import partial
def add(a,b,c):
return a+b+c
res=add(1,2,3)
print(res)
res=partial(add,1)
print(res(2,3))
2.CBV(类视图)
2.1基本使用
from flask import Flask, url_for
from flask.views import MethodView
app = Flask(__name__)
app.debug = True
class IndexView(MethodView):
def get(self):
return 'get请求'
def post(self):
return 'post请求'
app.add_url_rule('/index', view_func=IndexView.as_view(name='hope'))
if __name__ == '__main__':
app.run()
2.2 问?即传了endpoint,又传了name,以谁为准?
如果传了endpoint,以endpoint 为准
如果没传,以函数名为准,函数名是view,但是被name改了,所以 name为准
2.3 cbv源码分析
@classmethod
def as_view(cls, name, *class_args) :
if cls.init_every_request:
def view(**kwargs: t.Any) -> ft.ResponseReturnValue:
self = view.view_class(
*class_args, **class_kwargs
)
return current_app.ensure_sync(self.dispatch_request)(**kwargs)
else:
self = cls(*class_args, **class_kwargs)
def view(**kwargs: t.Any) -> ft.ResponseReturnValue:
return current_app.ensure_sync(self.dispatch_request)(**kwargs)
if cls.decorators:
for decorator in cls.decorators:
view = decorator(view)
view.__name__ = name
return view
def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue:
meth = getattr(self, request.method.lower(), None)
return meth(**kwargs)
class GoodsView(View):
def dispatch_request(self) :
if request.method == 'GET':
return self.login()
def login(self):
return 'login'
app.add_url_rule('/login', view_func=GoodsView.as_view('denglu'))
if __name__ == '__main__':
app.run()
3 模板
-区别在有的函数不一样:过滤器,标签 |safe
-if for
-取字典,取列表 都完全一样
-include
-extends
- 函数可以加括号---》就能传参数
4 请求响应
4.1 请求对象
4.2 响应对象
from flask import Flask, url_for, request,make_response,jsonify
from flask.views import MethodView, View
app = Flask(__name__)
app.debug = True
class IndexView(MethodView):
def get(self):
res=make_response('get请求')
res.set_cookie('key','hope',httponly=True,path='/')
res.headers['xxxx']='sss'
return res
def post(self):
return 'post请求'
app.add_url_rule('/index', view_func=IndexView.as_view(name='hope'))
if __name__ == '__main__':
app.run()
5 session使用
5.1 基本使用
5.2 原理及源码

def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None:
s = self.get_signing_serializer(app)
if s is None:
return None
val = request.cookies.get(self.get_cookie_name(app))
if not val:
return self.session_class()
max_age = int(app.permanent_session_lifetime.total_seconds())
try:
data = s.loads(val, max_age=max_age)
return self.session_class(data)
except BadSignature:
return self.session_class()
def save_session(
self, app: Flask, session: SessionMixin, response: Response
) -> None:
name = self.get_cookie_name(app)
domain = self.get_cookie_domain(app)
path = self.get_cookie_path(app)
secure = self.get_cookie_secure(app)
samesite = self.get_cookie_samesite(app)
httponly = self.get_cookie_httponly(app)
if session.accessed:
response.vary.add("Cookie")
if not session:
if session.modified:
response.delete_cookie(
name,
domain=domain,
path=path,
secure=secure,
samesite=samesite,
httponly=httponly,
)
response.vary.add("Cookie")
return
if not self.should_set_cookie(app, session):
return
expires = self.get_expiration_time(app, session)
val = self.get_signing_serializer(app).dumps(dict(session))
response.set_cookie(
name,
val,
expires=expires,
httponly=httponly,
domain=domain,
path=path,
secure=secure,
samesite=samesite,
)
response.vary.add("Cookie")
6 请求扩展
- flask中叫请求扩展---》本质作用实现像django中间件的作用一样
- flask也有中间件,但是一般不用,用请求扩展即可
6.1常用的
1 before_request
2 after_request
3 teardown_request
4 errorhandler
6.2案例
1 请求来进视图函数之前执行
2 多个会从上往下依次执行
3 如果返回None,表示继续下一个
4 如果返回了四件套:表示结束,不继续往后走
@app.before_request
def before01():
print('来了老弟1')
request.name='hope'
@app.before_request
def before02():
print('来了老弟2')
'''
# 1 after_request :
1 视图函数执行完,走
2 多个会从下往上依次执行
3 必须有返回值,是响应对象
4 处理跨域,再响应头中加--》就用它
'''
@app.after_request
def after01(response):
print('走了老弟1')
return response
@app.after_request
def after01(response):
print('走了老弟2')
response.headers['ssss']='sss'
return response
'''
teardown_request
-1 无论视图函数执行成功或失败,都会走它
-2 即便视图函数执行出异常,也会走
-3 一般用来记录日志
'''
@app.teardown_request
def teardown(exc):
print(exc)
'''
errorhandler
-1 监听http响应状态码
-2 全局异常处理
'''
@app.errorhandler(404)
def error_404(arg):
return jsonify({'code':'xxx'})
@app.errorhandler(500)
def error_500(arg):
return jsonify({'code':'500错误了'})
@app.get('/')
def index():
l=[1,2]
print(l[3])
return '成功'
app.add_url_rule('/', 'index', index, methods=['GET'])
if __name__ == '__main__':
app.run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律