一、请求发生时代码的逻辑如下:
1、http://localhost:8081/foo/dbins?name=hello
第一步:运行citrus.py 的 route 函数
上述请求发生时,根据flask路由代码: @app.route(‘/<controller>/<action>‘, methods = [‘GET‘, ‘POST‘]),路由注册了get与post方法,地址带有两个动态参数 controller与action,根据视图函数route(controller, action),此时的controller是foo,action是dbins,请求被分发到controller.foo的doins方法,并返回(调用)此函数。
第二步:运行 dbins方法:
(1)调用_ctl_ module中的parse_request函数,其中关键字参数get为列表[‘name‘];
(2)因为此时parse_request函数 中post默认为none,则parse_request函数以元组形式返回链接中的“name”的值“hello”;
(3)将上一步的结果“hello”作为参数,调用model文件中的foo函数;foo函数主要创建类(含id与name属性),并将传递过来的“hello”参数赋值给对象的name属性;
(4)调用citrus的db对象,将上一步实例化的对象添加并提交到数据库中,同时返回“new foo id: (该对象的id值)。
2、parse_request方法的理解:
(1)该方法含有get、post参数,默认值皆为none;
(2)定义处理异常的try;
(3)定义一个空的列表ret;
(4)将请求的form内容以CombinedMultiDict形式赋值给form,将请求链接的参数CombinedMultiDict形赋值给args;
(5)如果post为真(即非空或非0),将form的所有值(表单值)添加到ret列表;
(6) 如果get为真(即非空或非0),将链接中参数的所有值添加到ret列表;
(7)以tuple形式返回ret;
(8)如有异常,则raise/抛出自定义的异常CitrusException,errcode为module _err_ 的INVALID_REQUEST_ARGS,值1001。
3、POST http://localhost:8081/foo/postget?args1=a1&args2=a2
Content-type:application/x-www-form-urlencoded
POST_BODY:
form1=f1&form2=f2
(1)链接基本与第1点类似,请求被分发到controller.foo的postget方法,并返回(调用)此函数。
(2)调用parse_request方法 ,其中post = [‘form1‘, ‘form2‘],get=[‘args1‘, ‘args2‘],获取‘form1‘, ‘form2‘,‘args1‘, ‘args2‘对应的值,返回并赋值给form1, form2, args1, args2;如参数不够或多余,则抛出异常:std err: 1001。
(3)返回 form1, form2, args1, args2。
二、cookie和session理解:
1、cookie 主要是用于用户识别及状态管理,当客服端将用户ID和密码等相关信息发送给服务器的时候,服务器返还给客户端的不仅是所请求的信息,还有一个包含Session ID、日期及时间的cookie,并将其保存在用户的硬盘上,其生命周期为cookie上载明的过期时间或浏览器会话结束(如无载明过期时间)。session 主要是将用户的请求信息放在服务器端来保存,服务器将Session ID返还的同时,也将用户的认证状态与Session ID绑定在服务器端。
2、客户端再次访问服务器的时候,会自动发送含Session ID在内的的cookie,服务器可通过验证接收到的Session ID识别用户和其认证状态,这样可以不必客户端每次都输入用户信息。
3、由于cookie可以被人为禁止,可使用将session id 直接附加在 URL 路径的后面的URL重写技术将Session ID发送给服务器。