跬步 On Coding

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)) # 从数据库中取用户信息

Python资源存档

python


python 2.7.3

python 3.2.2

Django实现JOIN查询

在写Django Model的Manager面临的一大问题是怎么样才能实现Django Model的复杂查询,比如LEFT JOIN语句的使用,Google用了不少时间,基本上了解大概,总结下,大概有3种方式。

参考

闲话 Django Raw SQL
实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

想法

写Model的时候参考http://f2m.im的表结构,发现它大量使用了JOIN查询,而且在多个表上都没有使用外键,我想不用外键也是为了方便修改,删除时产生不必要的约束。Django Model实现了ForeignKey,很方便的能查询到外键所在的实例,进一步能查询的更多,但是查询一次相当于执行一次SQL语句,这就造成了性能开销。所以F2E才会使用JOIN语句把计算的过程都交给MySQL。

Django自定义User类

参考

Substituting a custom User model
django(v1.5) 自定义用户基础

实现

Django forum,学习Django了,准备写一个论坛,想法是实现一个如 http://f2e.im/ 这样的现代论坛,数据驱动开发,第一步就是设计数据库表结构,Django自带了用户模块,但是定义的字段太少,所以需要自定义扩展下。

settings.py下新增自定义用户类: