一、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替代。
![](https://i-blog.csdnimg.cn/blog_migrate/aec510bbf512f392369cf210dbab7f87.png)
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()