Django中对于Authentication用户User的扩展

来源:互联网 发布:win7 apache无法启动 编辑:程序博客网 时间:2024/04/25 08:57

django.contrib.auth.models 中的User为我们提供了很强大的登录、登出系统,但是在使用时未免有一些不符合我们的预先期望,可能需要对User进行一些额外的扩展。

以下提供一个进行扩展的方法。

我在实践中,开始是单独仅仅用Django提供的User,但是一直出现403 Forbidden页面,而且按照提示进行了修改,可是还是无法消除这个问题,后来无奈放弃了转而想到这种思路,在网上查了一下相关资料,确有这样的实现方法。

在模型中使用OneToOneField实现相互关联,models.py文件如下

class User_c(models.Model):
    user = models.OneToOneField(User)
    disc = models.CharField(max_length=40)
    def __unicode__(self):
        return self.user.username

你可以对上述模型进行不同的扩展,只要有user OneToOneField就可以了,这样也可以避免上述问题,但是必须得引入

from django.views.decorators.csrf import csrf_exempt

并且在视图前加上csrf_exempt,有可能需要在表单中加入{% csrf_token %}

urls文件配置如下

    url(r'^login/$', views.login),
    url(r'^user/login/$', views.user_login),
    url(r'^register/$', views.register),
    url(r'^user/register/$', views.user_register),
    url(r'^user/logout/$', views.user_logout),

至于如何使用该模型呢?

>>>from django.contrib.auth.models import User

>>>from WWTest.models import User_c

>>>user = User.objects.create_user(username='hello world', password='nihaoshijie')

>>>uc = User_c.objects.create(user=user, disc='wo chi django xinshou cainiao')

这样你就创建了一个User_c对象了,你可以在数据库中看到有user_c表,还有auth_user表,因为创建了User对象


例如我们现在可以实现一个登录、注册、注销功能

@csrf_exempt

def register(request):
    return render_to_response('register.html')
def user_register(request):
    username = request.POST['username']
    password = request.POST['password']
    disc = request.POST['disc']
    try:
        u = User.objects.create_user(username=username, password=password)
        user = User_c.objects.create(user=u, disc=disc)
        return render_to_response('login.html')
    except:
        return HttpResponse('false')

register.html如下

       <form method="POST" action="/user/register/">
               <input type="text" name="username" />
               <input type="password" name="password" />
               <input type="text" name="disc"  />
            <input type="submit" value="ok" />
       </form>

表单发送至/user/register/地址里,然后调用user_register的视图函数,注意User.objects.create_user这个函数会产生错误,如果用户创建不成功会报错,需要用到try-except

def login(request):
    return render_to_response('login.html')
@csrf_exempt
def user_login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    if user is not None and user.is_active:
        auth.login(request, user)
        return HttpResponseRedirect('/index/')
    else:
        return HttpResponse('No')

login.html如下

    <form method="post" action="/user/login/">
        <input type="text" name="username"/>
        <input type="password" name="password"/>
        <input type="submit" value="ok"/>
    </form>

用户登录界面可以自己设计定义,表单得action地址为/user/login/此时便可以执行user_login视图函数

user = auth.authenticate(username=username, password=password)

如果登录不成功则user为None


@csrf_exempt
def user_logout(request):
    print 'good bye user: ', request.user
    auth.logout(request)
    return render_to_response('login.html')

index.html如下

<input type="button" name="Submit" value="按钮" onClick="window.location.href='/user/logout/'">

这个按钮当点击时触发window.location.href='/user/logout/' 跳转至此页面触发user_logout实现登出功能,auth.logout函数不会产生错误,哪怕你没有在线用了该函数也不会报错



0 0
原创粉丝点击