diff --git a/基本结构/042 restful/tf-35-app.py b/基本结构/042 restful/tf-35-app.py index 848cbd6..661e7de 100644 --- a/基本结构/042 restful/tf-35-app.py +++ b/基本结构/042 restful/tf-35-app.py @@ -1,22 +1,75 @@ -from flask import Flask, request +# -*- coding: utf-8 -*- +from flask import Flask, request, jsonify, abort +from functools import lru_cache from cppy.cp_util import * +from functools import cache -''' -使用Flask构建一个简单的服务端 -该服务端能够接收POST请求,并返回词频统计结果 -先运行该代码搭建起服务端,然后运行request文件进行词频统计 -''' app = Flask(__name__) -@app.route('/word_frequency', methods=['POST']) -def word_frequency(): - # 获取POST请求中的JSON数据 - data = request.get_json() - data = data['file'] - # 统计词频 - word_freq = get_frequencies(data) - word_freq = sort_dict(word_freq) - return word_freq +# 模拟数据库 +books_db = [] + +# 用于缓存用户数据库的装饰器 +@lru_cache(maxsize=None) +def get_books_db(): + return books_db + +#查询所有资源 +@app.route('/books', methods=['GET']) +def get_books(): + return jsonify(get_books_db()) + +#查询某个资源 +@app.route('/books/', methods=['GET']) +def get_book(book_id): + book = next((book for book in get_books_db() if book['id'] == book_id), None) + if book is None: + abort(404) + return jsonify(book['content']) + + +# 创建或更新新资源 +@app.route('/books/', methods=['PUT']) +def update_book(book_id): + global books_db + book_to_update = request.json + print(book_to_update) + books_db = get_books_db() + + book = next((book for book in books_db if book['id'] == book_id), None) + + if book is None: + # 如果资源不存在,创建新资源 + books_db.append(book_to_update) + else: + # 如果资源存在,更新资源 + book.update(book_to_update) + # 清除缓存的数据库 + cache.delete(get_books_db) + + return jsonify(books_db), 200 + +#操作一个资源 +@app.route('/books//word_frequency', methods=['GET']) +def word_frequency(book_id): + global books_db + book = next((book for book in get_books_db() if book['id'] == book_id), None) + filepath = book['content'] + word_list = extract_file_words(filepath) + word_frequency = get_frequencies(word_list) + word_frequency = sort_dict(word_frequency) + print_word_freqs(word_frequency) + return jsonify(word_frequency), 200 + +@app.route('/books/', methods=['DELETE']) +def delete_book(book_id): + global books_db + books_db = [book for book in books_db if book['id'] != book_id] + + if len(books_db) == len([l for l in books_db if l['id'] == book_id]): + abort(404) # 用户不存在 + + return jsonify({'message': f'book {book_id} deleted'}), 200 if __name__ == '__main__': app.run(debug=True) diff --git a/基本结构/042 restful/tf-35-request.py b/基本结构/042 restful/tf-35-request.py index 235a88e..8fa98c1 100644 --- a/基本结构/042 restful/tf-35-request.py +++ b/基本结构/042 restful/tf-35-request.py @@ -1,10 +1,45 @@ +# -*- coding: utf-8 -*- import requests from cppy.cp_util import * -url = 'http://127.0.0.1:5000/word_frequency' -data_list = extract_file_words(testfilepath) -data = { - 'file': data_list -} -response = requests.post(url, json=data) -print(response.json()[:10]) +# 查询资源,得到空列表 +url = 'http://127.0.0.1:5000//books' +response = requests.get(url) +print(response.json()) +time.sleep(2) + +# - 创建一个1号资源 +print('创建一个1号资源') +book_1 = {"id": 1, "title": "Python编程:从入门到实践", "content": testfilepath} +url = 'http://127.0.0.1:5000/books/1' +response = requests.put(url,json=book_1) +time.sleep(2) + +# - 创建一个2号资源(修改testfilepaht变量) +print('创建一个2号资源') +testfilepath = testfilepath.replace('Prey.txt','Pride-and-Prejudice.txt') +book_2 = {"id": 2, "title": "深入浅出计算机组成原理", "content": testfilepath} +url = 'http://127.0.0.1:5000/books/2' +response = requests.put(url,json=book_2) +time.sleep(2) + +# - 创建一个3号资源(修改testfilepaht变量)正好有3个文件 +print('创建一个3号资源') +testfilepath = testfilepath.replace('Pride-and-Prejudice.txt','test.txt') +book_3 = {"id": 3, "title": "算法导论", "content": testfilepath} +url = 'http://127.0.0.1:5000/books/3' +response = requests.put(url,json=book_3) +time.sleep(2) + +# - 查询资源,看到结果 +print('查询资源,看到结果') +url = 'http://127.0.0.1:5000//books' +response = requests.get(url) +print(response.json()) +time.sleep(2) + +# - 操作1号资源,得到词频 +print('操作1号资源,得到词频') +url = 'http://127.0.0.1:5000/books/1/word_frequency' +response = requests.get(url) +print_word_freqs(response.json()) \ No newline at end of file