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


Posted in Python onMarch 19, 2018

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

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

1、用户登录:

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

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

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

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用户注册、登录、注销和用户扩展的示例

用户名、密码、邮箱是基本的注册信息,这是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的表

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

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时的一些经验,也许不全对,仅供参考,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python绘制图表大全总结
Feb 11 Python
Python编程argparse入门浅析
Feb 07 Python
Python中存取文件的4种不同操作
Jul 02 Python
python使用PIL模块获取图片像素点的方法
Jan 08 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
python三方库之requests的快速上手
Mar 04 Python
Python初学者常见错误详解
Jul 02 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
python 用Matplotlib作图中有多个Y轴
Nov 28 Python
python3处理word文档实例分析
Dec 01 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 #Python
遗传算法python版
Mar 19 #Python
python实现简单遗传算法
Mar 19 #Python
python psutil库安装教程
Mar 19 #Python
Python递归实现汉诺塔算法示例
Mar 19 #Python
Python实现替换文件中指定内容的方法
Mar 19 #Python
python书籍信息爬虫实例
Mar 19 #Python
You might like
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python线性方程组求解运算示例
2018/01/17 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Python中的 enum 模块源码详析
2019/01/09 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
2019史上最全Database工程师题库
2015/12/06 面试题
趣味运动会活动方案
2014/02/12 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
债务纠纷代理词
2015/05/25 职场文书
运动会广播稿20字
2015/08/19 职场文书
诉讼和解协议书
2016/03/23 职场文书
详解MySQL的半同步
2021/04/22 MySQL
Java版 单机五子棋
2022/05/04 Java/Android