前言:无聊用简书📖写一下文章。
昨天看到这个东西 https://stool.cf/ 然后无聊实现一下。
点一下「生成」按钮,你就会得到一个长的网址
将生成的网址发给朋友,他看一次内容就会永远消失!
后端用 flask 实现 ,其实就是很简单的 redis set 和 get 然后 del 就好了。
前端其实用模版引擎 jinja2 很容易实现,不过最近刚学一下 vue ,所以就打算从这个很小很小的项目开始上手吧。
后端(核心?)代码:
snap_api.py
class SnapAPI(MethodView):
def get(self, uuid=None):
"""
get 方法返回链接的内容 阅后即焚
:param uuid: 注意这里进来的类型是 UUID 所以在 传入 get_value_and_del 的时候需要 str(uuid)
:return:
"""
if uuid is not None:
result = redis_cli.get_value_and_del(str(uuid))
# print(result)
if result is not None:
return R.ok(data=dict(
text=result
))
else:
return R.not_found()
return R.not_found()
def post(self):
"""
post 生成一条 uuid 记录然后将 text 插入 redis
:return:
"""
# ⚠️ 从 vue axios 过来的要用 request.json 获取到
# print(request.json)
text = request.json.get('text')
if text is not None:
uuid = Utils.get_uuid()
redis_cli.set_value(uuid, text)
return R.ok(data=dict(
uuid=uuid
))
else:
return R.bad_request()
views.py
snap_view = SnapAPI.as_view('snap')
web.add_url_rule('/web/<uuid:uuid>', view_func=snap_view, methods=["GET", ])
web.add_url_rule('/web/generate', view_func=snap_view, methods=['POST', ])
conn_redis.py
class ConnRedis:
def __init__(self, snap_config=None):
self.__pool = redis.ConnectionPool(host=snap_config.get('redis', 'host'),
port=snap_config.getint('redis', 'port'),
db=snap_config.getint('redis', 'db')
)
self.redis_cli = redis.StrictRedis(connection_pool=self.__pool)
def set_value(self, key: str, value: str, expire: int = Constant.REDIS_DEFAULT_EXPIRE_TIME.value) -> bool:
"""
SET KEY VALUE 参数传入都是字符串
EXPIRE KEY 超时时间
:param key:
:param value:
:param expire: (单位: 秒/s) 默认过期时间 1h
:return: bool
"""
if key is not None and key != '':
self.redis_cli.set(key, value, ex=expire)
return True
else:
return False
def get_value(self, key: str) -> str:
"""
GET KEY 获取 key 的值 result.decode()
decode() 可以将 byte 转化为 str
这样中文就不会乱码
:param key:
:return:
"""
result = self.redis_cli.get(key)
if result is not None:
return result.decode()
else:
return None
def get_value_and_del(self, key: str) -> str:
"""
获取值后顺便删除 达到阅后即焚的效果
:param key:
:return:
"""
result = self.get_value(key)
if result is not None:
# 如果不为空删除这个键
self.key_del(key)
return result
else:
return None
前端(核心?)代码:
看这篇文章的人肯定比我强还是不发了吧。
最终效果?
有点丑
不过只是为了学习嘻嘻。
开始界面?
![](https://img.haomeiwen.com/i5905242/6fe2a34e24c86432.png)
输入内容后 generate 然后 copy
![](https://img.haomeiwen.com/i5905242/43476c2378c3670e.png)
详情页
![](https://img.haomeiwen.com/i5905242/5e3659988d3a14c6.png)
🎸 再访问一次就没了。
![](https://img.haomeiwen.com/i5905242/90ebb00866531b3e.png)
好了 溜了 发觉简书的 markdown 编辑还可以 图片上传也不错。4.5🌟星好评吧。
网友评论