May 16 2016
在Django中对Model对象的属性赋值,并使用save方法,save方法并不会检测Model对象变更了什么属性,而是会使用update
语句set所有的field为当前的值,也就是说只修改了部分字段,也会update所有字段的值,这样会导致2个问题:
- SQL语句过大,导致SQL执行慢(一般也不会有什么影响)
- 如果同时操作同一个Model对象,更新不同的字段,后save的操作会用老的值覆盖掉早点操作的值
所以推荐在调用save方法的时候传update_fields
参数,但是这样就要求我们必须对每次save的fields都在代码中记下来,不是很方便,所以开发一个通用的专门用来处理update_fields参数的Mixin类来解决这个问题。
May 15 2016
Tastypie提供了几种基本的认证方式比如SessionAuthentication,Django实现的web站点一般都是基于cookie-session的认证方式,在Django中使用中间件的方式处理cookie与session,以及用户认证。使用起来是很方便的。
但是在api中就不能继续使用cookie了,我们会使用accesstoken的方式来实现认证。之前同事使用redis实现了一版accesstoken的认证,但是由于考虑不周全,导致在使用过程中出现了很多bug,然后为了解决bug又写了很多恶心的兼容代码,所以抽空直接使用熟悉的session重构了认证过程。
May 14 2016
Django实现验证码有很多现成可用的库,Google后选择Django Simple Captcha,需要做一些展示与表单验证方面的定制。
验证码展示
默认的验证码展示形式不是很适合我们网站的样式,所以在settings中做了一些定制。
# 验证码设置
CAPTCHA_FOREGROUND_COLOR = '#d83a46' # 验证码字体颜色
CAPTCHA_BACKGROUND_COLOR = '#f5f5f5' # 验证码背景颜色
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_dots',) # 验证码混淆配置,这里设置的点点
CAPTCHA_CHALLENGE_FUNCT = 'random_char_challenge' # 验证码生成函数配置
为了提供验证码的识别率,定制了一个随机字符串生成函数来生成验证码。
# coding: utf-8
import random
from captcha.conf import settings
from six import u
def random_char_challenge():
chars, ret = u('acefghkprtuvwxy34679'), u('')
for i in range(settings.CAPTCHA_LENGTH):
ret += random.choice(chars)
return ret.upper(), ret
May 3 2016
时间索引
>>> import pandas as pd
>>> index = pd.date_range('20160503', periods=5)
>>> index
DatetimeIndex(['2016-05-03', '2016-05-04', '2016-05-05', '2016-05-06',
'2016-05-07'],
dtype='datetime64[ns]', freq='D')
May 3 2016
想储备点数据分析相关知识,所以抽了1天时间上了1门数据分析入门的公开课,记录一下学到的东西。
python玩转数据
ndarray 多维数组
>>> import numpy as np
>>> np.ones((3,4)) # 自动生成3*4的二维数组,全为1
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
>>> np.array([[1,2], [3,4]])
array([[1, 2],
[3, 4]])
>>> np.zeros((1,2)) # 生成全为0
array([[ 0., 0.]])
>>> np.arange(1,10,1) # 类似于range生成列表
array([1, 2, 3, 4, 5, 6, 7, 8, 9])