参照了潘军杰的博客,但他Django版本有点老了,改动了不少东西,总体来说参考价值还是很大的,点http://www.2goo.info/blog/panjj/Django/2010/06/05/94跳转

按上Django的可以去目录下找auth这个包,它涵盖了登录注册的大部分功能,我们拿过来直接用就可以了。我Python按在了D盘,所以目录就是这个,D:\Python2.7.6\Lib\site-packages\django\contrib\auth。不会用某个函数看一下这里面或者去看官方文档帮助都很大。最后我会提供工程压缩包,有兴趣的可以下载。

点击此处下载程序包

1.先建立自己的项目,推荐大家使用eclipse+pydev+django的组合,比我之前一直用的cmd方便太多了!首先说一下我的目录结构,如图

MyLogin是创建项目的时候自动创建的,同级的还有manage.py。我自己创建了login文件夹存放登录的views和form,templates文件夹存放模板。tests、models那些都是自动生成的,这次并没有用到。

切记在settings.py里设置自己的模板目录!如果你下载压缩包一定要改这里,而且不能直接复制地址栏的目录,要把'\'全部换成‘/’!!!

2.也是从urls入手,其实只需要一个注册界面和一个登陆界面,所以代码如下

[python] view plaincopy
  1. from django.conf.urls import patterns, include, url
  2. from django.contrib import admin
  3. from login.views import register,mylogin,changepassword
  4. admin.autodiscover()
  5. urlpatterns = patterns('',
  6. url(r'^admin/', include(admin.site.urls)),
  7. (r'^register/$',register),
  8. (r'^login/$',mylogin),
  9. (r'^login/register/$',register),
  10. (r'^changepassword/(?P<username>\w+)/$',changepassword),
  11. )

第一行是自动生成的,第二、三行是开始就添加的,第四、五行是后续增添功能时另加的。

3.接下来编写form表单,新建一个py文件命名为form。

注册的时候我们要求用户填用户名、邮箱、还要输入两次密码,所以我们的RegisterForm就诞生了。

[python] view plaincopy
  1. from django import forms
  2. class RegisterForm(forms.Form):
  3. username = forms.CharField()
  4. email = forms.EmailField()
  5. password = forms.CharField(widget=forms.PasswordInput)
  6. password2= forms.CharField(label='Confirm',widget=forms.PasswordInput)
  7. def pwd_validate(self,p1,p2):
  8. return p1==p2

需要说明的是widget那个是为了让输入内容不显示出来,而且django会把密码转存成一个哈希串,label是在页面显示的内容。那个函数是为了判断两次密码输入是否相同,其实不写这里写到views里也可以。

同样登录界面只需要用户名和密码即可,所以LoginForm更简单

[python] view plaincopy
  1. class LoginForm(forms.Form):
  2. username = forms.CharField()
  3. password = forms.CharField(widget=forms.PasswordInput)

4.接下来开始编写views。首先介绍需要导入的包

[python] view plaincopy
  1. from django.shortcuts import render_to_response
  2. from form import RegisterForm,LoginForm,ChangepwdForm
  3. from django.contrib.auth import authenticate,login as auth_login,logout as auth_logout
  4. from django.http import HttpResponsefrom django.http import HttpResponseRedirect

User的位置发生了变化,我找了很久才找到的。导入login,logout时为了区分所以加了auth前缀
5.简单起见先写login视图

[python] view plaincopy
  1. def mylogin(request):
  2. error = []
  3. if request.method == 'POST':
  4. form = LoginForm(request.POST)
  5. if form.is_valid():
  6. data = form.cleaned_data
  7. username = data['username']
  8. password = data['password']
  9. if login_validate(request,username,password):
  10. return render_to_response('welcome.html',{'user':username})
  11. else:
  12. error.append('Please input the correct password')
  13. else:
  14. error.append('Please input both username and password')
  15. else:
  16. form = LoginForm()
  17. return render_to_response('login.html',{'error':error,'form':form})

其中login_validate()如下

[python] view plaincopy
  1. def login_validate(request,username,password):
  2. rtvalue = False
  3. user = authenticate(username=username,password=password)
  4. if user is not None:
  5. if user.is_active:
  6. auth_login(request,user)
  7. return True
  8. return rtvalue

为了验证用户合法性,用到了authenticate函数,参数是username和password,匹配到会返回一个User对象,如果不合法(不存在该用户或密码不正确)就会返回None。login.html是自己编写的模板,其中有两个要填充的变量error和form,它会返回这两个变量到模板中来显示具体出现了什么错误。模板有一个地方要注意就是它有两个按钮,Login按钮类型设为submit,一点击就提交;而Register按钮设为button,然后其上加一个点击函数,让其点击后跳转到注册页面。window.location.href是让其在当前页面进行跳转,也就是url变成了/login/register/。这也就是在最开始urls里那么写第四行的原因。login.html内容如下:

[python] view plaincopy
  1. <html>
  2. <head>
  3. <title>Login</title>
  4. <script type="text/javascript">
  5. function register() {
  6. window.location.href = 'register'
  7. }
  8. </script>
  9. </head>
  10. <body>
  11. <h1>Login</h1>
  12. {% for item in error %}
  13. <p style="color:red;">{{item}}</p>
  14. {% endfor %}
  15. <form action="" method="post">
  16. <table>
  17. {{ form.as_table }}
  18. </table>
  19. <input type="submit" value="Login">
  20. <input type="button" value="Register" οnclick="register()">
  21. </form>
  22. </body>
  23. </html>

6.有了login再写register就容易了。它要验证的内容稍微多一些,一个是验证要注册的用户名是否已存在,因为username是要唯一的,在一个验证密码是否相同,这个在Form表单里已经写过函数了。

[python] view plaincopy
  1. def register(request):
  2. error=[]
  3. if request.method == 'POST':
  4. form = RegisterForm(request.POST)
  5. if form.is_valid():
  6. data = form.cleaned_data
  7. username = data['username']
  8. email = data['email']
  9. password = data['password']
  10. password2= data['password2']
  11. if not User.objects.all().filter(username=username):
  12. if form.pwd_validate(password, password2):
  13. user = User.objects.create_user(username, email, password)
  14. user.save()
  15. login_validate(request,username,password)
  16. return render_to_response('welcome.html',{'user':username})
  17. else:
  18. error.append('Please input the same password')
  19. else:
  20. error.append('The username has existed,please change your username')
  21. else:
  22. form = RegisterForm()
  23. return render_to_response('register.html',{'form':form,'error':error})

如果可以注册,利用create_user函数来创建一个user对象,然后切记user.save()存入数据库。register.html如下

[python] view plaincopy
  1. <html>
  2. <head>
  3. <title>Join us</title>
  4. </head>
  5. <body>
  6. <h1>Register</h1>
  7. {% if form.errors %}
  8. <p style="color: red;">
  9. Please correct the error{{ form.errors|pluralize }} below.
  10. </p>
  11. {% endif %}
  12. {% for item in error %}
  13. <p style="color:red;">{{item}}</p>
  14. {% endfor %}
  15. <form action="" method="post">
  16. <table>
  17. {{ form.as_table }}
  18. </table>
  19. <input type="submit" value="Register">
  20. </form>
  21. </body>
  22. </html>

7.最后是注销,这个很简单,直接用auth_logout(request)即可,然后返回login界面

[python] view plaincopy
  1. def mylogout(request):
  2. auth_logout(request)
  3. return HttpResponseRedirect('/login/')

8.在注销界面我添加了一个修改密码的选项,让用户登录后可以修改自己的密码,这个主要用到了user.set_password('new password')。唯一复杂的地方是点击修改密码按钮时要多传递过来一个username的参数,这样才能去查找这个user从而修改其密码。所以在urls地方那么写,为了将url里的内容匹配到username变量中,传递给changepassword函数

[python] view plaincopy
  1. def changepassword(request,username):
  2. error = []
  3. if request.method == 'POST':
  4. form = ChangepwdForm(request.POST)
  5. if form.is_valid():
  6. data = form.cleaned_data
  7. user = authenticate(username=username,password=data['old_pwd'])
  8. if user is not None:
  9. if data['new_pwd']==data['new_pwd2']:
  10. newuser = User.objects.get(username__exact=username)
  11. newuser.set_password(data['new_pwd'])
  12. newuser.save()
  13. return HttpResponseRedirect('/login/')
  14. else:
  15. error.append('Please input the same password')
  16. else:
  17. error.append('Please correct the old password')
  18. else:
  19. error.append('Please input the required domain')
  20. else:
  21. form = ChangepwdForm()
  22. return render_to_response('changepassword.html',{'form':form,'error':error})

如果还不清楚,可以看下我的welcome.html,应该就会清楚参数是如何传递的了

[python] view plaincopy
  1. <html>
  2. <head>
  3. <title>Welcome </title>
  4. </head>
  5. <body>
  6. <h1>Welcome {{user}}!</h1>
  7. <div>
  8. <a href="/changepassword/{{user}}">ChangePassword</a>
  9. <a href="/login">Logout</a>
  10. </div>
  11. </body>
  12. </html>

点击changepassword后,将user这个变量附加到url上传递过去,所以在urls里那个格式就是负责解析这个url的。w+是正则表达式,意思是一个或多个字符。最后是changepassword.html文件,和其它的模板都差不多

[python] view plaincopy
  1. <html>
  2. <head>
  3. <title>ChangePassword</title>
  4. </head>
  5. <body>
  6. <h1>ChangePassword</h1>
  7. {% for item in error %}
  8. <p style="color:red;">{{item}}</p>
  9. {% endfor %}
  10. <form action="" method="post">
  11. <table>
  12. {{ form.as_table }}
  13. </table>
  14. <input type="submit" value="Enter">
  15. </form>
  16. </body>
  17. </html>

注意:如果数据库报错,很有可能是你没有同步数据库,运行manage.py syncdb指令同步数据库。可登录http://127.0.0.1:8000/admin登录管理界面
管理员账号:administrator/symantec

有问题欢迎留言讨论交流,转载请注明出处:http://blog.csdn.net/monkeyduck

Django1.6 用Form实现注册登录注销修改密码(含代码!)相关推荐

  1. springBoot加layui和mybatis后台管理系统增删改查分页登录注销修改密码功能

    超市订单管理系统 1 登录页面 1.1 登录 点击提交按钮提交form表单使用post请求把(String name, String password)数据传到后台loginController 路径 ...

  2. Python+selenium+Gmail半自动登录-注销-修改密码

    工作中需要测试一批谷歌邮箱是否能正常登录. 做了半天手工,我就想起了python和我之前有学过的一点点selenium测试 一 开始通过edge浏览器的selenium插件录制登录注销的操作步骤 然后 ...

  3. python django 快速实现注册,登录,注销

    临近年底,各种忙,好久没更新博客了,2017春节假期在即,距下班还有2小时,难得闲下来,来撸一手django简单的web注册,登录,注销. 环   境:centos 6.4 64bit python ...

  4. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

    RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...

  5. WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure

    WEB前后端交互原型通用元件库.常用组件.信息输出.信息输入.信息反馈.综合系列.页面交互.首页.分类页.内容详情.用户中心.注册登录.找回密码.元件库.web元件库.rplib.axure原型 we ...

  6. 简单注册、登录、修改密码、忘记密码程序

    简单注册.登录.修改密码.忘记密码程序 来自一枚大二通信工程渣渣写的代码 #include<stdio.h> #include<stdlib.h> #include<st ...

  7. 【Openfire】网页版的用户注册、登录、修改密码

    Openfire客户端的开发是借助Smack提供的方法.Smack可以从官网下载.如果是Openfire3.7.1的版本,建议使用Smack3.2.2与其匹配.官网地址:http://www.igni ...

  8. 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作

    开发共享软件,传统的是采用注册码验证方式,这种方式是大多数共享软件采用的方式,另外还有一种常见的验证方式,就是通过网络授权认证的方式,这种方式通过在程序中调用服务器的服务进行.一般具有验证用户名可用. ...

  9. 注册登录原理及密码安全问题

    安全性,是一个公司生死存亡的关键,平时工作中,一旦遇到安全问题,必须立即高优先级处理.安全攻防,是一个动态的博弈,没有攻不破的防守,也没有防不住的进攻. 今天,我们来简要聊一聊注册和登录.注册APP成 ...

最新文章

  1. java for循环迭代_JAVA中的for-each循环与迭代
  2. springBoot 打war包 程序包com.sun.istack.internal不存在的问题
  3. 1.6.2java工业星系_我的世界1.6.4
  4. 计算机高层应用,计算机网络中高层应用.ppt
  5. python删除链表的倒数第k个节点,剑指offer 链表中的倒数第K个节点 Python and C++
  6. 修改服务器控件的ID和Name
  7. SCM供应链管理的背景及意义
  8. myeclipse+JDK10+tomcat9 配置
  9. html多张图片合成一张,PS照片合成:多张照片合成一张
  10. html的网页主题标记是什么,html标记是什么
  11. countifs函数怎么用,excel函数的操作步骤
  12. 第四题:输入某年某月某日,判断这一天是这一年的第几天?
  13. 大规模并行 量子计算机,QC资讯丨IBM发布量子路线图——将在2023年底推出1000量子比特量子计算机...
  14. 认证 (authentication) 和授权 (authorization) 的区别(通俗易懂!!)
  15. C++中使用代码修改字体颜色
  16. 服务器系统部署方案,服务器 部署方案
  17. 量化投资学习——股指期货理论价格说明
  18. 如何写出一份真正让您受聘的出色简历
  19. R语言VAR模型的不同类型的脉冲响应分析
  20. Unity编辑器—Excel转Xml和Asset数据

热门文章

  1. 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )
  2. 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
  3. 【Java 网络编程】UDP 简介
  4. 【组合数学】生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多项式系数相关 )
  5. 前端读者 | 别人写的css,你敢用吗?
  6. 第十五篇、程序返回前台的时间差(常用于显示广告)
  7. Java 时期格式 星期显示英文
  8. “是福不是祸,是祸躲不过”这句话对吗?
  9. 2014/3/16 长沙多校(第三次)
  10. 你必须知道如何回答的五大计算机安全问题!