zoukankan      html  css  js  c++  java
  • flask关于请求知识点

    一、Request对象

    1、概述

    flask的request对象主要是封装了解析出来的报文中的数据,其大部分功能是依赖werkzeug完成,每个request对象之间都是线程隔离,保证了数据的安全性

    2、request对象常用的方法/属性

    2.1常用方法

    请求例子的url : http:127.0.0.1:5000/index/?age=18

    属性 作用 例子
    path 获取不带域名的请求路径 u'/index/’
    full_path 获取不带域名带参数的请求路径 u'/index/?age=18‘

    host

    获取主机名 u'127.0.0.1:5000‘
    host_url 获取域名 u'http://127.0.0.1:5000/'
    base_url 获取带域名的请求路径 u'http://127.0.0.1:5000/index/'
    url 获取带域名带参数请求路径 u'http://127.0.0.1:5000/index/?age=18’
    url_root 获取域名 u'http://127.0.0.1:5000'
     request.method        #提交的方法
    request.data #包含了请求的数据,并转换为字符串,除非是一个Flask无法处理的mimetype。 request.args # get请求提及的数据 request.form #post请求提交的数据 request.values # post和get提交的数据总和 request.cookies # 客户端所带的cookie request.headers #请求头 request.files # MultiDict,带有通过POST或PUT请求上传的文件
    request.cookies # 客户端携带的cookies

    2.2 其他方法

    request.stream   # 在可知的mimetype下,如果进来的表单数据无法解码,会没有任何改动的保存到这个 stream 以供使用。很多时候,当请求的数据转换为string时,使用data是最好的方式。这个stream只返回数据一次。
    request.headers  # 请求头,字典类型。
    request.environ  # WSGI隐含的环境配置
    request.is_xhr   # 如果请求是一个来自JavaScript XMLHttpRequest的触发,则返回True,这个只工作在支持X-Requested-With头的库并且设置了XMLHttpRequest。
    request.blueprint # 获取蓝图名字
    request.endpoint  # endpoint匹配请求,这个与view_args相结合,可是用于重构相同或修改URL。当匹配的时候发生异常,会返回None。
    request.json      # 如果mimetype是application/json,这个参数将会解析JSON数据,如果不是则返回None。 可以使用这个替代get_json()方法。
    request.max_content_length  # 只读,返回MAX_CONTENT_LENGTH的配置键。
    request.module    # 如果请求是发送到一个实际的模块,则该参数返回当前模块的名称。这是弃用的功能,使用blueprints替代。

     3、常见request请求方法

    GET    # 获取服务器资源
    POST   # 处理服务器资源
    PUT    # 在服务器更新资源(客户端提供改变后的完整资源)
    DELETE # 删除服务器资源
    PATCH  # 在服务器更新资源(客户端提供改变的属性)

    二、Response响应对象

    1、响应对象返回类型

    (1)return 字符串

    (2)return render_template('html模板文件')

    (3)return redirect('重定向url‘)

    (4)return jsonify({'k1':'v1'})   # 跟Django的JsonResponse类似,返回json类型

    2、响应对象处理

    1、先用make_response方法生成一个响应对象,Django是用JsonResponse

    res.make_response('xx')
    # 设置cookie值
    res.set_cookie('cooki01','hello')
    # 在响应头中放东西
    res.headers['test']=' this is a test’
    # 最后返回响应对象
    return res

     三、session

    1、session的使用

    from flask import Flask,session
    
    app=Flask(__name__)
    
    app.secret_key='adcdsa'
    
    # app.session_interface=class  配置session规则
    
    @app.route('/')
    def home():
        # 设置session名字,默认是session
        app.session_cookie_name='test'
        # 设置session
        session['test']='xxxx'
        # 获取session值
        session.get('test')
        return '这是首页'
    
    @app.route('/delete')
    def delete():
        # 删除session
        session.pop('test',None)
        return '删除testsession值'

    设置过期时间和有效期

    (1)将session的permanent属性设置为True开启有效期,时间默认是31天

    (2)通过app配置PERMANENT_SESSION_LIFETIME 来设置具体的时间

    from flask import Flask,session
    from datetime import timedelta
    
    app=Flask(__name__)
    app.secret_key='abladsasg'
    # 设置过期时间为2个小时
    app.config['PERMANENT_SESSION_LIFETIME']=timedelta(hours=2)
    
    @app.route('/')
    def test():
        session['hello']='world'
        session.permanent=True #开启设置有效期,默认是31天过期

    2、session源码解析

    #1、先从session_interface中找默认的session规则类SecureCookieSessionInterface
    app.session_interface # 配置session规则
    session_interface = SecureCookieSessionInterface()
    
    # 2、从SecureCookieSessionInterface类解析session处理过程
    class SecureCookieSessionInterface(SessionInterface):
        salt = "cookie-session" #
        digest_method = staticmethod(hashlib.sha1)
        key_derivation = "hmac" # 加密方式
        serializer = session_json_serializer
        session_class = SecureCookieSession
        # 签名加密得到一个签名序列化对象
        def get_signing_serializer(self, app):
            if not app.secret_key:
                return None
            signer_kwargs = dict(
                key_derivation=self.key_derivation, digest_method=self.digest_method
            )
            # 返回一个可加密可解密的对象
            return URLSafeTimedSerializer(
                app.secret_key,
                salt=self.salt,
                serializer=self.serializer,
                signer_kwargs=signer_kwargs,
            )
        # 读取session
        def open_session(self, app, request):
            s = self.get_signing_serializer(app) #得到一个签名序列化对象
            if s is None:
                return None
            val = request.cookies.get(app.session_cookie_name)
            if not val:
                return self.session_class() #返回一个session对象
            max_age = total_seconds(app.permanent_session_lifetime)
            try:
                #将加密的字符串转成字典
                data = s.loads(val, max_age=max_age)
                # 返回一个有值的session对象
                return self.session_class(data)
            except BadSignature:
                return self.session_class()
        # 保存session
        def save_session(self, app, session, response):
            domain = self.get_cookie_domain(app)
            path = self.get_cookie_path(app)
    
            # If the session is modified to be empty, remove the cookie.
            # If the session is empty, return without setting the cookie.
            if not session:
                if session.modified:
                    response.delete_cookie(
                        app.session_cookie_name, domain=domain, path=path
                    )
    
                return
    
            # Add a "Vary: Cookie" header if the session was accessed at all.
            if session.accessed:
                response.vary.add("Cookie")
    
            if not self.should_set_cookie(app, session):
                return
    
            httponly = self.get_cookie_httponly(app)
            secure = self.get_cookie_secure(app)
            samesite = self.get_cookie_samesite(app)
            expires = self.get_expiration_time(app, session)
            # 将session字典转成加密串
            val = self.get_signing_serializer(app).dumps(dict(session))
            response.set_cookie(
                app.session_cookie_name,
                val,
                expires=expires,
                httponly=httponly,
                domain=domain,
                path=path,
                secure=secure,
                samesite=samesite,
            )

     四、cookie

    1、使用方法

    # set_cookie()参数
    key      #cookie的键(名称)
    value    # cookie值
    max_age  # cookie被保存的时间数,单位为秒
    expires  # 具体的过期时间,一个datetime对象或UNIX时间戳
    path     # cookie指定可用路径,默认为整个域名下路径都可用
    domain   # 设置cookie可用的域名,默认是当前域名,子域名需要利用通配符domain=.当前域名
    secure   # True,则只能通过https才可用
    httponly #如果设为`True`,进制客户端`JavaScript`获取`cookie`
    
    # -------------案例----------------
    from flask import Flask,Response,request
    from datetime import datetime,timedelta
    
    app=Flask(__name__)
    
    @app.route('/')
    def test():
        res=Response('hello world')
        res.set_cookie('h','test')
        # 设置有效期是一天
        res.set_cookie('age','有效期',max_age=24*60*60)
        '''
        注意expires参数是使用格林尼治时间,相对北京时间少8个小时,根据当地时间的调整,需要-8个小时
        '''
        data=datetime.now()+timedelta(days=1,hours=-8)
        # 设置过期时间一天
        res.set_cookie('exp','过期时间',expires=data)
        return res
    @app.route('/get')
    def get_ck():
        # 获取cookies值
        cookie=request.cookies.get('exp')
        return cookie
    @app.route('/delete')
    def delete():
        # 删除cooki值
        res=Response('删除cookies值')
        res.delete_cookie('h')
        return res
    
    
    if __name__=='__main__':
        app.run()
    不将就
  • 相关阅读:
    宏任务、微任务
    类和模块
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/nq31/p/14317804.html
Copyright © 2011-2022 走看看