修改待办事件
1. url 的配置
在main.py
代码中修改如下:
urls = (
'/', 'index',
'/TodoLists', 'todo.TD',
'/TodoLists/(\w+)', 'todo.TD_Simple',
)
第一部分是匹配URL的正则表达式,像/、/help/faq、/item/(\d+)等(\d+将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。
第二部分是接受请求的类名称,像index、view、welcomes.hello (welcomes模块的hello类)
2. 编写TD_Simple处理类
GET /zoos/ID:获取某个指定动物园的信息
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
from bson.objectid import ObjectId
def get_by_id(id):
'''
按ID查询数据库
:param id:
:return:
'''
s = collection.find_one({'_id':ObjectId(id)})
if not s:
return False
return s
class TD_Simple: #针对单个待办事件处理类
def GET(self, id):
'''
按ID查询返回结果
:param id:
:return:
'''
todo = get_by_id(id)
if not todo:
return json.dumps({'error':'没找到这条记录'})
format_data = formatField(todo)
web.header('Content-Type', 'application/json')
return json.dumps(format_data)
def PATCH(self, id):
'''
按ID查询修改结果
:param id:
:return:
'''
web.header('Content-Type', 'application/json')
todo = get_by_id(id)
if not todo:
return json.dumps({'error':'没找到这条记录'})
i = web.input()
print i
title = i.get('title', None)
if not title:
return json.dumps({'error':'标题让你吃了吗?'})
collection.update({'_id':ObjectId(id)}, {"$set":{'title': title}})
#修改成功
todo = get_by_id(id)
format_data = formatField(todo)
return json.dumps(format_data)
3. 遇到web.py不支持PATCH
修改webpy源码
subl /usr/local/lib/python2.7/dist-packages/web/webapi.py
webapi.py文件第180行代码,修改内容(添加大写 PATCH )如下
methods = ['GET', 'HEAD', 'POST','PATCH', 'PUT', 'DELETE']
第315行代码,修改内容(添加 小写 patch )如下
if method.lower() in ['both', 'post', 'put','patch']:
第316行代码,修改内容(添加 大写 PATCH)如下
if e['REQUEST_METHOD'] in ['POST', 'PUT','PATCH']:
4. 测试用例
请求方式:PATCH
请求连接:http://192.168.17.129:8080/TodoLists/57e6991d1d41c8160a91251e
ID:从上节内容里面,拷贝一个id
5. 完整代码
todo.py
完整代码如下:
# coding: utf-8
import web
import json
import datetime
from datetime import *
from main import collection
from bson.objectid import ObjectId
class CJsonEncoder(json.JSONEncoder):
'''
针对date datetime 序列化处理
'''
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj)
def formatField(data):
'''
格式化字段
:param data:
:return:
'''
data['_id'] = str(data['_id'])
data['post_date'] = eval(json.dumps(data['post_date'], cls=CJsonEncoder))
return data
class TD(object): #针对待办事件列表 处理类
def POST(self):
'''
新建待办事件
:return:
'''
i = web.input()
print i
title = i.get('title', None)
if not title:
return json.dumps({'error':'标题让你吃了吗?'})
post_data={
'title':title,
'post_date':datetime.now()
}
collection.insert_one(post_data)
format_data = formatField(post_data)
web.header('Content-Type', 'application/json')
return json.dumps(format_data)
def GET(self):
'''
查看待办事件
:return:
'''
i = web.input()
print i
page = int(i.get('page', 1))
limit = int(i.get('limit', 10))
skip_num = (page-1)*10
results = []
for post_data in collection.find().skip(skip_num).limit(limit):
format_data = formatField(post_data)
results.append(format_data)
web.header('Content-Type', 'application/json')
return json.dumps(results)
def get_by_id(id):
'''
按ID查询数据库
:param id:
:return:
'''
if len(id) != 24:
return False
s = collection.find_one({'_id':ObjectId(id)})
if not s:
return False
return s
class TD_Simple: #针对单个待办事件处理类
def GET(self, id):
'''
按ID查询返回结果
:param id:
:return:
'''
web.header('Content-Type', 'application/json')
todo = get_by_id(id)
if not todo:
return json.dumps({'error':'没找到这条记录'})
format_data = formatField(todo)
return json.dumps(format_data)
def PATCH(self, id):
'''
按ID查询修改结果
:param id:
:return:
'''
web.header('Content-Type', 'application/json')
todo = get_by_id(id)
if not todo:
return json.dumps({'error':'没找到这条记录'})
i = web.input()
print i
title = i.get('title', None)
if not title:
return json.dumps({'error':'标题让你吃了吗?'})
collection.update({'_id':ObjectId(id)}, {"$set":{'title': title}})
#修改成功
todo = get_by_id(id)
format_data = formatField(todo)
return json.dumps(format_data)