• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

flask--->CBV/模板/请求响应/session

武飞扬头像
骑台风走
帮助1

CBV

  1.  
    1 cbv写法
  2.  
    -1 写个类,继承MethodView
  3.  
    -2 在类中写跟请求方式同名的方法
  4.  
    -3 注册路由:app.add_url_rule('/home', view_func=Home.as_view('home')) #home是endpoint,就是路由别名
  5.  
     
  6.  
    2 cbv加装饰器
  7.  
    -方式一:
  8.  
    class Home(MethodView):
  9.  
    decorators = [auth] # 之前加载fbv上的,直接拿过来用即可
  10.  
    -方式二:
  11.  
    class Home(MethodView):
  12.  
    @auth # 这个auth需要单独写,跟加载fbv上的不一样
  13.  
    def get(self):
  14.  
    return render_template('home.html')
  15.  
     
  16.  
     
  17.  
    3 允许的请求方式
  18.  
    class Home(MethodView):
  19.  
    methods = ['GET'] # 控制能够允许的请求方式
  20.  
     
  21.  
    4 cbv源码
  22.  
     
  23.  
    5 为什么decorators = [auth] 能加装饰器
  24.  
    app.add_url_rule('/home', view_func=view内存地址)
  25.  
    用装饰器一直在装饰 view内存地址 ,所以,以后执行,就是有装饰器的view,装饰器代码会走
  26.  
    @auth
  27.  
    def view(**kwargs):
  28.  
    return self.dispatch_request(**kwargs)
  29.  
    等价于
  30.  
    view = auth(view)
  31.  
     
  32.  
     
  33.  
    6 view_func=Home.as_view('home') home 是 endpoint,就是路由别名
  34.  
    -1 app.add_url_rule('/home', view_func=Home.as_view('home'))
  35.  
    -2 add_url_rule---》endpoint没传---》会执行endpoint = _endpoint_from_view_func(view_func)
  36.  
    -3 取函数名作为 endpoint 的值
  37.  
    -4 view_func是 加了一堆装饰器的view函数---》它的名字应该是装饰器的名字--》但是
  38.  
    view.__name__ = name # name 就是home
  39.  
    -5 所以endpoint就是你传的home
  40.  
    -6 如果传了endpoint,就是传的那个,那as_view('home')就没作用了,但是也必须要传
学新通

as_view源码

  1.  
     
  2.  
    # View的as_view
  3.  
    @classmethod
  4.  
    def as_view(cls, name, *class_args, **class_kwargs) :
  5.  
    def view(**kwargs):
  6.  
    return self.dispatch_request(**kwargs)
  7.  
     
  8.  
    if cls.decorators: # 咱们的装饰器
  9.  
    view.__name__ = name
  10.  
    view.__module__ = cls.__module__
  11.  
    for decorator in cls.decorators: #每次拿出一个装饰器,
  12.  
    view = decorator(view) # 装饰器语法糖干的事: 把被装饰的函数当参数传入到装饰器,返回结果赋值给被装饰的函数,一个个用装饰器包装view
  13.  
    view.__name__ = name
  14.  
     
  15.  
    return view
  16.  
     
  17.  
     
  18.  
    # self.dispatch_request---》MethodView
  19.  
    def dispatch_request(self, **kwargs) :
  20.  
    # 取到request.method.lower()请求方式小写 ---》假设是get请求get
  21.  
    # meth是 cbv中 以get命名的方法,反射出来了
  22.  
    meth = getattr(self, request.method.lower(), None)
  23.  
    return meth(**kwargs) # 执行cbv中跟请求方式同名的方法
学新通

模板

  1.  
    # 之前dtl中学的所有知识,拿到这,都可以用---》dtl是django自己的,不能独立使用
  2.  
    # jinja2 模板语法,第三方,flask使用了它,它可以单独使用
  3.  
    # jinja2 模板语法 支持括号调用,支持 字典[] 取值----》模板中写原来python的语法都支持
  4.  
     
  5.  
    # jinja2模板语法处理了xss攻击
  6.  
    django,jinja2处理xss攻击原理是?
  7.  
    -使用了html特殊字符的替换,把字符串中得 < > 都用特殊字符替换
  8.  
    # extends,include

请求响应

  1.  
    # 所有web:请求对象,响应对象(go,java,ptyhon)
  2.  
    django:request(每个请求一个request),新手四件套
  3.  
    flask:requset:全局的,但是也是每个请求一个request,新手三件套
  4.  
     
  5.  
    # flask请求对象,全局的request
  6.  
    # 请求相关信息
  7.  
    # request.method 请求的方法
  8.  
    # request.args get请求提交的数据
  9.  
    # request.form post请求提交的数据
  10.  
    # request.values post和get提交的数据总和
  11.  
    # request.cookies 客户端所带的cookie
  12.  
    # request.headers 请求头
  13.  
    # request.path 不带域名,请求路径
  14.  
    # request.full_path 不带域名,带参数的请求路径
  15.  
    # request.url 带域名带参数的请求路径
  16.  
    # request.base_url 带域名请求路径
  17.  
    # request.url_root 域名
  18.  
    # request.host_url 域名
  19.  
    # request.host 服务端地址
  20.  
    # request.files
  21.  
    # obj = request.files['the_file_name']
  22.  
    # obj.save('/var/www/uploads/' secure_filename(f.filename))
  23.  
     
  24.  
     
  25.  
    # flask的响应
  26.  
    -四件套:
  27.  
    -1 直接返回字符串
  28.  
    -2 返回模板:render_template
  29.  
    -3 返回重定向:redirect,
  30.  
    -4返回json格式:jsonify
  31.  
     
  32.  
    -响应中写cookie
  33.  
    res = make_response('home')
  34.  
    res.set_cookie('yyy', 'yyy', path='/home')
  35.  
    # 删除cookie
  36.  
    # res.delete_cookie('key')
  37.  
    -响应头中写内容
  38.  
    res = make_response('home') # res 就是响应对象
  39.  
    res.headers['xxx'] = 'xxx'
  40.  
     
  41.  
     
学新通

session

  1.  
    # cookie session token
  2.  
     
  3.  
    # flask中得session,没有在服务端存储数据的---》后期扩展,可也把session存到redis中
  4.  
     
  5.  
    # 全局session
  6.  
    -放值:session['key']=value
  7.  
    -取值:session.get('key')
  8.  
    -删除值:session.pop('username', None)
  9.  
     
  10.  
     
  11.  
    # session的运行机制
  12.  
    '''
  13.  
    django
  14.  
    1 生成一个随机字符串
  15.  
    2 把数据保存到djagno-session表中
  16.  
    3 把随机字符串返回给前端--》当cookie存到浏览器中了--》浏览器再发请求,携带cookie过来
  17.  
    4 根据随机字符串去表中查---》转到request.session中
  18.  
    flask
  19.  
    1 把数据加密转成字符串: eyJuYW1lIjoibHF6In0.ZMnbJw.ZUceSaD0kGnU97tu9ZWm3380r00
  20.  
    2 以cookie形式返回给前端---》保存到浏览器中
  21.  
    3 浏览器再发请求,携带cookie过来
  22.  
    4 加密符串---》解密---》放到session对象中
  23.  
    '''
  24.  
     
  25.  
     
  26.  
    # 源码分析,看运行机制
  27.  
    -flask默认使用:SecureCookieSessionInterface作为session的类
  28.  
    -请求来了,
  29.  
    -客户端带了cookie---》取出cookie 中session对应的值
  30.  
    -使用解密方式对它进行解密
  31.  
    -放到session对象中
  32.  
    -请求走了
  33.  
    -把用户放到session中得数据
  34.  
    -加密---》转成字符串--》以cookie形式返回给前端
  35.  
     
  36.  
    -SecureCookieSessionInterface的方法e:
  37.  
    -open_session:请去来了用
  38.  
    -save_session:请求走了用
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfiaeh
系列文章
更多 icon
同类精品
更多 icon
继续加载