在Python中存储testbin/pastebin文件
我想搭建一个自己的私人粘贴板,这样我就可以在自己的私有服务器上保存HTML文件,方便测试和玩耍。我希望有一个文本框可以输入内容,保存文件后,还能查看我保存的所有文件。
我打算用Python来写这个程序,想知道最实用的存储方式是什么?是用SQLite数据库,还是直接用普通的文件?
还有一个我比较担心的问题是文件名的唯一性,显然我不想有重复的文件名(也许可以用“标题”和时间戳来保存?)我应该怎么设计这个结构呢?
3 个回答
普通文件确实更有效。把数据库留给更复杂的查询。
如果你需要对文件进行一些格式化,比如正确高亮代码,最好在保存文件之前就做好这些格式化。这样每次显示文件的时候就不需要再格式化了。
你肯定需要确保所有文件名都是独一无二的,但这其实很简单。你可以检查一下文件是否已经存在,如果存在,就在文件名后面加个数字,然后再检查一次,如此反复。
另外,不要把所有文件都放在一个目录里,因为如果一个目录里有很多文件(比如大约100万个),文件系统的表现会变得很差。所以你可以把存储结构设计成这样:
FILE_DIR/YEAR/MONTH/FileID.html,然后把“YEAR/MONTH/FileID”这一部分存到数据库里,作为文件的唯一标识。
当然,如果你不太担心性能(比如用户不多),你可以选择把所有东西都存到数据库里,这样管理起来会简单很多。
你有没有考虑过试试 lodgeit?这是一个免费的在线文本分享工具,你可以自己搭建。至于设置起来有多难,我就不太清楚了。
从他们的代码来看,他们使用了数据库来存储数据(用sqllite就可以)。他们的文本分享表格结构是这样的(这是sqlalchemy的表格声明风格)。代码部分只是一个文本字段。
pastes = Table('pastes', metadata,
Column('paste_id', Integer, primary_key=True),
Column('code', Text),
Column('parent_id', Integer, ForeignKey('pastes.paste_id'),
nullable=True),
Column('pub_date', DateTime),
Column('language', String(30)),
Column('user_hash', String(40), nullable=True),
Column('handled', Boolean, nullable=False),
Column('private_id', String(40), unique=True, nullable=True)
)
他们还建立了一个层级结构(可以看到自我连接),这个结构是用来管理版本的。
我之前在Django里写过类似的东西,用来测试jQuery代码片段。你可以看看这个链接:
如果你感兴趣,我把代码放在GitHub上了,地址是 http://github.com/dz/jquerytester/tree/master。
如果你是在用纯Python,有几种方法可以处理命名:
如果是存成文件,可以让用户输入一个名字,然后加上当前时间的随机值,最后生成一个哈希值作为文件名。
如果你在用mysqlite或者其他数据库,就直接用一个数字作为唯一标识符。
就我个人来说,我会选择第二种方法。这样简单,能确保每个文件名都是独一无二的,而且方便你快速找到不同的“文件”。