Django集成了用户登陆/验证/登出的模块,可以直接拿来使用,也可以进行定制,使用起来非常方便.

一,创建Django工程

$ django-admin.py startproject mysite

工程目录结构如下

lyndon@lyndon-ubuntu:~/Study/django$ tree mysite/ mysite/ ├── manage.py └── mysite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 1 directory, 5 files

二,添加主页,登陆之后才能够访问,

修改urls.py,为使代码简洁,删掉了admin相关的代码.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
url(r'^home/$', 'mysite.views.home', name='home'),
)

在mysite/mysite/目录下新建views.py文件,并添加主页的view

from django.http import HttpResponse

def home(request):
return HttpResponse('Welcome, logout')

执行

$ python manager.py runserver

在浏览器中输入 localhost:8000/home,可以看到页面中有一个logout的超链接,登陆后点击它可以退出.

三,添加登陆功能

修改views.py为home页面添加登陆认证

from django.http import HttpResponse
from django.contrib.auth.decorators import login_required

@login_required(login_url="/login/")
def home(request):
return HttpResponse('Welcome, logout')

添加login的url规则映射,并指定template名.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
url(r'^home/$', 'mysite.views.home', name='home'),
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
)

在mysite/mysite目录下新建一个 tempaltes文件夹用来存放模板文件

然后在templates目录下新建一个login.html文件

<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
</body>
</html>


在settings.py文件中添加模板的路径

TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)

join的第二个参数templates前面不能有/,否则会找不到文件

由于用户认证会用到 djang_session这个数据库,因此需要同步数据库

$ python manage.py syncdb

重新启动服务器,在浏览器中打开 localhost:8000/home时,页面被重定向到 ​​http://localhost:8000/login/?next=/home/​​,而且URL中next的值会传递给login.html中的

<input type="hidden" name="next" value="{{ next }}" />

这样,当用户登陆后,可以直接跳转到登陆之前的页面.

因为在home的view上添加了@login_required(login_url="/login/"),所以当访问home页面时,如果没有登陆,则自动跳转到登陆页面.

三,添加登出功能

Welcome, logout

在urls.py中添加登出的url规则

url(r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'logout.html'}),

在templates文件夹下添加logout.html

<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
<p>Bye</p>
</body>
</html>

点击主页的logout后,用户将登出,并重定向到logout.html

当然,如果logout的时候不需要重定向,则可以在views.py中添加一个logout的view,通过django.contrib.auth.logout(request)来手动退出.

lyndon@lyndon-ubuntu:~/Study/django$ tree mysite/
mysite/
├── db.sqlite3
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
└── templates
├── login.html
└── logout.html

2 directories, 9 files