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