一、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()