原文:http://hi.baidu.com/qbdiy/blog/item/c80fca80c88b41dc9023d954.html
1. 引言
这一讲我们要学习session,并开始接触模型(Model)。
session也就是会话,是为了在Web页面间交换数据而产生的,它保存在浏览器的cookie中。
在Django中使用session非常简单,只需要访问request对象的session属性,你可以把它当作一个字典来使用。
我们马上开始试验。给用户提供一个登录页面,上面有一个文本框用来输入用户名,还有一个提交按钮用来提交数据。当用户输入用户名,点击提交按钮后,就显示 用户已经登录,并且打印出用户输入的用户名,同时提供一个注销按钮。如果用户点击了注销按钮,就回到未登录的页面。未登录状态和登录状态是被记忆的,也就 是当你登录成功,并且没有注销时,你再次访问仍然显示的是登录成功的页面。当你没有登录或者注销后,你再次访问的就是未登录成功的页面。
2. 创建login.py文件
在newtest/目录下创建login.py文件,内容如下:
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
def login(request):
username = request.POST.get('username', None)
if username:
request.session['username'] = username
username = request.session.get('username', None)
if username:
return render_to_response('login.html', {'username':username})
else:
return render_to_response('login.html')
def logout(request):
try:
del request.session['username']
except KeyError:
pass
return HttpResponseRedirect('/login')
这里定义了两个View方法,login()和logout()。login()提供登录页面,处理用户提交的数据,判断用户是否登录。logout() 从session中删除用户名,将页面重新定向到登录页面。Django的模板支持条件判断,因此这里可以通过传入不同的字典来控制模板的生成。
login()的具体工作流程是这样的:
1) 从POST中取出username,POST中的数据是由HTML页面的表单(form)提供的。如果成功取得了username,就把它加入到 session中去(实际上就是操作session这个字典,如果username这个键不存在,就新建这个键值对,如果username这个键已存在, 就覆盖这个键值对)。
2) 从session中取出username。如果成功取得了username,就返回已登录的页面,如果没有取得username,就返回未登录的页面。这里调用不同页面就是通过往模板传入不同的字典来实现的。
logout()的工作流程更简单:尝试删除session,然后重定向到未登录页面。
3. 创建login.html文件
创建newtest/templates/login.html文件,内容如下:
{% if not username %}
<form method="post" action="/login/">
用户名:<input type="text" name="username" value=""><br/>
<input type="submit" value="登录">
</form>
{% else %}
{{ username }},您已经登录了!<br/>
<form method="post" action="/logout/">
<input type="submit" value="注销">
</form>
{% endif %}
Django模板中的if的用法和Python中相似,可以使用not, and, or。在这里,如果username不存在,则显示一个表单,显示用户名输入文本框和登录按钮。如果username存在,则显示用户名和注销按钮。
4. 修改urls.py
找到urlpatterns,修改为:
urlpatterns = patterns('',
(r'login/$', 'newtest.login.login'),
(r'logout/$', 'newtest.login.logout'),
)
5. 修改settings.py
Django的session需要使用数据库,Python 2.6中内置了sqlite3数据库,因此我们在这里直接使用sqlite3。sqlite3直接使用本地文件存储数据库,因此不存在服务器、端口、用户 名、密码、权限的配置问题,马上就可以开始使用,简单方便。
对newste/settings.py进行如下修改:
[quote]DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = './data.db'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
6. 初始化数据库
需要手动执行syncdb命令来完成数据库的初始化操作,包括创建数据库、数据表。命令如下:
$ ./manage.py syncdb
当出现是否要创建超级用户的提示时:
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):
我们选择yes,然后创建一个用户名和密码都是test的超级用户。这个超级用户在以后会用到。
7. 在Web浏览器中测试
先启动Django内置的Web服务器,然后在你的浏览器中输入http://127.0.0.1:8000/login/。接下来测试一下登录和注销。
8. 小结
这一讲中,我们学习了Django中session的使用,尝试了模板(template)渲染(render)的另一种方式,并且初步接触了模型(model)。这些内容在网站开发中将会经常用到。