WEB后端服务第8天
一、Tornado请求与响应
1.1 请求的参数如何获取
1.1.1 参数的来源
-
RequestHandler对象中提供的方法来获取
-
RequestHandler对象中的request对象的字典来获取
request 是HTTPServerRequest类对象
reuqest所有的信息以字典格式存储的, 且value的数据类型都是字节类型。
- arguments
- query_arguments
- body_arguements
1.1.2 读取参数据方式
根据不同的请求方式来获取不同的请求参数。
- self.get_argument()/get_arguments() 可以获取任何请求方式的请求参数
- self.get_query_argument()/get_query_arguments() 可以get请求的查询参数
- self.get_body_argument()/get_body_arguments() 可以获取put/post方法的表单参数
1.2 请求对象中包含哪些信息
-
字典类型:
- arguments(query_arguments/body_arguments)
- headers
- cookies
- files
-
普通类型
- remote_ip
- path
- method
- host
- host_name
1.3 Cookie和Header如何读取与设置
-
Cookie的设置和读取
- self.get_cookie(name, path, domain)
- self.set_cookie(name, value, path, domain)
- self.request.cookies 获取所有的cookie
- self.clear_cookie(name, path, domain) 删除
-
Header的设置和读取
- self.set_header(name, value)
- self.request.headers
- self.clear_header()
1.4 响应的信息如何设置
- self.write()
- self.set_status(code)
- self.set_header(name, value)
- self.set_cookie(name, value)
1.5 重定向
- self.redirect(’/’)
中午默写:
1. Flask如何删除默认的日志处理器
from flask.logging import default_handler
app.logger.removeHandler(default_handler)
2. 在flask的视图函数内,从request.files读取上传文件的对象有哪些属性和方法。
file = request.files.get('photo')
file.name
file.content_type
file.content_length
file.save(path)
3. 日志处理器HTTPHandler创建时,需要指定哪些参数,举例说明
from logging.handlers import HTTPHandler
handler = HTTPHandler(host, url, method)
二、 路由规则
路由则表示为url, 在url中可以使用正则向后端服务处理函数传入变量参数。类传于flask的path的变量。
在Application的handlers中指定的路由url可以配置变量,必须是一个分组。
return tornado.web.Application([
(r'/order/(\d+)', OrderHandler),
], default_host=tornado.options.options.host)
class OrderHandler(tornado.web.RequestHandler):
def get(self, code):
self.write('查询')
在指定方法处理函数中,必须提供接收url路径中的变量值的参数。如get()方法的code参数。
如果url路由中存在多个变量,在方法的参数列表也应该是多个,且由左到右依次对应接收。
但是,如果正则分组中声明了分组名, 则按名称传值。即分组名就是函数的参数名。
(r'/order/(?P<action_code>\d+)/(?P<order_id>\d+)', OrderHandler),
def get(self, order_id, action_code):
三、请求切入点 【了解】
说明: 每次请求都会创建新的RequestHandler子类的对象。
-
initialize()
在调用对应的行为方法(get, post)之前都会调用它(RequestHandler子类对象)的initialize()方法来进行初始化。
-
prepare() 【建议选择】
预处理的方法,在initialize()之后, 行为方法之前调用的。
主要用于验证参数、权限、读取缓存等。
-
on_finish()
请求处理完成后,释放资源的方法,在行为方法完成后调用。
四、API接口设计
任务: 通过api接口可以实现用户登录、用户的注册, 用户信息的变更和口令修改,及用户的注销
接口: /user
-
用户登录
请求方法: GET
请求参数(要求json格式):
参数名 类型 是否必选 name String 必须 pwd String 必须 mobile_type int 可选; 手机OS类型,如android: 1, iOS: 2, Pc: 3 响应数据(json格式):
{ "msg": "success", "token": "adkdkaid1k1k1ka00" }
-
用户注册
请求方法: POST
-
信息变更(用户名、手机号、城市)
请求方法: PUT
-
修改口令
请求方法: PUT
-
用户注销
请求方法: Delete
4.1 接收json数据
import json
json_str = self.request.body.decode()
content_type = self.request.headers.get('Content-Type')
if content_type.startswith('application/json'):
json_data = json.loads(json_str)
4.2 返回json数据
self.write({
'msg': 'success'
})
# 设置响应的头,Content-Type为application/json 表示响应数据是json格式
self.set_header('Content-Type', 'application/json')
4.3 解决跨域请求问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Referrer" content="no-referrer">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>用户登录</title>
</head>
<body>
<button onclick="login()">登录</button>
<div id="result">
</div>
<script>
function $(id) {
return document.getElementById(id)
}
function login() {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
let options = {
method: 'post',
mode: 'no-cors',
headers: headers,
data:JSON.stringify({
name: 'disen',
pwd: '123'
}),
};
request = new Request('http://10.36.174.2:8000/user', options)
fetch(request).then(response => response.json())
.then(data=>{
$('result').innerHTML = data.msg
});
}
</script>
</body>
</html>