django 的登陆注册详解
首先,创建一个django项目 创建一个app,这里以app01来表示
1.打开settings 开始配置文件:
? 1.1将app01添加到app配置中
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.BooktestConfig', ]
? 1.2.修改数据库配置,配置成自己的
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'表名', 'HOST':'ip地址', 'USER':'root', 数据库用户名 'PASSWORD':'数据库密码', } }
? 1.3.修改pycharm中的语言文字
LANGUAGE_CODE = 'zh-hans'
? 1.4.添加静态文件路径
STATICFILES_DIRS =[ os.path.join(BASE_DIR,'static',) ] 拼接 当前项目地址的绝对路径 + static 静态文件名
2.打开urls.py文件开始配置url路径:
from django.conf.urls import url from django.contrib import admin from app01 import views 从app01中导入views文件 函数 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^register/', views.register, name='register'), 配置注册路径 url(r'', views.login,name='login'), ]配置登陆路径,打开即是登陆页面
3.考虑设计表结构:
from django.db import models role_choices = (('user','用户'), ('manage','管理员')) #用户表 class User(models.Model): username=models.EmailField(max_length=32,verbose_name='用户名',unique=True) email类型的用户名 unique 确认唯一 password=models.CharField(max_length=32,verbose_name='密码') user_id=models.CharField(max_length=32,verbose_name='用户校园id') user_name=models.CharField(max_length=32,verbose_name='用户姓名') role_name=models.CharField(max_length=32,choices=role_choices,default='user',verbose_name='角色名称') choices选择=选择的值 default 默认选择用户 phone=models.BigIntegerField(blank=True,null=True,verbose_name='手机号')
4.在views中开始写登陆函数:
from django.shortcuts import render,HttpResponse,redirect,reverse from booktest import models import hashlib def login(request): if request.method=='GET': 判断发送的请求是否是get请求 return render(request,"login1.html") 是的话返回登陆页面 elif request.method=='POST': 判断发送的请求是否是post请求 username=request.POST.get('username') 获取前端发送过来的账号 password=request.POST.get('password') 获取前端发过来的密码 md5 = hashlib.md5() md5.update(password.encode('utf-8')) password=md5.hexdigest() 使用hashlib md5来给password进行加密 if models.User.objects.filter(username=username,password=password): 判断获取到的账号和密码与数据库比对 是否一致 return HttpResponse('登陆成功') 一致则返回页面(写着登陆成功的页面) else: return render(request,'login1.html',{'error':'用户名或密码错误'}) 不一致则返回登陆页面,给用户提醒说用户名或密码有误
5.写出登陆页面(或者从(jq22.com中爬取一个页面))
在templates文件下创建login.html登陆页面 在该项目文件下创建一个static文件夹,用来存放各种静态文件 在static文件下创建文件夹css,js,imgs,等静态文件夹 在login.html中敲代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陆</title> {% load static %} 导入静态文件 <link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}"> 使用ctrl +r来进行替换,进行查找替换静态文件的路径,防止爬取的css,js出现路径找不到的问题 <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"> 同上 <link rel="stylesheet" type="text/css" href="{% static 'css/animate-custom.css' %}"> 同上 </head> <body> <div class="container"> <header> </header> <section> <div id="container_demo"> <div id="wrapper"> <div id="login" class="animate form"> <form action="" method="post" autocomplete="on"> #找到form标签 action='' 提交到当前的路径下 method='post' 提交方法为post方法 {% csrf_token %} 使form可以提交post请求 <h1>Log in</h1> <p> <label for="username" class="uname" data-icon="u"> Your email or username </label> 提示用户名 <input id="username" name="username" required="required" type="text" placeholder="请输入账号"> </p> 提示输入账号 <p> <label for="password" class="youpasswd" data-icon="p"> Your password </label> 提示密码 <input id="password" name="password" required="required" type="password" placeholder="请输入密码"> </p> 提示输入密码 <p>{{ error }}</p> 后端验证出错返回报错在这里展现 <p class="keeplogin"> <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping"> <label for="loginkeeping">Keep me logged in</label> </p> <p class="login button"> <input type="submit" value="Login"> </p> 提交post请求 必须 type='submit' <p class="change_link"> 还没有注册 ? <a href="{% url 'register' %}" >加入我们</a> a标签 跳转到注册页面 </p> </form> </div> </div> </div> </section> </div> </body> </html>
6.写注册模块
6.1 先在url地址中写入 url(r'^register/', views.register, name='register'), 6.2 在views函数文件下写入注册模块 #注册模块 from django import forms from django.core.exceptions import ValidationError import hashlib class Regform(forms.ModelForm): re_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'确认密码'})) 自定义数据,用来进行确认密码专门定义 class Meta: model = models.User 对那个数据库中的类 fields = '__all__' 所有的数据 def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) 继承父类的 #自定义的操作 self.fields['username'].widget.attrs['placeholder'] = '用户名' self.fields['password'].widget=forms.PasswordInput(attrs={'placeholder':'密码'}) self.fields['user_id'].widget.attrs['placeholder'] = '用户校园id' self.fields['user_name'].widget.attrs['placeholder'] = '用户姓名' self.fields['role_name'].widget.attrs['placeholder'] = '角色名称' self.fields['phone'].widget.attrs['placeholder'] = '手机号' def clean(self): 创建一个全局钩子 self._validate_unique = True #在数据库中校验唯一性 password = self.cleaned_data.get('password','') 这里的('password','')有秘密: 是如果获取到的密码为空,就选择'',防止二次密码都不输造成下面的加密出现错误 re_password = self.cleaned_data.get('re_password') 判断两次密码是否一致 if password == re_password: md5=hashlib.md5() md5.update(password.encode('utf-8')) self.cleaned_data['password'] = md5.hexdigest() 修改获取到的密码进行hashlib加密 return self.cleaned_data 将数据传出 self.add_error('password',"两次密码不一致") 不一致则将该报错加入到错误中 该错误是全局的错误 raise ValidationError('两次密码不一致') 传出错误,该错误是输入密码哪里的报错 这么一堆就是使用了modleform模块来定义了一个Regform类,使得注册模块更加简便 def register(request): form_obj=Regform() 实例化Regform对象 if request.method =='POST': 判断是post请求 form_obj = Regform(request.POST) 将获取到的数据传递给实例化好的对象中去,做验证 if form_obj.is_valid(): 是否通过了验证 form_obj.save() 通过了验证 就将数据存储在数据库中 return redirect('login') 跳转到登陆页面 return render(request,'register.html',{'form_obj':form_obj}) 否则就返回注册页面 携带的实例化form_obj的对象传输给注册页面 其中的Regform类这一堆太多了,所以在app01这个项目下新增了一个forms.py文件, 将这一堆放入这里面,再将Regform导入到views文件下即可,注意所需模块的导入
7.写注册页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> {% load static %} <link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}"> <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"> <link rel="stylesheet" type="text/css" href="{% static 'css/animate-custom.css' %}"> <style> select { width: 100%; margin-top: 4px; padding: 10px 5px 10px 32px; color: #b2b2b2; } </style> </head> <body> <div class="container"> <header> </header> <section> <div id="container_demo"> <div id="wrapper"> <div id="login" class="animate form"> <form action="" method="post" autocomplete="on" novalidate> novalidate 不进行前端校验 {% csrf_token %} <div> {{ form_obj.username }} 数据库内的用户名 </div> <div> {{ form_obj.username.errors.0 }} </div> 数据库内的用户名报错了在这里显示 <div> {{ form_obj.password }} </div> <div> {{ form_obj.password.errors.0 }} </div> <div> {{ form_obj.re_password }} </div> <div> {{ form_obj.re_password.errors.0 }} </div> <div> {{ form_obj.user_name }} </div> <div> {{ form_obj.user_name.errors.0 }} </div> <div> {{ form_obj.user_id }} </div> <div> {{ form_obj.user_id.errors.0 }} </div> <div> {{ form_obj.role_name }} </div> <div> {{ form_obj.role_name.errors.0 }} </div> <div> {{ form_obj.phone }} </div> <div> {{ form_obj.phone.errors.0 }} </div> <p class="login button"> <input type="submit" value="Login"> </p> <p class="change_link"> <a href="{% url 'login' %}" class="to_register">返回登陆</a> </p> </form> </div> </div> </div> </section> </div> </body> </html>
好了!