-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.py
92 lines (76 loc) · 2.89 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from jinja2 import Environment, FileSystemLoader
import os.path
import time
import json
def log(*args, **kwargs):
# time.time() 返回 unix time
# 如何把 unix time 转换为普通人类可以看懂的格式呢?
format = '%H:%M:%S'
value = time.localtime(int(time.time()))
dt = time.strftime(format, value)
with open('log.gua.txt', 'a', encoding='utf-8') as f:
print(dt, *args, file=f, **kwargs)
# __file__ 就是本文件的名字
# 得到用于加载模板的目录
path = '{}/templates/'.format(os.path.dirname(__file__))
# 创建一个加载器, jinja2 会从这个目录中加载模板
loader = FileSystemLoader(path)
# 用加载器创建一个环境, 有了它才能读取模板文件
env = Environment(loader=loader)
def template(path, **kwargs):
"""
本函数接受一个路径和一系列参数
读取模板并渲染返回
"""
t = env.get_template(path)
return t.render(**kwargs)
def response_with_headers(headers, status_code=200):
header = 'HTTP/1.1 {} OK\r\n'.format(status_code)
header += ''.join(['{}: {}\r\n'.format(k, v)
for k, v in headers.items()])
return header
def redirect(location):
headers = {
'Content-Type': 'text/html',
}
headers['Location'] = location
# 301 永久重定向 302 普通定向
# 302 状态码的含义, Location 的作用
header = response_with_headers(headers, 302)
r = header + '\r\n' + ''
return r.encode(encoding='utf-8')
def error(request, code=404):
"""
根据 code 返回不同的错误响应
目前只有 404
"""
# 之前上课我说过不要用数字来作为字典的 key
# 但是在 HTTP 协议中 code 都是数字似乎更方便所以打破了这个原则
e = {
404: b'HTTP/1.1 404 NOT FOUND\r\n\r\n<h1>NOT FOUND</h1>',
}
return e.get(code, b'')
def http_response(body, headers=None):
"""
headers 是可选的字典格式的 HTTP 头
"""
header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n'
if headers is not None:
header += ''.join(['{}: {}\r\n'.format(k, v)
for k, v in headers.items()])
r = header + '\r\n' + body
return r.encode(encoding='utf-8')
def json_response(data):
"""
本函数返回 json 格式的 body 数据
前端的 ajax 函数就可以用 JSON.parse 解析出格式化的数据
"""
# 注意, content-type 现在是 application/json 而不是 text/html
# 这个不是很要紧, 因为客户端可以忽略这个
header = 'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n'
# json.dumps 用于把 list 或者 dict 转化为 json 格式的字符串
# ensure_ascii=False 可以正确处理中文
# indent=2 表示格式化缩进, 方便好看用的
body = json.dumps(data, ensure_ascii=False, indent=2)
r = header + '\r\n' + body
return r.encode(encoding='utf-8')