修改待办事件

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)