Python

对Queryset进行查找、过滤时使用动态的字段名

对Queryset进行查找和过滤是Django中最常见的操作之一,不过一般情况下是对已经确定的字段进行查找或是过滤,例如: Entry.objects.get(id=123) # 或是更复杂一点,用到lookup type Entry.objects.get(headline__contains='Lennon') 在这样的查询中,id和headline都是已经确定的字段。 如果想要动态地指字被查询的字段,可以像这样做: kwargs = { '{0}__{1}'.format('name', 'startswith'): 'A', '{0}__{1}'.format('name', 'endswith'): 'Z' } Person.objects.filter(**kwargs) “这在Python中是非常普通和常用的技巧。”1 »

Python中被引入模块(module)中属性(attribute)和全局变量的命名空间问题

在之前的一篇博客「Django(Python)中按屏幕显示宽度截取字符串」中,我写了一个用来获取字符串在屏幕上显示宽度的函数get_screen_width(*args, **kwargs),这个函数放在一个utility.py文件中,在项目的其它文件中要使用这个函数时,可以通过这样的方式来使用它: import utility screen_width = utility.get_screen_width(input_str) 这是Python中很常见的场景,但是使用这个函数的时候我还是产生了一些困惑。 get_screen_width这个函数使用了一个定义在utility.py中的全局变量WIDTHS,问题就在于: 当我在其它文件中引入get_screen_width()并调用时,函数对WIDTHS这个全局变量的使用能否正常工作? 当时我简单地测试一下后没问题就没有多想。今天在翻看Py... »

让Django的URL对大小写不敏感

Django的URL配置是大小写敏感的,不过有的时候并不希望这样,比如刚才在添加本站的RSS功能的时候,希望/rss/和/RSS/都能读取本站的RssFeed。 解决办法很简单,只要在URL配置中的匹配表达式最前面加上(?i)即可, 例如: url(r'(?i)^rss/$', rss.PostsByAdminFeed(), name='rss') 参考资料: http://stackoverflow.com/a/1515657 »

按固定长度将列表(List)元素分组的一个问题(Python内置函数zip()的用法)

昨天在群里有人问了这样一个问题: 请问 a = [1,2,3,4,5,6,7,8,9] 怎么变成 [(1,2,3),(4,5,6,),(7,8,9)]? 我第一反应是用列表推导,在群里说了自己的想法: >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> [(a[i], a[i+1], a[i+2]) for i in range(len(a))[::3]] [(1, 2, 3), (4, 5, 6), (7, 8, 9)] 群里有人马上给出了更pythonic的方法: >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> zip(a[::3], a[1::3], a[2::3]) [(1, 2, 3), (4, 5, 6), (7, 8, 9)] 然后又有人指出我给... »

Supervisor引起的UnicodeEncodeError

网站之前的文件上传流程会把上传文件的文件名统一修改成UUID字符串,这样做避免了一些文件名造成的麻烦不过也让文件名不易被识别(搜索引擎喜欢有含义的文件名)。考虑到文件上传部分只向管理员开放,所以修改了代码让上传后的文件保持原有名称。 在本机上修改代码后可以正常运行,但是同步到服务器上后就一直出现 UnicodeEncodeError: 'ascii' codec can't encode character 的错误(在上传文件时出现) 问题分析 一开始认为GIT在合并分支过程中出问题,代码没有正确的合并到Master分支——这个猜想很快被排除了; 然后又排除了系统编码(我开发是在MAC OS或是WINDOWS系统上,服务器是UBUNTU)的问题; 后来尝试直接在服务器上用python manage.py runserver lcfcn.com:8080把网站运行起来,结果错误消失了 看来问... »

Django(Python) 中按屏幕显示宽度截取字符串

Django 的模板中默认提供了两个常用的 filter: truncatechars 和 truncatechars_html, 用于在字符串中截取指定数量的字符(详见 Django 文档说明). 如果是纯英文(或其它半角字符)组成的字符串, 使用这两个 filter 不会感觉有什么不对. 但对于中文网站来讲, 就有很大的局限性. 中文是全角字符, 而西方文字多是半角字符, 在大多数字体中, 全角和半角字符的宽度相差很大, 全角字符在屏幕上显示的宽度大概是半角字符的两倍(注意: 只是大概而以), 如果使用 truncatechars 来截取混合有全角和半角字符的字符串时, 那截取结果在屏幕上的显示宽度就很难控制. 而很多情况下, 我们希望的结果就是要截取一定宽度的字符串, 而不是一定的字符个数. 例如本站首页的讨论版新贴和最近回复两块内容中(因网站改版现在的首页已经有所不同), 我就希望... »

Django实现文件上传功能的笔记

给网站增加了上传文件的功能,以便发布内容的时候可以插入图片和附件。翻了一下Django的文档,把Django对文件上传的处理流程做个笔记总结一下。(这里的文件指的是用户上传的文件,和CSS, JS这些静态文件有所不同) 向网站上传文件的流程其实是很简单的,无非就是用户打开一个网页,里面有一个表单,表单里有一个(或多个)文件上传控件,通过上传控件选择了要上传的文件后提交,然后浏览器会向服务器发送POST请求,把要上传的文件和表单的其它内容一起发送给服务器,然后在服务器端进行处理。 用Django做的网站也是这套流程,关键在于服务器对接收到的文件的处理这块上,不同的网站程序有不同的处理方法。Django也有自己的处理流程,我把它总结成两大块:一是预处理(Upload Handlers),二是在View中处理。 这个网站的文件上传功能设计是这样:文件上传这块是独立的,不和文章有固定的联系。如果发... »