跬步 On Coding

SAE上用kvdb做Django缓存

Django forum在SAE上开启了5M的memcached缓存空间,memcached是用空间计费的,所以在没什么流量的情况下每天也要用1云豆,以blog上的经验来看不用缓存的情况下mysql的消耗又比较大,所以权衡之后选择SAE自己实现的kvdb缓存后端来做缓存,这样缓存消耗的云豆可以忽略不计,又可以达到缓存加速的效果。

参考Django自带的memcache缓存后端来写kvdb的缓存后端。在插入数据的时候添加一个超时时间戳,获取数据的时候判断数据是否超时,如超时则删除数据。另外在实现清空所有数据的时候kvdb没有实现相应的方法,我自己阅读kvdb文档后通过迭代key值来实现清空,有一个可能的问题是这个迭代删除最多只能一次删除100条数据。

实现

基于django.core.cache.backends.base.BaseCache,对kvdb已有的接口进行重写适配,kvdb未实现的接口则沿用。

https://github.com/zhu327/forum/blob/sae/xp/cache.py

记搜狗微信号搜索反爬虫

反爬虫

RSS Factory前段时间又出问题了,访问微信公众号RSS一直500,完全没法用了。

经调试,发现由于爬取数据太频繁,触发了搜狗微信公众号的反爬虫,探索了下反爬虫的规则:

  1. 没有带Cookie的情况下,频繁访问触发反爬虫
  2. 带Cookie的情况下,频繁访问偶尔触发反爬出,偶现500错误
  3. 不带Cookie情况下,隔几个小时范围一下不会触发反爬虫

Python性能提升小贴士

用xrange循环时代替range ''.join() 替代 + while 1替代while True 列表推到 > for循环 > while循环 用cProfile, cStringIO and cPickle 用局部变量好于全局变量 itertools用各种迭代器,生成器 用map, reduce, filter替代列表推倒或循环 判断 a in b时,字典与集合好于列表和元组

Django forum总结

https://github.com/zhu327/forum

元旦的时候决定开始学习Django,学习最好的方式无非边学边做,所以把2年前没敢看的一个Tornado项目通过用Django实现了,这里总结下。

models

  1. 扩展默认User类

    from django.contrib.auth.models import AbstractUser
    # 继承这个类即可
    
    # setting中设置
    AUTH_USER_MODEL = 'forum.ForumUser' # 指定用户对象使用的类

Cookie与Session

前面学习了Cookie,知道Cookie是在浏览器端保存的用户状态,但是对Session一直没什么概念。学习Django的过程中直接使用了Django的认证系统,虽然用到了Session但是没有接触到Session的直接使用,然后在学习F2E.im的代码中,发现Tornado自带的secret cookie其实也能加密传递cookie,通过cookie传递一个userid到用户浏览器,认证的时候使用userid到数据库中查找用户信息,也能很好的认证用户。那为什么要使用session呢。

Tonado中认证示例:

# 重写tornado.web.RequestHandler中get_current_user方法用于认证
def get_current_user(self):
    user_id = self.get_secure_cookie("user")
    if not user_id: return None
    return self.user_model.get_user_by_uid(int(user_id)) # 从数据库中取用户信息