flask--->CBV/模板/请求响应/session
CBV
-
1 cbv写法
-
-1 写个类,继承MethodView
-
-2 在类中写跟请求方式同名的方法
-
-3 注册路由:app.add_url_rule('/home', view_func=Home.as_view('home')) #home是endpoint,就是路由别名
-
-
2 cbv加装饰器
-
-方式一:
-
class Home(MethodView):
-
decorators = [auth] # 之前加载fbv上的,直接拿过来用即可
-
-方式二:
-
class Home(MethodView):
-
@auth # 这个auth需要单独写,跟加载fbv上的不一样
-
def get(self):
-
return render_template('home.html')
-
-
-
3 允许的请求方式
-
class Home(MethodView):
-
methods = ['GET'] # 控制能够允许的请求方式
-
-
4 cbv源码
-
-
5 为什么decorators = [auth] 能加装饰器
-
app.add_url_rule('/home', view_func=view内存地址)
-
用装饰器一直在装饰 view内存地址 ,所以,以后执行,就是有装饰器的view,装饰器代码会走
-
@auth
-
def view(**kwargs):
-
return self.dispatch_request(**kwargs)
-
等价于
-
view = auth(view)
-
-
-
6 view_func=Home.as_view('home') home 是 endpoint,就是路由别名
-
-1 app.add_url_rule('/home', view_func=Home.as_view('home'))
-
-2 add_url_rule---》endpoint没传---》会执行endpoint = _endpoint_from_view_func(view_func)
-
-3 取函数名作为 endpoint 的值
-
-4 view_func是 加了一堆装饰器的view函数---》它的名字应该是装饰器的名字--》但是
-
view.__name__ = name # name 就是home
-
-5 所以endpoint就是你传的home
-
-6 如果传了endpoint,就是传的那个,那as_view('home')就没作用了,但是也必须要传
as_view源码
-
-
# View的as_view
-
@classmethod
-
def as_view(cls, name, *class_args, **class_kwargs) :
-
def view(**kwargs):
-
return self.dispatch_request(**kwargs)
-
-
if cls.decorators: # 咱们的装饰器
-
view.__name__ = name
-
view.__module__ = cls.__module__
-
for decorator in cls.decorators: #每次拿出一个装饰器,
-
view = decorator(view) # 装饰器语法糖干的事: 把被装饰的函数当参数传入到装饰器,返回结果赋值给被装饰的函数,一个个用装饰器包装view
-
view.__name__ = name
-
-
return view
-
-
-
# self.dispatch_request---》MethodView
-
def dispatch_request(self, **kwargs) :
-
# 取到request.method.lower()请求方式小写 ---》假设是get请求get
-
# meth是 cbv中 以get命名的方法,反射出来了
-
meth = getattr(self, request.method.lower(), None)
-
return meth(**kwargs) # 执行cbv中跟请求方式同名的方法
模板
-
# 之前dtl中学的所有知识,拿到这,都可以用---》dtl是django自己的,不能独立使用
-
# jinja2 模板语法,第三方,flask使用了它,它可以单独使用
-
# jinja2 模板语法 支持括号调用,支持 字典[] 取值----》模板中写原来python的语法都支持
-
-
# jinja2模板语法处理了xss攻击
-
django,jinja2处理xss攻击原理是?
-
-使用了html特殊字符的替换,把字符串中得 < > 都用特殊字符替换
-
# extends,include
请求响应
-
-
django:request(每个请求一个request),新手四件套
-
flask:requset:全局的,但是也是每个请求一个request,新手三件套
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-四件套:
-
-1 直接返回字符串
-
-2 返回模板:render_template
-
-3 返回重定向:redirect,
-
-4返回json格式:jsonify
-
-
-响应中写cookie
-
res = make_response('home')
-
res.set_cookie('yyy', 'yyy', path='/home')
-
-
-
-响应头中写内容
-
res = make_response('home')
-
res.headers['xxx'] = 'xxx'
-
-
session
-
# cookie session token
-
-
# flask中得session,没有在服务端存储数据的---》后期扩展,可也把session存到redis中
-
-
# 全局session
-
-放值:session['key']=value
-
-取值:session.get('key')
-
-删除值:session.pop('username', None)
-
-
-
# session的运行机制
-
'''
-
django
-
1 生成一个随机字符串
-
2 把数据保存到djagno-session表中
-
3 把随机字符串返回给前端--》当cookie存到浏览器中了--》浏览器再发请求,携带cookie过来
-
4 根据随机字符串去表中查---》转到request.session中
-
flask
-
1 把数据加密转成字符串: eyJuYW1lIjoibHF6In0.ZMnbJw.ZUceSaD0kGnU97tu9ZWm3380r00
-
2 以cookie形式返回给前端---》保存到浏览器中
-
3 浏览器再发请求,携带cookie过来
-
4 加密符串---》解密---》放到session对象中
-
'''
-
-
-
# 源码分析,看运行机制
-
-flask默认使用:SecureCookieSessionInterface作为session的类
-
-请求来了,
-
-客户端带了cookie---》取出cookie 中session对应的值
-
-使用解密方式对它进行解密
-
-放到session对象中
-
-请求走了
-
-把用户放到session中得数据
-
-加密---》转成字符串--》以cookie形式返回给前端
-
-
-SecureCookieSessionInterface的方法e:
-
-open_session:请去来了用
-
-save_session:请求走了用
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfiaeh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01