一、请求响应循环,即由客户端发起请求,web服务端收到请求后向客户端响应的循环过程
二、HTTP请求
-
请求报文由请求方法,URL,协议版本,header,内容实体组成。
-
request对象,属于flask的一个类,可以通过该对象的属性(如url,host,args.get)或方法(get_data(),get_json())获得请求的url或数据等。
-
在flask中处理请求
1.路由匹配(app.url_map),定义了URL规则与视图函数的映射关系,使用flask routes可以查看路由表
2.设置监听的http方法,以app.route()作为装饰器时,在里面用"method"作为参数设置监听http方法
3.URL处理,这里为使用变量转换器(
<转换类型:变量名>
)将变量进行类型转换4.请求钩子,用于注册请求不同阶段中的回调函数,分别为:
before_first_request
before_request
after_this_request
after_request
teardown_request
一共5个,作为装饰器实现
三、HTTP响应
-
响应报文由协议版本,状态码,原因短语,响应首部和响应主体组成。常见的状态码如200(正常)、302(重定向)、404(找不到资源)、500(内部服务器错误)等。
-
在flask中生成响应
1.重定向,通过redirect()方法把当前的视图函数重定向到另一个url(可以结合url_for(“端点”)获得重定向目的url)
2.错误响应,通过abort(状态码) 返回一个错误响应
-
响应格式(MIME),通过make_response()生成响应对象response后,对该response的属性mimetype设置。有4种类型:
1.纯文本类型(text/plain)
2.HTML类型(text/html)
3.XML类型(application/xml)
4.JSON类型(application/json,借助jsonify()函数进行序列化)
-
cookie,用make_response()生成响应对象response后,对该response使用的属性使用set_cookie()方法,设置cookie
-
session对cookie的数据进行了加密,步骤为:
1.设置程序密钥,通过app.secret_key配置,或者先在.env文件中写入该变量后,在程序头中通过app.secret_key=os.getenv()获得
2.模拟用户验证,通过session[“logged_in”]=True表示用户已认证。通过session.pop(“logged_in”)清除该cookie,登出用户
四、flask上下文
-
上下文全局变量,运行程序或激活请求时的临时动态全局变量,分两种:
程序上下文,变量有
current_app 指向处理请求的当前程序实例
g 用于存储全局数据,每次请求都会重设
请求上下文,变量有
request 封装客户端发出的请求报文数据
session 存储请求之间的数据,对cookie加密封装
-
激活上下文,当启动flask项目时就会激活程序上下文,激活请求时产生的请求上下文的同时也会激活程序上下文,通过app.app_context()对象获取程序上下文,app.test_request_context()临时创建请求上下文,用push()或者pop()显式推送或销毁程序/请求上下文
-
上下文钩子,app.teardown_appcontext()作为装饰器实现,在请求销毁结束时注册的回调函数
五、HTTP进阶实践
-
重定向回上一个页面,有两个步骤:
1.获取上一个页面的URL,可以通过request.referrer,或者在url_for里使用定义查询参数next=request.full_path进行重定向
2.对URL进行安全验证,使用urlparse方法解析URL,解析对象的scheme属性判别协议模式(http或https),netloc属性获取url,判断是否属于程序内部的url
-
使用AJAX技术发送异步请求,实现网页的局部更新。具体为使用jQuery函数ajax(),参数有url,type,data,success等。
-
HTTP服务器端推送,主要有3种:传统轮询,长轮询,Server-Sent Events(SSE)
-
Web安全防范。
1.注入攻击,可通过ORM,验证输入类型,参数化查询及转义特殊字符进行防范
2.XSS攻击,可通过HTML转义(escape()方法)或验证用户输入
3.CSRF攻击,通过正确使用HTTP方法,CSRF令牌校验进行防范