在Django中直接将用户login

在设计站点的时候,也许会有这种情况:当用户注册后,直接帮当前用户登陆,这时可以使用from django.contrib.auth import login的方法来完成用户的状态的改变,但这里有点问题,就是在设置session的时候,会设置一个BACKEND_SESSION_KEY这个东西,如果你使用默认的login view的时候使用from django.contrib.auth import authenticate来对User对象设置一个值。如果不使用authenticate的话,那只有手工自己设置了:

new_user.backend = “%s.%s” % (‘django.contrib.auth.backends’, ‘ModelBackend’)

这样就OK了

Django中与Model有关的三个特性

使用Django也差不多有一段时间了,而且也在项目中使用了,刚开始时代码写的很烂,现在看起来非常不爽。我想说一下关于model部分的问题,希望能给初学者一些建议吧。

这里有三个关键部分:Managermodel方法Signals。Django是一种非常快速的开发框架,有时候文档还没看完,就能写好多东西,但如果看了文档,那么可以以更少的代码完成相同的功能。

根据Manager的文档说明,Manager用于操作表级别的数据,可以用来对表中的多个项进行操作,在Manager中可以做任何事情,所以再看了Signals后,感觉功能有重叠,等下我会说明为什么重叠。当默认Manager提示的功能不能满足你的需要的时候,那么你就扩展它吧,而且model还可以有多个Manager。

Model方法是行级别的方法,用于对行进行操作,比如:当ModelA是ModelB的外键时,那么可以通过ModelA的Model方法来创建ModelB。Model中的方法最封装成不需要传参数的方法,这样就可以直接在模版中调用了,这样大大减少了代码量。当然Manager也可以这样做,通过for标记遍历Querysets,然后直接调用Model中的方法。

Signals这个东西是非常有用的一个机制,但这个东西还没有正式的文档。所以知名度不是很高,但还是有一个Wiki页面说明了这个东西使用。其实Signals在Django中有大量的应用,比如:在初次syncdb的使用,会让你创建超级管理员,在这里就有一个Signal,post_syncdb,当系统执行syncdb的时候,会调用已监听的方法,通过这个方法实现创建超级管理员向导。系统自带许多Signal,其中有个post_save,这个Signal用于监听Model对象保存后,执行的操作,比如:在现在中都会添加一个UserProfile来扩展User Model,但自带的添加用户方法,并不会添加UserProfile,所以可以使用post_save来监听User Model,当创建User之后,再创建UserProfile,这样不必修改Django源代码就可以使用。当然你也可以使用Manager来完成这个操作,这就是我说的重复部分,怎么用那就看自己的了。

使用django第三方的库小提示

在使用Django的开发过程中,可能会经常会用其它非官方的组件。如果你使用使用它们,一般情况下必须把它们放在项目的根目录下,或者是python的其它环境变量下,如果想把它们整合进项目,但又不想放在项目的根目录,那么可以在settins中加入一个环境变量,比如:

DJANGO_THIDR_COMPONENTS_PATH = ‘django-third’
sys.path.append(os.path.join(os.path.dirname(__file__), DJANGO_THIDR_COMPONENTS_PATH))

生成Django文档

由于这几天被逼着写一些文档,顺便找了下跟Django有关的文档。后面发现在一直没注意的一个地方,就是在admin里面有个Documentation的链接,点击进入后如果已经安装了docutils库,则显示一些文档,包括:Tags、Filters、Models、Views、Bookmarklets。其中在Models中,会显示定义的Field和类方法,类和类的方法都可以使用__doc__来写注释。而Field则有一个help_text参数,用于描述Field。Views的部分功能好像有点问题。

一切都非常好。 

触摸Django

从昨天开始看了下Django这个Python框架,Django在国内的Python社区里还是挺火的。看来文档的tutorial部分,有了基本的了解。结构非常清晰,不像Zope非常深Innocent。相比Plone这种完整的系统来说,Django只是提供了快速开发的框架,这样适应性更强,虽然Django是源自新闻系统,但Profile不像Plone这样定性。tutorial部分很好的说明了:

Object-relational mapper

Define your data models entirely in Python. You get a rich, dynamic database-access API for free — but you can still write SQL if needed.

Automatic admin interface

Save yourself the tedious work of creating interfaces for people to add and update content. Django does that automatically, and it’s production-ready.

Elegant URL design

Design pretty, cruft-free URLs with no framework-specific limitations. Be as flexible as you like.

Template system

Use Django’s powerful, extensible and designer-friendly template language to separate design, content and Python code.

这些官方的描述。

Djangobook之模板系统

今天花了些时间看Djangobook的翻译文章。感叹她的模板系统和URL配置非常有杀伤力。我来把文章的模板系统总结一下,详情还是去这里

根据Djang的设计哲学,模板所有需要的变量通过Context传过来,所以模板只能组织数据。

使用变量如:{{foobar}}。

{% %}组成块标签,在块标签中可以使用if/else做逻辑判断;使用for foo in bar来遍历变量,在使用for foo in bar的时候,还可以使用forloop变量,提供循环信息;ifequal/ifnotequal用来比较两个变量之间的关系,当然支持else。

注释使用{# comment #}。

过滤器”|”,了解linux都知道“管道”,这里意思差不多。例子:{{ my_text|escape|linebreaks }} 。

使用{% include ‘foobar’ %}来导入其它的模板文件。

最后颇具杀伤力的继承,你可以定义一个基本的模板,并在里面设计相应的block。 然后让其它模板继承于他,你可根据需要来重载相应的block。这样可以最大化减少冗余。详细说明请参考文章原文。

在Ubuntu上构建Django开发环境

最近,在Ubuntu7.04上面构建Django的开发环境时,还真碰到点头痛的问题,但最终还是解决了,于是作个笔记。

在Ubuntu7.04中,默认安装的Python是2.5,这个版本比较新,可能有些包不支持,所以我还要装个Python2.4。python2.4-dev这个包必须要装,否则在编译其它包的时候,会说Python.h和 structmember.h 文件找不到。

apt-get install python2.4 python2.4-dev

这之后,我有个头痛的问题,在这之前我安装了beryl的管理器,这个管理器是用Python写的,所以要注意版本问题,不要随便改动/usr/bin/python的指向。你可以在/usr/bin/beryl-settings的第一行指定用什么Python版本。

接着,我使用mysql作数据库服务,所以需要安装mysql和mysqldb,mysqldb是用于python与mysql通信的包。

apt-get install mysql-server

apt-get install libmysqlclient15-dev

由于Python提供了easy_install的工具,所以我们就通过这个来安装Python的包,当然要先安装这个东西,这个说明有详细。安装完毕后,可以在/usr/bin/easy_install里面更改Python路径,我这里指定为python2.4。然后安装mysqldb。

easy_install MySQL-python

至于Django的安装参考官方说明 

会了方便管理代码,最好建个版本管理。我使用的subversion,有机会试度Bazaar。

apt-get install mysql-query-browser

这是官方提供的图形管理程序。

apt-get install rapidsvn

这是一个svn的图形化管理程序。

至于开发工具,可以根据自己的喜好来选择吧。其实,eclipse+pydev+Subclipse是个不错的选择。

MediaTemple的Django容器

由于计划使用Django来开发一个站点,所以在关注虚拟主机的情况。以前在v2ex.com那里知道MediaTemple,所以就在上面找了找,现在还无法支持Django,但在官方的Weblog中找到了Django容器正在开发的信息。而且,多数据库的功能也在开发。

How many database users does my (gs) Grid-Service come with?
Each (gs) Grid-Service currently comes with a single database user capable of creating up 100 databases. We are working to allow multiple database users per (gs) Grid-Service and expect to have this feature available soon.

如果要买MediaTemple(gs)的服务的话,那每年要支付$200。 

Django的文件上传

前几天,使用Django的FileField的时候发现非常不好用,并不是每一个文件都需要存放在以日期为名称的目录下面。在网上的论坛看到的方法是一个新的类继承FileField,并重载两个方法,但这样做的话就不能重新生成sql语句了,这样有点不爽。后来发现一个方法是重载Model的_save_FIELD_file方法,这样各个class之间互不影响。而且对文件的生成可以做得极大的控制。比如:上传一个zip文件夹,并解包保存。

django的测试框架

虽然知道单元测试的好处,但一直没有运用起来。在django的svn版本中,新的测试框架正在开发中,已经有一个文档了。虽然没仔细看,但已经可以测试页面级别了。非常有意思,看来还是把单元测试搞起来才行。