Django用户认证系统 authentication system

      Django用户认证系统 authentication system已关闭评论
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相关的代码.
  1. from django.conf.urls import patterns, include, url
  2. urlpatterns = patterns(,
  3.     url(r‘^home/$’‘mysite.views.home’, name=‘home’),
  4. )
在mysite/mysite/目录下新建views.py文件,并添加主页的view
  1. from django.http import HttpResponse
  2. def home(request):
  3.     return HttpResponse(‘Welcome, <a target=”_blank” href=”/logout/”>logout</a>’)

执行

$ python manager.py runserver
在浏览器中输入localhost:8000/home,可以看到页面中有一个logout的超链接,登陆后点击它可以退出.
三,添加登陆功能
修改views.py为home页面添加登陆认证
  1. from django.http import HttpResponse
  2. from django.contrib.auth.decorators import login_required
  3. @login_required(login_url=“/login/”)
  4. def home(request):
  5.     return HttpResponse(‘Welcome, <a target=”_blank” href=”/logout/”>logout</a>’)
添加login的url规则映射,并指定template名.
  1. from django.conf.urls import patterns, include, url
  2. urlpatterns = patterns(,
  3.     url(r‘^home/$’‘mysite.views.home’, name=‘home’),
  4.     url(r‘^login/$’‘django.contrib.auth.views.login’, {‘template_name’‘login.html’}),
  5. )
在mysite/mysite目录下新建一个tempaltes文件夹用来存放模板文件
然后在templates目录下新建一个login.html文件
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <title>login</title>
  5.     </head>
  6.     <body>
  7.     {% if form.errors %}
  8.         <p>Your username and password didn’t match. Please try again.</p>
  9.     {% endif %}
  10.     <form method=“post” action=“{% url ‘django.contrib.auth.views.login’ %}”>
  11.     {% csrf_token %}
  12.             <table>
  13.             <tr>
  14.                 <td>{{ form.username.label_tag }}</td>
  15.                 <td>{{ form.username }}</td>
  16.             </tr>
  17.             <tr>
  18.                 <td>{{ form.password.label_tag }}</td>
  19.                 <td>{{ form.password }}</td>
  20.             </tr>
  21.             </table>
  22.         <input type=“submit” value=“login” />
  23.         <input type=“hidden” name=“next” value=“{{ next }}” />
  24.     </form>
  25.     </body>
  26. </html>
在settings.py文件中添加模板的路径
  1. TEMPLATE_DIRS = (
  2.     os.path.join(BASE_DIR, ‘templates’),
  3. )
join的第二个参数templates前面不能有/,否则会找不到文件
由于用户认证会用到djang_session这个数据库,因此需要同步数据库
$ python manage.py syncdb
重新启动服务器,在浏览器中打开localhost:8000/home时,页面被重定向到http://localhost:8000/login/?next=/home/,而且URL中next的值会传递给login.html中的

  1. <input type=“hidden” name=“next” value=“{{ next }}” />

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

因为在home的view上添加了@login_required(login_url=”/login/”),所以当访问home页面时,如果没有登陆,则自动跳转到登陆页面.
三,添加登出功能
登陆之后,页面显示如下

Welcome, logout

点击logout之后,应该清楚当前用户信息,并重定向到退出页面.

在urls.py中添加登出的url规则
  1. url(r‘^logout/$’‘django.contrib.auth.views.logout’, {‘template_name’‘logout.html’}),
在templates文件夹下添加logout.html
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <title>login</title>
  5.     </head>
  6.     <body>
  7.     <p>Bye</p>
  8.     </body>
  9. </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