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>
好了!