From 05ae8bb45c61a95a1ff18b461bd764c7dad5a52d Mon Sep 17 00:00:00 2001 From: MarkusJoe Date: Fri, 4 Feb 2022 19:49:52 +0800 Subject: [PATCH] update: use Database to record request times --- README.md | 8 ++- __pycache__/app.cpython-310.pyc | Bin 3272 -> 3127 bytes app.py | 91 ++++++++++++------------ db/__init__.py | 6 ++ db/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes db/__pycache__/db.cpython-310.pyc | Bin 0 -> 1383 bytes db/data.db | Bin 0 -> 12288 bytes db/db.py | 66 +++++++++++++++++ static/data.json | 1 - 9 files changed, 125 insertions(+), 47 deletions(-) create mode 100644 db/__init__.py create mode 100644 db/__pycache__/__init__.cpython-310.pyc create mode 100644 db/__pycache__/db.cpython-310.pyc create mode 100644 db/data.db create mode 100644 db/db.py delete mode 100644 static/data.json diff --git a/README.md b/README.md index d031c38..56355ec 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

## Python 版访问次数计数器使用了flask 作为服务端接收请求 -## 借鉴于: [Moe Counter](https://github.com/journey-ad/Moe-counter) +## 借鉴于(仿制): [Moe Counter](https://github.com/journey-ad/Moe-counter) (应该算借鉴吧) 作者:[journey-ad](https://github.com/journey-ad/Moe-counter/commits?author=journey-ad) ### 开源 @@ -25,7 +25,11 @@ ## 调用须知 - API支持`GET` 和 `POST` 方法请求 - 最大可以计数`10`位数, 超过则重置 -- + + +# 一些信息 +- 使用了Python3.6 的标准库`Sqlite3`进行数据库操作 +- 开启时占用了`32Mb`的内存 diff --git a/__pycache__/app.cpython-310.pyc b/__pycache__/app.cpython-310.pyc index 1a20d3092e04fe98397149aa128bb6d9b618dfb1..3bf705fa7d50bcf73b304de5ccb8d85bdaf233ec 100644 GIT binary patch literal 3127 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 diff --git a/app.py b/app.py index 9dce3f2..ae01f45 100644 --- a/app.py +++ b/app.py @@ -6,7 +6,7 @@ # @File Name: app.py -import json +import time from flask import Flask from flask import request from flask import Response @@ -14,44 +14,35 @@ from flask import make_response from flask import render_template from flask import send_from_directory from bin.b64img import re_sort_number_image +from db.db import ( + fetch_data, + update_data +) app = Flask(__name__) -def is_new_user(name: str, reset: bool = False) -> int: +def is_new_user(name: str): """ - 判断填入的参数是否为已有本地已有 - 如果有则该名称值加一 - 如果没有则新建一个 - :param reset: + 判断名称是否在数据库内 + 如果在则将该名称的值加1 + 如果不在数据库内则新加此名称到数据库 :param name: :return: """ - if not reset: - with open('./static/data.json', 'r', encoding='utf-8') as fp: - try: - data = json.load(fp) - except json.decoder.JSONDecodeError: - with open('./static/data.json', 'w', encoding='utf-8') as init_fp: - json.dump({}, init_fp) - all_user = data.keys() - try: - if name in all_user: # 加次数 - data[name] += 1 - return data[name] - - else: - data[name] = 0 # 新加名称 - return 0 - finally: - with open('./static/data.json', 'w', encoding='utf-8') as dump: - json.dump(data, dump) + """fetch_data 函数返回的是当前名称下访问次数的数值 为整型""" + count = fetch_data(name) + if count == 0: + return [True, 0] + elif len(str(count)) <= 10: + return [True, count] else: - with open('./static/data.json', 'r', encoding='utf-8') as reset_fp: - data = json.load(reset_fp) - data[name] = 0 # 重置该名称的值 - with open('./static/data.json', 'w', encoding='utf-8') as reset_dump: # - json.dump(data, reset_dump) + update_data(name, 0) + response = make_response({'code': 200, + 'message': '当前名称数值已经为最大, 已将数值重置', + 'timestamp': time.time()}) + response.headers['Content-Type'] = 'application/json' + return [False, response] def build_page(name: str) -> Response or str: @@ -60,8 +51,8 @@ def build_page(name: str) -> Response or str: :param name: :return: """ - count = is_new_user(name) - if len(str(count)) <= 10: + status, count = is_new_user(name) + if status: """ 计算出要在数字前加上几个0, 其实就是10减去数字位数 假如当前访问数字是300, 先将整形转换为字符串, 再使用len()计算出长度 @@ -87,11 +78,19 @@ def build_page(name: str) -> Response or str: svg_img_9=f'{sorted_image[9]}' ) # 渲染模板 else: - is_new_user(name, reset=True) - response = make_response({'code': 200, - 'message': '当前名称数值已经为最大, 已将数值重置'}) - response.headers['Content-Type'] = 'application/json' - return response + return 'LONG' + + +def too_long_to_count() -> Response: + """ + 数值太长显示此页面 + :return: + """ + response = make_response({'code': 200, + 'message': '当前数值超过了最大可计数范围(10位)已将此名称的数据重置'}) + response.status_code = 200 + response.headers['Content-Type'] = 'application/json' + return response def arg_not_be_full() -> Response: @@ -100,25 +99,29 @@ def arg_not_be_full() -> Response: :return: """ response = make_response({'code': 200, - 'message': 'Incomplete parameters'}) + 'message': '参数填写不完整', + 'timestamp': time.time()}) response.status_code = 200 response.headers['Content-Type'] = 'application/json; charset=utf-8' return response -@app.route('/API', methods=['GET', 'POST']) +@app.route('/API', methods=['GET', 'POST']) # 允许 GET 和 POST 方法 def api_page() -> Response or str: """ - API页面主函数 + API 页面函数 :return: """ if 'name' in request.args: name = request.args['name'] - if name != '': + if name != '': # 数据为空返回参数不完整界面 resp = build_page(name) - response = make_response(resp) - response.headers['Content-Type'] = 'image/svg+xml; charset=utf-8' - return response + if resp != 'LONG': + response = make_response(resp) + response.headers['Content-Type'] = 'image/svg+xml; charset=utf-8' + return response + else: + return too_long_to_count() else: return arg_not_be_full() else: diff --git a/db/__init__.py b/db/__init__.py new file mode 100644 index 0000000..c022d54 --- /dev/null +++ b/db/__init__.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2022/2/4 +# @File Name: __init__.py.py diff --git a/db/__pycache__/__init__.cpython-310.pyc b/db/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97fca6fe1fd822e333ef0b0253ecde67fa14e851 GIT binary patch literal 158 zcmd1j<>g`k0{ee|5?2E0#~=0hP%aiAA{qMfq8&$tA@xZaIm?*+Hp=rK!aw&iSQzC8N$@tJv< cCGqik1(mlrY;yBcN^?@}Kt>lc0SOic0BoZt-2eap literal 0 HcmV?d00001 diff --git a/db/__pycache__/db.cpython-310.pyc b/db/__pycache__/db.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c683e1e56e9bb04daa9cbf6d078204594ea4d8d7 GIT binary patch literal 1383 zcma)6&x;&I6t1eS{yDRo-5}yd4=s4uk+1;`1lGhAR_3?_S1-+krnjpm)0zG;TUEVr zm!8wcV+;re!OP6SLoSko;Qvxr$zuKi4}y|c-8#__#A3Rp-^c6ss=x1jU9GJJ2-a`@ zAIS{|p-E#v2|v%OAkrpbAJ&mQ4}zI2pta5VDmY2LkF6cNx@TWg1?rz zx8d4{OTGh}LJQ1r11B1jCBaCMg|$Q&F$?O@`Z}ZpA*_o>-#q*3hl_8YUOfD<1$JkN zNQ%&O*zEwpRV~UcID0oMB^N5pN>zoQ@#FofE>(Dvf<-?6|#=|#KQp~9-&y6EN!c-;PPJ*8@X2! zzXw4B#<+pzxRshTV3OBbWC*F9MZW*(;_=h}q`UJ>+xs=9d2SqWw%swbqCW&;!}gI| zd*S^F7rZsyt-S+bLH>Yr{9S?jSGWirmJ)Qv3YrEPUpFVtlMt|m*4jKpdF@vz5ok9RjdF2 literal 0 HcmV?d00001 diff --git a/db/data.db b/db/data.db new file mode 100644 index 0000000000000000000000000000000000000000..938e4828dc8bd38d73c6a5c25835a867a855d125 GIT binary patch literal 12288 zcmeI$ze@u#6bJC+QrlFm&q3)>4&$aEO7S01OF={te<8S(lSVyiTYHy+4h}B<8&1v+ zPJ*lGEcgcq-2^wm(cIa%x(UKJ+>!TQxE%Rxd0QK+q0#D~9W?`^=GiFYoGmED7{6qU z3H!RiZIE$^os;~RVfUC_KQGWH^Qgh7L65(DfMp0k00Izz00bZa0SG_<0uX?}e;3%} zxuWm$i<}AekM*YRRNCE^akE$1tS)X>)%N1jYE`+anra12t&Bc3>Ld!AL3E}X`fNs- zu&HAewv0a1k(!?Kvc-zeS=g%U)3|eN@AS2xYuagEbGy~bE=un8G65|l0bMcrpf`G@ zXL_JJy0HZe2tWV=5P$##AOHafKmY;|fB*#kNMLM4iV1Hmh#K8^rL9>{=EOLU>qlXB zFe^&39@hi=3=Ifhrjbnw88P{tq!lSdQSQV#ilx_&%6Trvy{+ZYWOfJbNhDn}x~5Nh zryjk~6W!D89~}_CfdB*`009U<00Izz00bZa0SG|A2^7Qx|7ik9*>3^lhD3??I{?{X g;d9pk7#I int: + """ + 获取数据 + :param name: + :return: + """ + cursor.execute('select * from ReqCount') + conn.commit() + data = cursor.fetchall() + + # 将返回的元组转换为字典 + temp_dict = {} + for k, v in data: + temp_dict.setdefault(k, []).append(v) + # 上方代码将元组转换为字典后字典的值会变成只有一个值的列表, 用下面两行代码去除 + for i, c in zip(temp_dict.keys(), temp_dict.values()): + temp_dict[i] = c[0] + + if name in temp_dict.keys(): + count = temp_dict[name] # 获取原数字 为 整型 + update_data(name, count) + return temp_dict[name] + else: + insert_data(name) + return 0 + + +def update_data(name: str, times: int): + """ + 更新数据 + :param name: + :param times: + :return: + """ + times += 1 + cursor.execute('update ReqCount set times=? where name=?', (times, name)) + conn.commit() + + +if __name__ != '__main__': + conn = sqlite3.connect('./db/data.db', check_same_thread=False) + cursor = conn.cursor() diff --git a/static/data.json b/static/data.json deleted file mode 100644 index 0b5772f..0000000 --- a/static/data.json +++ /dev/null @@ -1 +0,0 @@ -{"MarkusJoe": 27, "Mar": 4, "M": 2, "": 23, "oo": 103, "sdhi": 13, "sdsdsdsdsdsdawioruvniovenyrui": 0, "rui": 11, "ru": 0, "r": 0, "rr": 0, "Ma": 0, "Mark": 0, "Marku": 0, "Markus": 0, "MarkusK": 0, "MarkusKe": 0, "MarkusJ": 0, "MarkusJo": 0, "sd": 75, "1": 2, "87": 1, "20": 2, "49": 2, "36": 2, "7": 2, "88": 1, "68": 1, "65": 1, "5": 2, "91": 1, "58": 2, "89": 1, "78": 1, "40": 2, "31": 2, "33": 2, "48": 2, "47": 2, "8": 2, "55": 2, "24": 2, "81": 1, "50": 2, "83": 1, "28": 2, "13": 2, "35": 2, "85": 1, "76": 1, "0": 1, "2": 1, "3": 1, "4": 1, "6": 1, "9": 1, "10": 1, "11": 1, "12": 1, "14": 1, "15": 1, "16": 1, "17": 1, "18": 1, "19": 1, "21": 1, "22": 1, "23": 1, "25": 1, "26": 1, "27": 1, "29": 1, "30": 1, "32": 1, "34": 1, "37": 1, "38": 1, "39": 1, "41": 1, "42": 1, "43": 1, "44": 1, "45": 1, "46": 1, "51": 1, "52": 1, "53": 1, "54": 1, "56": 1, "57": 1, "59": 1, "60": 1, "61": 0, "62": 0, "63": 0, "64": 0, "66": 0, "67": 0, "69": 0, "70": 0, "71": 0, "72": 0, "73": 0, "74": 0, "75": 0, "77": 0, "79": 0, "80": 0, "82": 0, "84": 0, "86": 0, "90": 0, "92": 0, "93": 0, "94": 0, "95": 0, "96": 0, "97": 0, "98": 0, "99": 0} \ No newline at end of file