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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
#文件上传@app.route("/file",methods=['GET','POST'])def file(): if request.meth
#跳转操作:redirect@app.route("/red")def red(): return redirect("/login")
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route("/img")def img(): return send_file("1.jpg&q