pyftpdlib モジュールの適応に役立つ Queue モジュールを見つけました。私は非常に厳密な FTP サーバーを実行しています。私の目標は、アップロードできるファイル名を制限することです。これは、ユーザーが自分の好きなものをアップロードできないようにするためです (実際にはアップロード クライアントのバックエンドであり、完全な FTP サーバーではありません)。
私は ftpserver Authorizer にこれを持っています:
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
私の問題は、サーバーの起動後、初めてファイルを STOR すると、最初の db 呼び出しが行われ、すべての世界が適切に取得されることです。しかし、次に別のワールドを追加すると (たとえば、is_synced=True
1 つに設定しても、self.q.get()
.has_perm() はファイルがアップロードされるたびに呼び出され、ライブ データを返す必要があります (ファイルが許可されているかどうかを確認するため))。 )。
たとえば、真新しいサーバー:
- STOR file.zip、
self.q.get()
戻り値<World1, World2>
- 他の方法などでデータベースを更新します
- STOR file2.zip、内部
fetch_worlds
、print worlds
戻ります<World1, World2, World3>
がself.q.get()
戻ります<World1, World2>
Queue モジュールを見つけたところ、役立つように思えましたが、実装を正しく行うことができません。
(また、タグを追加できませんでしたpyftpdlib
)