首页 > 编程语言 >flask as_view源码,请求响应,cookie,session

flask as_view源码,请求响应,cookie,session

时间:2023-08-02 15:57:03浏览次数:38  
标签:请求 flask request session cookie home 源码 view

1 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')就没作用了,但是也必须要传

1.1 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中跟请求方式同名的方法

2 模板

# 之前dtl中学的所有知识,拿到这,都可以用---》dtl是django自己的,不能独立使用
# jinja2 模板语法,第三方,flask使用了它,它可以单独使用
# jinja2 模板语法 支持括号调用,支持 字典[] 取值----》模板中写原来python的语法都支持

# jinja2模板语法处理了xss攻击
	django,jinja2处理xss攻击原理是?
    	-使用了html特殊字符的替换,把字符串中得 <  > 都用特殊字符替换
# extends,include 

3 请求响应

# 所有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))
         with open('', 'wb') as f:
            for i in request.files['']:
                f.write(i)

    
# 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'
    
    
    

image-20230802114719649

4 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:请求走了用
    

标签:请求,flask,request,session,cookie,home,源码,view
From: https://www.cnblogs.com/liyuanxiangls/p/17600891.html

相关文章

  • 直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆
    直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆 publicclassDirectionViewextendsViewimplementsView.OnTouchListener{  privateintwidth;  privateintheight;  privateinthalfWidth;  privateinthalfHeight;  privateintsmal......
  • 视频直播源码,android:textColor设置无效
    视频直播源码,android:textColor设置无效title_color.xml <?xmlversion="1.0"encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android">  <itemandroid:color="@color/txt_blue"/>......
  • 盘点一对一源码iOS系统维持平台稳定功能(一):弹性扩缩容
    在移动互联网快速发展的时代,直播成为了一个火爆的行业,并成功进入到Android、iOS、鸿蒙系统中,人们只需具备网络与能下载直播平台的设备便可使用到一对一直播源码平台,所以几乎全世界的人们都成为了平台的用户,这就使得一对一直播源码平台的用户人数的庞大,但毕竟一对一直播源码平台是一......
  • PHP客服系统聊天页面-thinkphp加载页面源码解释
    PHPworkerman客服系统加载聊天页面的代码逻辑流程,可以进行参考。如果想要二开修改的,可以根据这个流程来修改。thinkphp的router部分Route::get('kefu/:u/:f?','index/index/chat');查看控制器加载页面逻辑application/index/controller/Index.phppublicfunctionchat函......
  • scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高
    scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高一、背景scrapy爬虫项目中,遇到scrapy的priority属性,搞不懂priority的值越大优先级越高,还是值越小优先级越高#通过priority修改优先级returnscrapy.Request(url=request.url,dont_filter=True,callback=spider......
  • 盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
    在移动互联网快速发展的时代,直播成为了一个火爆的行业,并成功进入到Android、iOS、鸿蒙系统中,人们只需具备网络与能下载直播平台的设备便可使用到一对一直播源码平台,所以几乎全世界的人们都成为了平台的用户,这就使得一对一直播源码平台的用户人数的庞大,但毕竟一对一直播源码平台是......
  • react源码解析手写ReactDom.js和React
    前言大家好我是歌谣今天给大家带来react源码部分的实现创建项目首先npxcreate-react-appxxx降为17"dependencies":{"@testing-library/jest-dom":"^5.11.4","@testing-library/react":"^11.1.0","@testing-library/user-event&......
  • Flask使用sqlalchemy(1)
    Flask使用sqlalchemy(1)flask项目演示#运行步骤: 1pycharm打开项目2安装依赖:虚拟环境pipinstall-rreq.txt3在数据库创建库:movie#root用户密码不是123,改代码,两个地方4打开models.py解开注释,最上面两行注释掉,以脚本形式运行 命令行中:pythonmo......
  • Flask的线程,携程与并发 (2)
    Flask的线程,携程与并发(2)pipreqs:-项目依赖pip3installpipreqs-生成依赖文件:pipreqs./-安装依赖文件:pip3install-rrequirements.txt函数和方法fromtypesimportMethodType,FunctionTypeclassFoo(object): deffetch(self): passprint(isinstance(......
  • Flask数据库连接(了解)
    Flask数据库连接(了解)g对象#g:global缩写,是关键字,不能用,就写成了g,对象,是一个全局对象,当此请求过程中,一直有效#作用:上下文 -其实是请求的上下文,从请求进来,就有,到请求走了,一直存在,所以在当次请求过程中,如果调用别的函数,不需要把参数传入,只需要放到g对象中,在别的函数中直接使......