如何在不使用睡眠功能的情况下每N次做X?
How to do X every N time without using the sleep function?
我想制作一个简单的 python 程序来为 Flask 网站生成验证码。我可以生成图像,但是如果我将它保存在例如在 /images/captcha_{id}.png
中,随着网站的使用,我会有大量的旧验证码。
我尝试创建一个脚本,使用睡眠功能每隔 N 次删除旧的验证码,但问题是,我禁用了网站中的所有 activity N 次.
验证码系统如下:
import secrets, string
from PIL import Image, ImageFont, ImageDraw
def gen_captcha(id):
alpha = string.ascii_letters + string.digits
captcha = "".join(secrets.choice(alpha) for i in range(8))
img = Image.new("RGBA", (200,100), (3, 115, 252))
font = ImageFont.truetype("arial.ttf",20)
w,h = font.getsize(captcha)
draw = ImageDraw.Draw(img)
draw.text((50,50), captcha, font=font, fill=(255, 239, 0))
img.save("captcha_{}.png".format(str(id))
return captcha
flask 应用程序基本上请求输入并根据给定的 id 显示验证码,然后说 if req_captcha == captcha: return "You solved the captcha"
如果您不解决它也会出错。
我想知道的是,我是否可以制作一个作为后台进程运行的小脚本来删除我的旧验证码。
我想你要找的是 cron job。设置一个 运行 一个 bash 脚本来清理昨天的验证码。
一种可能的方法是使用 Python 中可用的 multiprocessing
或 threading
模块。它们在 API 方面非常相似。我的回答将基于多处理方法,但您可以自己评估线程方法是否更适合您的需求。你可以参考这个question作为例子。这是一个示例实现:
import os
import time
from multiprocessing import Process
def remove_old_captchas():
if os.fork() != 0:
return
print('Running process to remove captchas every 5 seconds ...')
while True:
time.sleep(5)
print("... Captcha removed")
if __name__ == '__main__':
p = Process(target=remove_old_captchas)
p.daemon = True
p.start()
p.join()
print('Main code running as well ...')
while True:
time.sleep(1)
print("... Request served")
在其输出中,您可以看到验证码以固定的时间间隔被删除:
Running process to remove captchas every 5 seconds ...
Main code running as well ...
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served
在设计方面,我可能仍然会像另一个答案中提到的那样使用 cron 作业,但是您询问了 运行 后台任务,所以这是一个可能的答案。您可能还喜欢 subprocess
模块。
我想制作一个简单的 python 程序来为 Flask 网站生成验证码。我可以生成图像,但是如果我将它保存在例如在 /images/captcha_{id}.png
中,随着网站的使用,我会有大量的旧验证码。
我尝试创建一个脚本,使用睡眠功能每隔 N 次删除旧的验证码,但问题是,我禁用了网站中的所有 activity N 次.
验证码系统如下:
import secrets, string
from PIL import Image, ImageFont, ImageDraw
def gen_captcha(id):
alpha = string.ascii_letters + string.digits
captcha = "".join(secrets.choice(alpha) for i in range(8))
img = Image.new("RGBA", (200,100), (3, 115, 252))
font = ImageFont.truetype("arial.ttf",20)
w,h = font.getsize(captcha)
draw = ImageDraw.Draw(img)
draw.text((50,50), captcha, font=font, fill=(255, 239, 0))
img.save("captcha_{}.png".format(str(id))
return captcha
flask 应用程序基本上请求输入并根据给定的 id 显示验证码,然后说 if req_captcha == captcha: return "You solved the captcha"
如果您不解决它也会出错。
我想知道的是,我是否可以制作一个作为后台进程运行的小脚本来删除我的旧验证码。
我想你要找的是 cron job。设置一个 运行 一个 bash 脚本来清理昨天的验证码。
一种可能的方法是使用 Python 中可用的 multiprocessing
或 threading
模块。它们在 API 方面非常相似。我的回答将基于多处理方法,但您可以自己评估线程方法是否更适合您的需求。你可以参考这个question作为例子。这是一个示例实现:
import os
import time
from multiprocessing import Process
def remove_old_captchas():
if os.fork() != 0:
return
print('Running process to remove captchas every 5 seconds ...')
while True:
time.sleep(5)
print("... Captcha removed")
if __name__ == '__main__':
p = Process(target=remove_old_captchas)
p.daemon = True
p.start()
p.join()
print('Main code running as well ...')
while True:
time.sleep(1)
print("... Request served")
在其输出中,您可以看到验证码以固定的时间间隔被删除:
Running process to remove captchas every 5 seconds ...
Main code running as well ...
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served
... Request served
... Request served
... Captcha removed
... Request served
... Request served
... Request served
在设计方面,我可能仍然会像另一个答案中提到的那样使用 cron 作业,但是您询问了 运行 后台任务,所以这是一个可能的答案。您可能还喜欢 subprocess
模块。