刚刚找到了帮助我调整 pyftpdlib 模块的 Queue 模块。我正在运行一个非常严格的 FTP 服务器,我的目标是限制可上传的文件名。这是为了防止人们上传他们想要的任何东西(它实际上是上传客户端的后端,而不是完整的 FTP 服务器)。
我在 ftpserver 授权器中有这个:
def fetch_worlds(queue, username):
while queue.empty():
worlds = models.World.objects.filter(is_synced=True, user__username=username)
print worlds
queue.put(worlds, timeout=1)
class FTPAuthorizer(ftpserver.DummyAuthorizer):
def __init__(self):
self.q = Queue.Queue()
self.t = None # Thread
self.world_item = None
def has_perm(self, username, perm, path=None):
print "Checking permission\n"
if perm not in ['r','w']:
return False
# Check world name
self.t = threading.Thread(target=fetch_worlds, args=(self.q, username))
self.t.daemon = True
self.t.start()
self.world_item = self.q.get()
print "WORLDITEM: %s" % self.world_item
if path is not None:
path = os.path.basename(path)
for world in self.world_item:
test = "{0}_{1}.zip".format(username, world.name)
if path == test:
print "Match on %s" % test
return True
return False
我的问题是,在服务器启动后,我第一次存储文件时,它会执行初始数据库调用并正确获取所有世界。但是当我再添加另一个世界时(例如,设置is_synced=True
一个,它仍然从 .has_perm() 返回旧数据,self.q.get()
每次上传文件时都会调用它,它需要返回实时数据(检查是否允许文件)。
例如,全新的服务器:
- STOR 文件.zip,
self.q.get()
返回<World1, World2>
- 通过其他方法等更新数据库
- STOR file2.zip, inside
fetch_worlds
,print worlds
返回<World1, World2, World3>
但self.q.get()
返回<World1, World2>
刚刚找到 Queue 模块,它似乎会有所帮助,但我无法正确实现。
(也无法添加标签pyftpdlib
)