1 cbv源码👒
https://flask.palletsprojects.com/en/3.0.x/views/
'''
1 请求来了,路由匹配成功---》执行ItemAPI.as_view('item')()--->view加括号执行
2 ItemAPI.as_view('item')执行结果:就是View中as_view方法中的闭包函数 view
3 view()--->执行self.dispatch_request()---》执行MethodView的dispatch_request
def dispatch_request(self, **kwargs):
meth = getattr(self, request.method.lower(), None)
return meth(**kwargs)
4 如果是get请求,就会执行视图类中的get方法
class View:
@classmethod
def as_view()
def view():
self.dispatch_request()
return view
'''
app.add_url_rule('/item', endpoint='xxx',view_func=ItemAPI.as_view('item'))
如果写了endpoint---》别名以它为准,如果不写以as_view的参数为准
1 app.add_url_rule('/item',endpoint='xxx', view_func=ItemAPI.as_view('item'))
2 endpoint = _endpoint_from_view_func(view_func)
如果endpoint没传,就会走这句
view_func 是 ItemAPI.as_view('item') 它就是 view
3 _endpoint_from_view_func(view_func)---》返回了传入的函数的名字
return view_func.__name__
4 如果上面传入了ItemAPI.as_view('item'),它的函数名就是view---》endpoint就是view
endpoint如果不传,会以视图函数的函数名作为endpoint
-fbv:如果不写endpoint,会以函数名作为endpoint,但是如果多个视图函数加了同一个装饰器,又没有指定endpoint,就会出错了
-cbv:调用as_view一定要传入一个字符串---》如果endpoint没写,endpoint就是传入的这个字符串,如果写了,这个字符串没用
如果传了,直接以endpoint传入的作为endpoint
1 使用步骤:在类中加入类属性:
class ItemAPI(MethodView):
decorators = [装饰器,装饰器2]
def get(self):
print(url_for('item'))
return 'get'
2
if cls.decorators:
for decorator in cls.decorators:
view = decorator(view)
'''
@装饰器
def view()
'''
@classmethod
def as_view(cls, name, *class_args, **class_kwargs) :
def view(**kwargs):
return 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) :
meth = getattr(self, request.method.lower(), None)
return meth(**kwargs)
def register_api(app, model, name):
item = ItemAPI.as_view(f"{name}-item", model)
group = GroupAPI.as_view(f"{name}-group", model)
app.add_url_rule(f"/{name}/<int:id>", view_func=item)
app.add_url_rule(f"/{name}/", view_func=group)
register_api(app, User, "users")
register_api(app, Story, "stories")
2 模板 👒
https://flask.palletsprojects.com/en/3.0.x/
https://jinja.palletsprojects.com/en/3.1.x/
-{{变量/简单表达式/函数}}
-{%if/for %} {%endif%} {%endfor%}
-比dtl强大 ,Jinja中可以加括号
-字典取值,列表取值跟python语言一样,之前dtl 通过 .取值
-过滤器,标签
-extends,include 跟之前一样
3 请求响应 👒
django:request(每个请求一个request),新手四件套
flask: requset:全局的,但是也是每个请求一个request,新手三件套
-return '字符串'
-return render_template('index.html',name=lqz,age=19)
-return redirect(url_for(别名))
-return jsonify(字典,列表)
obj=make_response('index')
obj.set_cookies()
4 session 👒
obj=make_response('index')
obj.set_cookies('name','lqz')
request.cookie.get('name')
1 设置秘钥
2 写入session
session['username']='xxx'
3 取出session
username = session.get('username')

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人