Django1.6 用Form实现注册登录注销修改密码(含代码!)
参照了潘军杰的博客,但他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入手,其实只需要一个注册界面和一个登陆界面,所以代码如下
- from django.conf.urls import patterns, include, url
- from django.contrib import admin
- from login.views import register,mylogin,changepassword
- admin.autodiscover()
- urlpatterns = patterns('',
- url(r'^admin/', include(admin.site.urls)),
- (r'^register/$',register),
- (r'^login/$',mylogin),
- (r'^login/register/$',register),
- (r'^changepassword/(?P<username>\w+)/$',changepassword),
- )
第一行是自动生成的,第二、三行是开始就添加的,第四、五行是后续增添功能时另加的。
3.接下来编写form表单,新建一个py文件命名为form。
注册的时候我们要求用户填用户名、邮箱、还要输入两次密码,所以我们的RegisterForm就诞生了。
- from django import forms
- class RegisterForm(forms.Form):
- username = forms.CharField()
- email = forms.EmailField()
- password = forms.CharField(widget=forms.PasswordInput)
- password2= forms.CharField(label='Confirm',widget=forms.PasswordInput)
- def pwd_validate(self,p1,p2):
- return p1==p2
需要说明的是widget那个是为了让输入内容不显示出来,而且django会把密码转存成一个哈希串,label是在页面显示的内容。那个函数是为了判断两次密码输入是否相同,其实不写这里写到views里也可以。
同样登录界面只需要用户名和密码即可,所以LoginForm更简单
- class LoginForm(forms.Form):
- username = forms.CharField()
- password = forms.CharField(widget=forms.PasswordInput)
4.接下来开始编写views。首先介绍需要导入的包
- from django.shortcuts import render_to_response
- from form import RegisterForm,LoginForm,ChangepwdForm
- from django.contrib.auth import authenticate,login as auth_login,logout as auth_logout
- from django.http import HttpResponsefrom django.http import HttpResponseRedirect
User的位置发生了变化,我找了很久才找到的。导入login,logout时为了区分所以加了auth前缀
5.简单起见先写login视图
- def mylogin(request):
- error = []
- if request.method == 'POST':
- form = LoginForm(request.POST)
- if form.is_valid():
- data = form.cleaned_data
- username = data['username']
- password = data['password']
- if login_validate(request,username,password):
- return render_to_response('welcome.html',{'user':username})
- else:
- error.append('Please input the correct password')
- else:
- error.append('Please input both username and password')
- else:
- form = LoginForm()
- return render_to_response('login.html',{'error':error,'form':form})
其中login_validate()如下
- def login_validate(request,username,password):
- rtvalue = False
- user = authenticate(username=username,password=password)
- if user is not None:
- if user.is_active:
- auth_login(request,user)
- return True
- return rtvalue
为了验证用户合法性,用到了authenticate函数,参数是username和password,匹配到会返回一个User对象,如果不合法(不存在该用户或密码不正确)就会返回None。login.html是自己编写的模板,其中有两个要填充的变量error和form,它会返回这两个变量到模板中来显示具体出现了什么错误。模板有一个地方要注意就是它有两个按钮,Login按钮类型设为submit,一点击就提交;而Register按钮设为button,然后其上加一个点击函数,让其点击后跳转到注册页面。window.location.href是让其在当前页面进行跳转,也就是url变成了/login/register/。这也就是在最开始urls里那么写第四行的原因。login.html内容如下:
- <html>
- <head>
- <title>Login</title>
- <script type="text/javascript">
- function register() {
- window.location.href = 'register'
- }
- </script>
- </head>
- <body>
- <h1>Login</h1>
- {% for item in error %}
- <p style="color:red;">{{item}}</p>
- {% endfor %}
- <form action="" method="post">
- <table>
- {{ form.as_table }}
- </table>
- <input type="submit" value="Login">
- <input type="button" value="Register" οnclick="register()">
- </form>
- </body>
- </html>
6.有了login再写register就容易了。它要验证的内容稍微多一些,一个是验证要注册的用户名是否已存在,因为username是要唯一的,在一个验证密码是否相同,这个在Form表单里已经写过函数了。
- def register(request):
- error=[]
- if request.method == 'POST':
- form = RegisterForm(request.POST)
- if form.is_valid():
- data = form.cleaned_data
- username = data['username']
- email = data['email']
- password = data['password']
- password2= data['password2']
- if not User.objects.all().filter(username=username):
- if form.pwd_validate(password, password2):
- user = User.objects.create_user(username, email, password)
- user.save()
- login_validate(request,username,password)
- return render_to_response('welcome.html',{'user':username})
- else:
- error.append('Please input the same password')
- else:
- error.append('The username has existed,please change your username')
- else:
- form = RegisterForm()
- return render_to_response('register.html',{'form':form,'error':error})
如果可以注册,利用create_user函数来创建一个user对象,然后切记user.save()存入数据库。register.html如下
- <html>
- <head>
- <title>Join us</title>
- </head>
- <body>
- <h1>Register</h1>
- {% if form.errors %}
- <p style="color: red;">
- Please correct the error{{ form.errors|pluralize }} below.
- </p>
- {% endif %}
- {% for item in error %}
- <p style="color:red;">{{item}}</p>
- {% endfor %}
- <form action="" method="post">
- <table>
- {{ form.as_table }}
- </table>
- <input type="submit" value="Register">
- </form>
- </body>
- </html>
7.最后是注销,这个很简单,直接用auth_logout(request)即可,然后返回login界面
- def mylogout(request):
- auth_logout(request)
- return HttpResponseRedirect('/login/')
8.在注销界面我添加了一个修改密码的选项,让用户登录后可以修改自己的密码,这个主要用到了user.set_password('new password')。唯一复杂的地方是点击修改密码按钮时要多传递过来一个username的参数,这样才能去查找这个user从而修改其密码。所以在urls地方那么写,为了将url里的内容匹配到username变量中,传递给changepassword函数
- def changepassword(request,username):
- error = []
- if request.method == 'POST':
- form = ChangepwdForm(request.POST)
- if form.is_valid():
- data = form.cleaned_data
- user = authenticate(username=username,password=data['old_pwd'])
- if user is not None:
- if data['new_pwd']==data['new_pwd2']:
- newuser = User.objects.get(username__exact=username)
- newuser.set_password(data['new_pwd'])
- newuser.save()
- return HttpResponseRedirect('/login/')
- else:
- error.append('Please input the same password')
- else:
- error.append('Please correct the old password')
- else:
- error.append('Please input the required domain')
- else:
- form = ChangepwdForm()
- return render_to_response('changepassword.html',{'form':form,'error':error})
如果还不清楚,可以看下我的welcome.html,应该就会清楚参数是如何传递的了
- <html>
- <head>
- <title>Welcome </title>
- </head>
- <body>
- <h1>Welcome {{user}}!</h1>
- <div>
- <a href="/changepassword/{{user}}">ChangePassword</a>
- <a href="/login">Logout</a>
- </div>
- </body>
- </html>
点击changepassword后,将user这个变量附加到url上传递过去,所以在urls里那个格式就是负责解析这个url的。w+是正则表达式,意思是一个或多个字符。最后是changepassword.html文件,和其它的模板都差不多
- <html>
- <head>
- <title>ChangePassword</title>
- </head>
- <body>
- <h1>ChangePassword</h1>
- {% for item in error %}
- <p style="color:red;">{{item}}</p>
- {% endfor %}
- <form action="" method="post">
- <table>
- {{ form.as_table }}
- </table>
- <input type="submit" value="Enter">
- </form>
- </body>
- </html>
注意:如果数据库报错,很有可能是你没有同步数据库,运行manage.py syncdb指令同步数据库。可登录http://127.0.0.1:8000/admin登录管理界面
管理员账号:administrator/symantec
有问题欢迎留言讨论交流,转载请注明出处:http://blog.csdn.net/monkeyduck
Django1.6 用Form实现注册登录注销修改密码(含代码!)相关推荐
- springBoot加layui和mybatis后台管理系统增删改查分页登录注销修改密码功能
超市订单管理系统 1 登录页面 1.1 登录 点击提交按钮提交form表单使用post请求把(String name, String password)数据传到后台loginController 路径 ...
- Python+selenium+Gmail半自动登录-注销-修改密码
工作中需要测试一批谷歌邮箱是否能正常登录. 做了半天手工,我就想起了python和我之前有学过的一点点selenium测试 一 开始通过edge浏览器的selenium插件录制登录注销的操作步骤 然后 ...
- python django 快速实现注册,登录,注销
临近年底,各种忙,好久没更新博客了,2017春节假期在即,距下班还有2小时,难得闲下来,来撸一手django简单的web注册,登录,注销. 环 境:centos 6.4 64bit python ...
- 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密
RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...
- WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure
WEB前后端交互原型通用元件库.常用组件.信息输出.信息输入.信息反馈.综合系列.页面交互.首页.分类页.内容详情.用户中心.注册登录.找回密码.元件库.web元件库.rplib.axure原型 we ...
- 简单注册、登录、修改密码、忘记密码程序
简单注册.登录.修改密码.忘记密码程序 来自一枚大二通信工程渣渣写的代码 #include<stdio.h> #include<stdlib.h> #include<st ...
- 【Openfire】网页版的用户注册、登录、修改密码
Openfire客户端的开发是借助Smack提供的方法.Smack可以从官网下载.如果是Openfire3.7.1的版本,建议使用Smack3.2.2与其匹配.官网地址:http://www.igni ...
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
开发共享软件,传统的是采用注册码验证方式,这种方式是大多数共享软件采用的方式,另外还有一种常见的验证方式,就是通过网络授权认证的方式,这种方式通过在程序中调用服务器的服务进行.一般具有验证用户名可用. ...
- 注册登录原理及密码安全问题
安全性,是一个公司生死存亡的关键,平时工作中,一旦遇到安全问题,必须立即高优先级处理.安全攻防,是一个动态的博弈,没有攻不破的防守,也没有防不住的进攻. 今天,我们来简要聊一聊注册和登录.注册APP成 ...
最新文章
- java for循环迭代_JAVA中的for-each循环与迭代
- springBoot 打war包 程序包com.sun.istack.internal不存在的问题
- 1.6.2java工业星系_我的世界1.6.4
- 计算机高层应用,计算机网络中高层应用.ppt
- python删除链表的倒数第k个节点,剑指offer 链表中的倒数第K个节点 Python and C++
- 修改服务器控件的ID和Name
- SCM供应链管理的背景及意义
- myeclipse+JDK10+tomcat9 配置
- html多张图片合成一张,PS照片合成:多张照片合成一张
- html的网页主题标记是什么,html标记是什么
- countifs函数怎么用,excel函数的操作步骤
- 第四题:输入某年某月某日,判断这一天是这一年的第几天?
- 大规模并行 量子计算机,QC资讯丨IBM发布量子路线图——将在2023年底推出1000量子比特量子计算机...
- 认证 (authentication) 和授权 (authorization) 的区别(通俗易懂!!)
- C++中使用代码修改字体颜色
- 服务器系统部署方案,服务器 部署方案
- 量化投资学习——股指期货理论价格说明
- 如何写出一份真正让您受聘的出色简历
- R语言VAR模型的不同类型的脉冲响应分析
- Unity编辑器—Excel转Xml和Asset数据
热门文章
- 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )
- 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
- 【Java 网络编程】UDP 简介
- 【组合数学】生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多项式系数相关 )
- 前端读者 | 别人写的css,你敢用吗?
- 第十五篇、程序返回前台的时间差(常用于显示广告)
- Java 时期格式 星期显示英文
- “是福不是祸,是祸躲不过”这句话对吗?
- 2014/3/16 长沙多校(第三次)
- 你必须知道如何回答的五大计算机安全问题!