django用户注册、登录、注销和用户扩展的示例

用户部分是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果

首先我假设你对django的session、cookie和数据库、admin部分都有一定的了解,不了解的可以参考这个教程:http://djangobook.py3k.cn/2.0/

1、用户登录:

首先假设有这样的登录界面:

处理登录的视图代码如下:

def userLogin(request):
  curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()); 

  if request.method=='POST':
    print("POST")
    username=request.POST.get('name','')
    password=request.POST.get('password','')
    user= auth.authenticate(username=username,password=password)#a***********
    if user and user.is_active:
      auth.login(request, user)#b************
      return HttpResponseRedirect("/user") 

  return render_to_response("blog/userlogin.html",RequestContext(request,{'curtime':curtime}))

注:a、这里是用django自己的auth框架验证用户名和密码,有人会说,这样太不灵活了,我想用邮箱登录呢?后面我们会说直接用django.contrib.auth.models.User 模型来直接操作用户数据,这样就可以做自己想要的验证了。
b、用户信息被验证无误后需要把用户登录的信息写入session中

2、用户注销

注销比较简单,只需要在session中删除对应的user信息就ok了

def userLogout(request):
  auth.logout(request)
  return HttpResponseRedirect('/user') 

3、用户注册

注册的界面如下:

用户名、密码、邮箱是基本的注册信息,这是django自带的,下面的电话是扩展的用户信息,至于这么扩展用户信息,一会会讲,先透露下我采用的是profile的扩展方式(个人喜好吧,我觉得这种方式简单明了)

注册的视图view代码:

def userRegister(request):
  curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()); 

  if request.user.is_authenticated():#a*******************
    return HttpResponseRedirect("/user")
  try:
    if request.method=='POST':
      username=request.POST.get('name','')
      password1=request.POST.get('password1','')
      password2=request.POST.get('password2','')
      email=request.POST.get('email','')
      phone=request.POST.get('phone','')
      errors=[] 

      registerForm=RegisterForm({'username':username,'password1':password1,'password2':password2,'email':email})#b********
      if not registerForm.is_valid():
        errors.extend(registerForm.errors.values())
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors}))
      if password1!=password2:
        errors.append("两次输入的密码不一致!")
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 

      filterResult=User.objects.filter(username=username)#c************
      if len(filterResult)>0:
        errors.append("用户名已存在")
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 

      user=User()#d************************
      user.username=username
      user.set_password(password1)
      user.email=email
      user.save()
      #用户扩展信息 profile
      profile=UserProfile()#e*************************
      profile.user_id=user.id
      profile.phone=phone
      profile.save()
      #登录前需要先验证
      newUser=auth.authenticate(username=username,password=password1)#f***************
      if newUser is not None:
        auth.login(request, newUser)#g*******************
        return HttpResponseRedirect("/user")
  except Exception,e:
    errors.append(str(e))
    return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 

  return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime})) 

注:

a、验证用户是否登录了,已经登录就没必要注册了(当然这只是练习使用,实际生产情况可能不一样)

b、注册表单传过来的数据需要一些基本的验证,怎么验证表单数据可以参考这个教程:http://djangobook.py3k.cn/2.0/chapter07/

c、用User模型查找要注册的用户名是否存在,如果用户已经存在就需要提示注册的客户更换用户名

d、直接利用User模型把通过验证的用户数据存入数据库,需要注意的是,保存密码信息时需要使用set_password方法(因为这里有个加密的过程)

e、存储用户的扩展信息(这里是用户的电话号码),这里用到自定义的用户扩展模型UserProfile,具体怎么扩展用户后面会讲

f、用户登录前需要先进行验证,要不然会出错

g、用户登录

4、用户扩展

网上关于django的用户扩展方式有好几种,个人比较倾向于Profile的方式,主要是这种方式简单清楚,扩展步骤如下:

A、在你App的models中新建一个UserProfile模型

from django.contrib.auth.models import User 

class UserProfile(models.Model):
  user=models.OneToOneField(User,unique=True,verbose_name=('用户'))#a******
  phone=models.CharField(max_length=20)#b******

注:a、UserProfile其实就是一个普通的model,然后通过这一句与django的User模型建立联系

b、扩展的用户信息

B、python manage.py syncdb 在数据库内创建userprofile的表

C、如何调用user的扩展信息呢?很简单,先得到user,然后通过user提供的get_profile()来得到profile对象,比如

user.get_profile().phone

D、如何更新和存储user的profile信息呢,其实在之前的用户注册部分我们已经使用了这样的功能,userprofile其实也是一个model,我们只要通过user模型得到user的id,就可以通过UserProfile模型来操作对应的profile信息:

user=User()
user.username=username
user.set_password(password1)
user.email=email
user.save()
#用户扩展信息 profile
profile=UserProfile()
profile.user_id=user.id
profile.phone=phone
profile.save() 

E、我们能在程序中操作用户扩展信息了,那我想在admin后台中编辑扩展信息要怎么做呢:

很简单,只要在你的APP的admin.py中添加下面的语句就行了

class UserProfileInline(admin.StackedInline):
  model=UserProfile
  fk_name='user'
  max_num=1 

class UserProfileAdmin(UserAdmin):
  inlines = [UserProfileInline, ] 

admin.site.unregister(User)
admin.site.register(User,UserProfileAdmin) 

这是我学习django时的一些经验,也许不全对,仅供参考,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Django小白教程之Django用户注册与登录
(0)

相关推荐

  • Django小白教程之Django用户注册与登录

    Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 学习django学得超级吃力,最近弄个最简单的用户登录与注册界面都是那么难,目前算是基本实现了,虽然功能特别特别简单但是做一个记录,以后学习深入了再来补充: 首先创建项目,到项目所在目录:django-admin startproject demo0414_userauth 进入项目:cd demo0414_userauth 创建相应的app:django-admin startapp acco

  • django用户注册、登录、注销和用户扩展的示例

    用户部分是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果 首先我假设你对django的session.cookie和数据库.admin部分都有一定的了解,不了解的可以参考这个教程:http://djangobook.py3k.cn/2.0/ 1.用户登录: 首先假设有这样的登录界面: 处理登录的视图代码如下: def userLogin(request): curtime=time.strftime("%Y-%m-

  • django的登录注册系统的示例代码

    摘要 django框架本身自带有登录注册,也可以自己写登录注册,下面将介绍这这2种方式实登录注册 一.自己写登录注册登出 1.注册regist 注册采用的是form表单,提交到数据库,在登录的时候,查询数据看,看用户有没有注册,如果用户没有注册,则返回注册页面注册 (1)models.py文件里创建相关的字段: 用户名字/用户密码/cookies携带的ticket from django.db import models # Create your models here. class User

  • Django用户登录与注册系统的实现示例

    1.1.创建项目和app django-admin startproject mysite_login python manage.py startapp login 1.2.设置时区和语言 Django默认使用美国时间和英语,在项目的settings文件中,如下所示: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 我们把它改为亚洲/上海时间和中文 LANGUAGE_

  • Python Django简单实现session登录注销过程详解

    开发工具:pycharm 简单实现session的登录注销功能 Django配置好路由分发功能 默认session在Django里面的超时时间是两周 使用request.session.set_expiry(60)设置超时时间,以秒为单位 在Django配置文件里配置session链接 https://www.jb51.net/article/166988.htm urlpatterns = [ path('admin/', admin.site.urls), path('app01/', in

  • laravel 实现用户登录注销并限制功能

    1. 创建登录控制器 在项目根目录输入: php artisan make:controller Admin/LoginController 2.创建用户模块 以及数据库 php artisan make:model Model/Admin -m 运行之后 项目中会新增两个PHP文件 新创建了admins用户表,此用户表默认新建中只有主键,创建时间,编辑时间.我们接下来新加两个字段 用户名(username) 和密码(password). 在up函数中加上这两个字段,后面可以按自己的需求添加属性

  • Django如何实现网站注册用户邮箱验证功能

    我们在很多网站上都可以看到用户注册使用电子邮件激活或启用的方式.也就是说,用户在注册后填写正确的电子邮件地址,接着网站会发送一封启用电子邮件到用户设置的电子邮件的邮箱中,并在邮件中提供一个激活或启用的链接,在用户单击此链接后,账号正式激活或启用. 这里我们使用 Django 的 django-registration 模块可以快速实现这一过程. 1. django-registration 安装与设置 使用 pip 安装: pip install django-registration 此模块暂

  • 详解Django之auth模块(用户认证)

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于数据库中. 除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录 auth里的方法 如果想使用auth模块的方法,必须要先导入auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法

  • Django如何使用jwt获取用户信息

    HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决session不共享的问题,常用的解决方案有4种:客户端Cookie保存.服务器间Session同步.使用集群管理Session.把Session持久化到数据库. jwt:json web token 在用户注册登录后,记录用户登录状态,我们可以用cookie和session来做状态保持,cookie存储在

  • Java+mysql用户注册登录功能

    最近刚刚开始学习mysql,所以就写了这个很基本的用户注册登录的功能来练练手.虽然这个很简单,但是我还是看到了自己学习的进步,很开心.哈哈哈. 这里要注意数据表的建立: 直接上代码吧,里面注释很详细了. package client; import java.sql.*; import java.util.*; public class Client { /** * 用以实现用户的注册和登录 */ private static String username;//用户登录注册的姓名 privat

随机推荐