当前位置: 首页 > news >正文

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,装饰器代码会走@authdef 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__ = nameview.__module__ = cls.__module__for decorator in cls.decorators: #每次拿出一个装饰器,view = decorator(view) # 装饰器语法糖干的事: 把被装饰的函数当参数传入到装饰器,返回结果赋值给被装饰的函数,一个个用装饰器包装viewview.__name__ = namereturn 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 

请求响应

# 所有web:请求对象,响应对象(go,java,ptyhon)django:request(每个请求一个request),新手四件套flask:requset:全局的,但是也是每个请求一个request,新手三件套# flask请求对象,全局的request# 请求相关信息# request.method  请求的方法# request.args  get请求提交的数据# request.form   post请求提交的数据# request.values  post和get提交的数据总和# request.cookies  客户端所带的cookie# request.headers  请求头# request.path     不带域名,请求路径# request.full_path  不带域名,带参数的请求路径# request.url           带域名带参数的请求路径# request.base_url		带域名请求路径# request.url_root      域名# request.host_url		域名# request.host			服务端地址# request.files# obj = request.files['the_file_name']# obj.save('/var/www/uploads/' + secure_filename(f.filename))# flask的响应-四件套:-1 直接返回字符串-2 返回模板:render_template-3 返回重定向:redirect,-4返回json格式:jsonify-响应中写cookieres = make_response('home') res.set_cookie('yyy', 'yyy', path='/home')# 删除cookie# res.delete_cookie('key')-响应头中写内容res = make_response('home')  # res 就是响应对象res.headers['xxx'] = 'xxx'

session

# cookie session token# flask中得session,没有在服务端存储数据的---》后期扩展,可也把session存到redis中# 全局session-放值:session['key']=value-取值:session.get('key')-删除值:session.pop('username', None)# session的运行机制'''django1 生成一个随机字符串2 把数据保存到djagno-session表中3 把随机字符串返回给前端--》当cookie存到浏览器中了--》浏览器再发请求,携带cookie过来4 根据随机字符串去表中查---》转到request.session中flask1 把数据加密转成字符串: eyJuYW1lIjoibHF6In0.ZMnbJw.ZUceSaD0kGnU97tu9ZWm3380r002 以cookie形式返回给前端---》保存到浏览器中3 浏览器再发请求,携带cookie过来4 加密符串---》解密---》放到session对象中'''# 源码分析,看运行机制-flask默认使用:SecureCookieSessionInterface作为session的类-请求来了,-客户端带了cookie---》取出cookie 中session对应的值-使用解密方式对它进行解密-放到session对象中-请求走了-把用户放到session中得数据-加密---》转成字符串--》以cookie形式返回给前端-SecureCookieSessionInterface的方法e:-open_session:请去来了用-save_session:请求走了用

http://www.lryc.cn/news/111540.html

相关文章:

  • Go语言基础:运算符、文件操作、接口、Packages、if else、for循环
  • 2308C++学习简单协程文档
  • C++笔记之从数组指针到函数数组指针(使用using name和std::function)
  • 【数据结构】常见的排序算法
  • CentOS 安装 Jenkins
  • 前端如何设置表格边框样式和单元格间距?
  • Ubuntu 22.04安装搜狗输入法
  • 【C++】初阶 --- 内联函数(inline)
  • VGGNet剪枝实战:使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型
  • 【iOS】GCD深入学习
  • Webpack开启本地服务器;HMR热模块替换;devServer配置;开发与生成环境的区分与配置
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()
  • Kubernetes关于cpu资源分配的设计
  • Flink读取mysql数据库(java)
  • 小程序学习(五):WXSS模板语法
  • 注解 @JsonFormat 与 @DateTimeFormat 的使用
  • Python实现决策树算法:完整源码逐行解析
  • Linux文本三剑客---grep、sed、awk
  • 局域网VoIP网络电话测试
  • el-table 去掉边框(修改颜色)
  • redis与MongoDB的区别
  • CSS设置高度
  • 开源免费用|Apache Doris 2.0 推出跨集群数据复制功能
  • 【docker】docker-compose服务编排
  • EdgeBox_tx1_A200 PyTorch v1.9.0 环境部署
  • 【雕爷学编程】MicroPython动手做(33)——物联网之天气预报
  • 分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)
  • 探秘企业DevOps一体化平台建设终极形态丨IDCF
  • 百度智能创做AI平台
  • Python 开发工具 Pycharm —— 使用技巧Lv.1