一.创建drinker app

./manage.py startapp drinker

在INSTALL_APPS添加drinker

用户的Profile模型,django里面是可以自定义的。
通过在settings.py里面指定AUTH_PROFILE_MODULE变量的值就可以了。
AUTH_PROFILE_MODULE = ‘package.model_name’   # profiles.Profile
用户可以使用user.get_profile()来获取自己的profile信息。

在settings.py中添加

AUTH_PROFILE_MODULE='drinker.Drinker'

里面有一个@login_required标签。其作用就是告诉程序,使用这个方法是要求用户登录的。

1.如果用户还没有登录,默认会跳转到‘/accounts/login/’。这个值可以在settings文件中通过LOGIN_URL参数来设定。(后面还会自动加上你请求的url作为登录后跳转的地址,如:/accounts/login/?next=/polls/3/ 登录完成之后,会去请求/poll/3)

2.如果用户登录了,那么该方法就可以正常执行

添加

LOGIN_URL='/login/'
LOGIN_REDIRECT_URL='/profile/'

二.修改drinker/models.py

from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User # Create your models here.
class Drinker(models.Model):
    user        =models.OneToOneField(User)
    birthday    =models.DateField()
    name        =models.CharField(max_length=100)
    def __unicode__(self):
        return self.name

运行

./manage.py syncdb

三.修改drinker/admin.py

from django.contrib import admin
from drinker.models import Drinker admin.site.register(Drinker)

Meta作用

抽象类

class CommonInfo(models.Model):
  name = models.CharField(max_length = 100)
  age = models.PositiveIntegerField()
  
  class Meta:
   Abstract = True
  
class Student(CommonInfo):
  home_group = models.CharField(max_length = 5)

这样Student就有三个字段:name, age, home_group,所以CommonInfo不可以用作正常的Django model,因为它只是一个抽象基类,它并不生成一个数据库,不能直接实例化或直接保存数据。所以这种抽象基类是非常有用的,它以python的方式提供了一种方法来提取出公共信息,同时仅当子model在创建数据库时才会创建相应的数据。

四.修改drinker/forms.py

最终,如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。 Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数据。

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from drinker.models import Drinker class RegistrationForm(ModelForm):
    username=forms.CharField(label=(u'User Name'))
    email   =forms.EmailField(label=(u'Email Address'))
    password=forms.CharField(label=(u'Password'),widget=forms.PasswordInput(render_value=False))
    password1=forms.CharField(label=(u'Verify Password'),widget=forms.PasswordInput(render_value=False))     class Meta:
        model=Drinker
        exclude=('user',)
    def clean_username(self):
        username=self.cleaned_data['username']
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError("That username is already taken,please select another.")
    def clean(self):
        if self.cleaned_data['password'] != self.cleaned_data['password1']:
                raise forms.ValidationError("The passwords did not match. Please try again.")
        return self.cleaned_data
class LoginForm(forms.Form):
    username    =forms.CharField(label=(u'User Name'))
    password    =forms.CharField(label=(u'Password'),widget=forms.PasswordInput(render_value=False))

五.修改drinker/views.py

from django.http import HttpResponseRedirect
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response
from django.template import RequestContext
from drinker.forms import RegistrationForm,LoginForm
from drinker.models import Drinker
from django.contrib.auth import authenticate,login,logout def DrinkerRegistration(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method == 'POST':
        form =RegistrationForm(request.POST)
        if form.is_valid():
            user =User.objects.create_user(username=form.cleaned_data['username'],email=form.cleaned_data['email'],password=form.cleaned_data['password'])
            user.save()
            drinker=Drinker(user=user,name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])
            drinker.save()
            return HttpResponseRedirect('/profile/')
        else:
            return render_to_response('register.html',{'form':form},context_instance=RequestContext(request))
    else:
        form =RegistrationForm()
        context={'form':form}
        return render_to_response('register.html',context,context_instance=RequestContext(request))
@login_required
def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    drinker=request.user.get_profile
    context={'drinker':drinker}
    return render_to_response('profile.html',context,context_instance=RequestContext(request))
def LoginRequest(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method == 'POST':
        form=LoginForm(request.POST)
        if form.is_valid():
            username=form.cleaned_data['username']
            password=form.cleaned_data['password']
            drinker=authenticate(username=username,password=password)
            if drinker is not None:
                login(request,drinker)
                return HttpResponseRedirect('/profile/')
            else:
                return render_to_response('login.html',{'form':form},context_instance=RequestContext(request))
        else:
            return render_to_response('login.html',{'form':form},context_instance=RequestContext(request))
    else:
        form=LoginForm()
        context={'form':form}
        return render_to_response('login.html',context,context_instance=RequestContext(request))
def LogoutRequest(request):
    logout(request)
    return HttpResponseRedirect('/')

Django的User对象提供了一系列的属性和方法,其中password存储的是加密后的密码,is_staff记录用户是否有管理员权限,其他的属性可以参考官方文档。同时django.contrib.auth模块中提供了authenticate()、login()、logout()等函数,分别实现认证、登录、登出等功能。Django还为我们提供了内置的处理login、logout的view函数,但是因为其提供的行为与我们这里要的不一样,所以还需要自己实现view函数。

六.修改templates/register.html

{% extends "base.html" %}
{% block extrahead %}
    <script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
    <script src="http://libs.baidu.com/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script>
    <script>
     $(function() {
             $( "#id_birthday" ).datepicker();
             });
    </script>
{% endblock %}
{% block content %}
<form action="" method="post">{% csrf_token %}
    {% if form.errors %}
    <p> Please correct the following fields: </p>
    {% endif %}
    <div class="register_div">
        {% if form.username.errors %} <p class="error"> {{ form.username.errors }} </p> {% endif %}
        <p><label for="username" {% if form.username.errors %} class="error" {% endif %}>Username:</label></p>
        <p>{{ form.username }}</p>
    </div>
    <div class="register_div">
        {% if form.email.errors %} <p class="error"> {{ form.email.errors }} </p> {% endif %}
        <p><label for="email" {% if form.email.errors %} class="error" {% endif %}>Email:</label></p>
        <p>{{ form.email}}</p>
    </div>
    <div class="register_div">
        {% if form.password.errors %} <p class="error"> {{ form.password.errors }} </p> {% endif %}
        <p><label for="password" {% if form.password.errors %} class="error" {% endif %}>Password:</label></p>
        <p>{{ form.password}}</p>
    </div>
    <div class="register_div">
        {% if form.password1.errors %} <p class="error"> {{ form.password1.errors }} </p> {% endif %}
        <p><label for="password1" {% if form.password1.errors %} class="error" {% endif %}>Verify Password:</label></p>
        <p>{{ form.password1}}</p>
    </div>
    <div class="register_div">
        {% if form.birthday.errors %} <p class="error"> {{ form.birthday.errors }} </p> {% endif %}
        <p><label for="birthday" {% if form.birthday.errors %} class="error" {% endif %}>Birthday:</label></p>
        <p>{{ form.birthday}}</p>
    </div>
    <div class="register_div">
        {% if form.name.errors %} <p class="error"> {{ form.name.errors }} </p> {% endif %}
        <p><label for="name" {% if form.name.errors %} class="error" {% endif %}>Name:</label></p>
        <p>{{ form.name}}</p>
    </div>
    <p><input type="submit" alt="register"></p>
</form>
{% endblock %}

templates/login.html

{% extends "base.html" %}
{% block content %}
<form action="" method="post">{% csrf_token %}
{% if form.errors %}
<p> Please correct the following fields: </p>
{% endif %}
<div class="register_div">
{% if form.username.errors %} <p class="error"> {{ form.username.errors }} </p> {% endif %}
<p><label for="username" {% if form.username.errors %} class="error" {% endif %}>Username:</label></p>
<p>{{ form.username }}</p>
</div>
<div class="register_div">
{% if form.password.errors %} <p class="error"> {{ form.password.errors }} </p> {% endif %}
<p><label for="password" {% if form.password.errors %} class="error" {% endif %}>Password:</label></p>
<p>{{ form.password}}</p>
</div>
<p><input type="submit" alt="register"></p>
</form>
{% endblock %}

templates/base.html

<html>
<head>
<link rel="stylesheet" type="text/css" href="/static/css/video1.css" />
{% block extrahead %}
{% endblock %}
</head>
<body>
<div id="pageContainer">
<div id="nav_top_right">
{% if user.is_authenticated %}
<p><a href="/logout/">Logout</a></p>
{% else %}
<p><a href="/login/">login</a></p>
{% endif %}
</div>
{% block content %} {% endblock %}
</div>
</body>
</html>

templates/profile.html

{% extends "base.html" %}
{% block content %}
<p>Name: {{ drinker.name }}</p>
<p>Birthday: {{ drinker.birthday }}</p>
{% endblock %}

urls.py中添加

    (r'^register/$','drinker.views.DrinkerRegistration'),
(r'^login/$','drinker.views.LoginRequest'),
(r'^logout/$','drinker.views.LogoutRequest'),
(r'^profile/$','drinker.views.Profile'), 

五 Django 1.5.4 User Authentication 用户认证的更多相关文章

  1. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

  2. Django组件 - cookie、session、用户认证组件

    一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...

  3. Django:(7)auth用户认证组件 & 中间件

    用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuper ...

  4. [django]前后端分离之JWT用户认证

    在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了.于是我 ...

  5. Django自带的用户认证auth模块

    一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...

  6. 自定义用户认证(继承django的)

    1.在app下创建一个自己用户认证文件,文件名随意,记得为.py文件 2.编辑该userauth.py文件 #!/usr/bin/env python #coding:utf-8 from djang ...

  7. Django用户认证组件

    用户认证 主要分两部分: 1.auth模块   from django.contrib import auth 2.User对象 from django.contrib.auth.models imp ...

  8. 使用django实现自定义用户认证

    参考资料:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/    直接拉到最后看栗子啦 django自定义用户认证(使用自 ...

  9. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

随机推荐

  1. 2014 IGF 评选(转)

    前两天受邀去上海参加今年的独立游戏节评选,准确说是亚洲及太平洋地区的 IGF . 居然有接近 400 个参选游戏是让我事前没有想到的,尤其是在学生组还发现了不少好作品是个惊喜. 评审用了整整两天时间, ...

  2. Linux securecrt破解

    其实,以前接触过破解的东西,但是很多东西早就忘记了,何况是在Linux环境下. 结果我常识更改时间,哦,不是更改日期,往后推4天,结果显示了26 days remaining. 所以完全可以更改日期来 ...

  3. tcpdump dns包(linux高性能编程读书笔记2)

      tcpdump -i eth0 -nt -s 500 port domain host -t A www.baidu.com www.baidu.com is an alias for www.a ...

  4. 凸包模板 POJ1873

    // 凸包模板 POJ1873 // n=15所以可以按位枚举求凸包,再记录数据 #include <iostream> #include <cstdio> #include ...

  5. AI钻石天鹅风格

    第1步:描绘轮廓 你需要对你的设计有个总体的概念.利用照片和钢笔工具(P)描出轮廓.把填充颜色设为无,描边颜色设为黑色,1pt 粗细.这将作为你完成剩下设计的指导.编组 (Ctrl+G)你的线条并在图 ...

  6. 在Mac OS X 10.9上安装 Thrift 0.9.1

    Thrift 0.9.1 官方文档中对于Mac OS X上的安装描述适合 10.8,但不适用于10.9. Homebrew  macport 默认都不能在 10.9上安装Thrift 0.9.1成功 ...

  7. hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse

    生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...

  8. django 搭建自己的博客

    原文链接:http://www.errdev.com/post/4/ 每一个爱折腾的程序员都有自己的博客,好吧,虽然我不太喜欢写博客,但是这样骚包的想法却不断涌现.博客园虽好,可以没有完全的掌控感,搭 ...

  9. onAttachedToWindow()在整个Activity生命周期的位置及使用

    onAttachedToWindow在整个Activity的生命周期中占据什么位置? 为什么要在onAttachedToWindow中修改窗口尺寸? 一.onAttachedToWindow在Acti ...

  10. 4.VS2010C++建立DLL工程

    相关资料: http://blog.csdn.net/jshayzf/article/details/23608705 http://blog.csdn.net/huang_xw/article/de ...