小编pho*_*bos的帖子

Django上传:丢弃上传的重复项,使用现有文件(基于md5的检查)

我有一个模型FileField,其中包含用户上传的文件.由于我想节省空间,我想避免重复.

我想要实现的目标:

  1. 计算上传的文件md5校验和
  2. 使用基于md5sum文件名存储文件
  3. 如果已存在具有该名称的文件(新文件重复),则丢弃上载的文件并使用现有文件

12已经可以使用了,但是如何忘记上传的副本并使用现有文件呢?

请注意,我想保留现有文件不是覆盖它(主要是为了保持修改时间相同 - 更好的备份).

笔记:

  • 我正在使用Django 1.5
  • 上传处理程序是 django.core.files.uploadhandler.TemporaryFileUploadHandler

码:

def media_file_name(instance, filename):
    h = instance.md5sum
    basename, ext = os.path.splitext(filename)
    return os.path.join('mediafiles', h[0:1], h[1:2], h + ext.lower())

class Media(models.Model):
    orig_file = models.FileField(upload_to=media_file_name)
    md5sum = models.CharField(max_length=36)
    ...

    def save(self, *args, **kwargs):
            if not self.pk:  # file is new
                md5 = hashlib.md5()
                for chunk in self.orig_file.chunks(): …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-file-upload

25
推荐指数
2
解决办法
1万
查看次数

Python tkinter:在文本小部件标签中停止事件传播

我正在写一个配色方案编辑器.对于方案的预览,我使用文本小部件,其中我插入带有相应颜色标签的文本(我以编程方式生成).

我想要的是以下行为:

  • 单击文本小部件上没有文本的任何位置:更改背景颜色
  • 单击插入标签的文本:更改标签对应的前景色

现在这是我的问题:

当我单击标记文本时,将调用标记的回调.到现在为止还挺好.但是,也调用了文本小部件的回调,尽管我在标签回调方法中返回"break"(应该停止进一步的事件处理).我怎么能阻止这个?

为了说明这个具体问题,我写了这个工作示例(对于Python 2和3):

#!/usr/bin/env python

try:
    from Tkinter import *
    from tkMessageBox import showinfo
except ImportError:
    from tkinter import *
    from tkinter.messagebox import showinfo

def on_click(event, widget_origin='?'):
    showinfo('Click', '"{}"" clicked'.format(widget_origin))
    return 'break'

root = Tk()
text = Text(root)
text.pack()
text.insert(CURRENT, 'Some untagged text...\n')
text.bind('<Button-1>', lambda e, w='textwidget': on_click(e, w))
for i in range(5):
    tag_name = 'tag_{}'.format(i)
    text.tag_config(tag_name)
    text.tag_bind(tag_name, '<Button-1>',
        lambda e, w=tag_name: on_click(e, w))
    text.insert(CURRENT, tag_name + ' ', tag_name)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

编辑:尝试Python 2.

python tkinter event-handling

6
推荐指数
1
解决办法
2166
查看次数

Python:通过**变量(some_class)访问只读属性

我经常使用这个成语'{var_name}'.format(**vars(some_class)).

但是,当我使用属性时,我无法使用它来获取属性值.

考虑这个程序:

#!/usr/bin/env python

class Foo(object):
    def __init__(self):
        self._bar = None
        self.baz = 'baz here'

    @property
    def bar(self):
        if not self._bar:
            # calculate some value...
            self._bar = 'bar here'
        return self._bar

if __name__ == '__main__':
    foo = Foo()

    # works:
    print('{baz}'.format(**vars(foo)))

    # gives: KeyError: 'bar'
    print('{bar}'.format(**vars(foo)))
Run Code Online (Sandbox Code Playgroud)

题:

有没有办法通过**vars(some_class)?访问属性值?

python dictionary properties

5
推荐指数
1
解决办法
456
查看次数