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 

请求响应

复制代码
# 所有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
        
    -响应中写cookie
    	 res = 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的运行机制
	'''
    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:请求走了用
相关推荐
不知更鸟1 小时前
Django 项目设置流程
后端·python·django
自动化代码美学2 小时前
【Python3.13】官网学习之控制流
开发语言·windows·python·学习
黄昏恋慕黎明3 小时前
spring MVC了解
java·后端·spring·mvc
G探险者5 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
百锦再5 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django
Tony Bai5 小时前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
源码之家5 小时前
基于Python房价预测系统 数据分析 Flask框架 爬虫 随机森林回归预测模型、链家二手房 可视化大屏 大数据毕业设计(附源码)✅
大数据·爬虫·python·随机森林·数据分析·spark·flask
SalvoGao5 小时前
Python学习 | 怎么理解epoch?
数据结构·人工智能·python·深度学习·学习
程序猿20235 小时前
项目结构深度解析:理解Spring Boot项目的标准布局和约定
java·spring boot·后端
RainbowSea6 小时前
内网穿透配置和使用
java·后端