BLOG
Enjoy when you can, and endure when you must.
APR 22, 2014/Python
Python字符串的拆分
字符串的拆分是一个很常见的需求。Python中的字符串也为我们提供了一个split()方法用于方便地按指定格式对字符串进行拆分并返回一个列表。假如有如下字符串:23-16-70-KF-BF-8D这是一个网卡MAC地址,现在我们需要以“-”为分界点将字符串拆分成6组,split()可以方便地做到:>>> mac = '23-16-70-KF-BF-8D' >>> mac.split('-') ['23', '16', '...
APR 19, 2014/Python
Datetime中offset-naive与offset-aware时间的计算
在使用Django时,默认是开启对多时区的支持的,在获取时间的时候会是如下形式:datetime.datetime(2014, 4, 18, 15, 37, 7, tzinfo=<UTC>)我们可以利用django.utils.timezone中提供的localtime方法来将该时间转换为本地时间:>>> dt datetime.datetime(2014, 4, 18, 15, 37, 7, tzinfo=<UTC>) >>> localtim...
APR 08, 2014/Python
multipart/form-data格式的POST实体封装与提交
在Python中,我们通常使用urllib2中提供的工具来完成HTTP请求,例如向服务器POST数据。通常情况下,所有的数据都会进行URL编码并将Content-Type设置为application/x-www-form-urlencoded。不过在一些特殊的情况下(例如服务器限制而不允许使用这种类型的数据提交)或者上传文件的时候,则需要用到multipart/form-data格式的POST提交。这种时候,我们可以手动对数据进行封装,如下面的代码所做的操作:def encode_multipart_formdata(fields, files):  &n...
MAR 19, 2014/Django
Django多数据库的简单应用
在使用Django时,我们很多时候都是与一个数据库打交道,特别是对于小工程来说。不过如果要在同一工程里同时使用多个数据库呢?那也挺简单的,只需几步即可达到该目标。首先,我们肯定需要在工程配置文件(默认为settings.py)中的DATABASES配置项定义我们要使用的所有数据库。DATABASES = {     'default': {         'NAME': 'app_da...
MAR 15, 2014/Python
从Python看排序:插入排序
在学习排序算法时,我们可以经常看到插入排序的身影。我们继续用扑克牌来描述该算法的实现方式。假设有5张牌以如下方式堆放在桌面上: 将面上的一张牌拿起并放在手上: 因为这是第一张牌,所以我们无需考虑其位置。接着再从桌面上拿起面上的一张牌并与手上的牌进行比较,然后插入到正确的位置上: 接下来的操作与此相同。将梅花5取出然后放在梅花3和梅花8之间: 重复该过程直到所有的牌都从桌上拿起并插入到手中几张牌中的正确位置。 整个过程中,插入排序同时维护两组元素,一组排序后的元素和一组待排序的元素。在上面的扑克牌例子中,桌上的一叠扑克就是待排序...
MAR 12, 2014/Python
从Python看排序:选择排序
选择排序采用了我们在生活中常用的一种方式,同样以扑克牌为例对桌上的5张扑克牌进行升序排序。 这一次,我们纵观全局并选出最小的一张。在刚才那组扑克中可以发现梅花3是最小的: 我们将其取出拿到手上,其余牌则继续放在桌上: 然后重复之前的操作,可以得到第二大的牌“梅花5”: 将其拿起并放在“梅花3”的右边。 当桌面上所有的牌都拿起后,我们手上的牌将会以从小到大的顺序放置。 选择排序就与此过程类似。只是说在代码实现中,我们实际只在一个列表中完成整个操作。选择排序同样...
MAR 11, 2014/Python
从Python看排序:冒泡排序
冒泡排序在排序算法中是最简单的一种,它通过多次遍历列表,将最大的元素冒泡到列表的头部或尾部。我们通过对四张扑克牌(花色相同)以从小到大的方式进行排序来演示该算法的工作原理。首先将扑克牌面朝上放在桌上,如下图所示: 该算法要求多次遍历扑克,每次都从头开始,并在上一次遍历的前一张结束。在每一次遍历中,总是从前两张牌开始。如果前者比后者大,则交换位置。 然后比较第二张和第三张,同样如果前者更大则互换,否则保持原样。 这样依次类推,直到将最大的那一张牌移动到最后。 下图演示了接下来的两次遍历。第二次遍历将会使第二大的牌交换至倒数第二的位置上,第三次...
MAR 04, 2014/Django
为Django模型增加自定义的view权限
本文转载并翻译自《Adding a view permission to Django models》在Django中对于每一个请求都会利用Django权限模型来控制对指定对象类型的访问。这在Django看来已经再平常不过了,特别它已经在所有模型上提供了“增加”、“修改”和“删除”等默认权限。那如何添加我们的“view”权限呢?关于这个问题网上有不少答案,不过还是感觉没什么点睛之笔。经过一番摸索,我发现post_syncdb钩子最适合来完成这项任务。当使用syncdb命令时,所有的内容类型都会检测是否具有“view”权限并在没有的情况下创建。现在只要抓住这一要点并将相应的代码放在一个应用...
MAR 01, 2014/Python
用Python搞定基本认证
本文翻译自《Basic Authentication》,翻译得不好还请见凉。引言这篇教程意在阐明什么是基本认证(base authentication)以及如何用python对其进行处理。你可以从Voidspace Python Recipebook下载本文中的示例代码。第一个示例,So Let's Do It,展示了如何手动处理基本认证,以此解释其工作原理。第二个示例,Doing it Properly,则采用一种更合适更自动化的方法来处理。示例中利用了Python标准库中的urllib2模块,它提供了一个简单的接口用于从互联网请求页面。其中的urlopen方法以openers...
FEB 27, 2014/Python
两步验证的使用和TOTP在Python中的基本实现
两步验证是一些云服务或者游戏中使用得比较广泛的认证方式,用户在登录过程中,除了输入设置的固定密码之外,还需要输入由验证器生成的一次性密码。这种验证很多是基于TOTP(Time-Based One-Time Password,基于时间的一次性口令),它是对OTP(One-Time Password,一次性密码)的拓展,叫作HTOP(HMAC-based One-Time Password,基于HMAC的一次性口令)算法。其基本原理是: 客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。 进行验证时,客户端对...
<< < 2 3 4 5 6 > >>