|
在django里面登录的动作其实不难就是数据的对比,但是难的是登录验证,主要是为了解决没有登录之前页面是无法查看的
Django 登录页面使用mysql为存储帐号密码的数据库,所以开始的话先要配置mysql,我这里使用python的mysqlclinet去实现集成
安装完成只需在setting里配置databases
Django登录验证分为两种一种是使用django自带的数据库进行验证 一种是自定义,这里我讲的是自定义,自定义的话密码需要sha256加密
但是加密过后的数据会非常长,所以设置数据库的字段大小的时候设置大一点
现展示下效果:
1.登录页面

2.注册页面

登录页面前端主要代码:
<form method="post" enctype="multipart/form-data" >
{% csrf_token %}
{{uf.as_p}}
<button type="submit" class="btn btn-default">登录</button>
                                                     
<a href="{% url 'register' %}" class="btn btn-default">注册</a>
</form>
<div class="rem_sub">
</div>
注册页面前端主要代码:
<form method="post" enctype="multipart/form-data" >
{% csrf_token %}
{{register_form.as_p}}
<button type="submit" class="btn btn-default">注册</button>
                                                     
<a href="{% url 'login' %}" class="btn btn-default">登录</a>
<p>{{ message }}</p>
</form>
加密算法函数:
def hash_code(s,salt='alys'):
h = hashlib.sha256()
s += salt
h.update(s.encode())
res = h.hexdigest()
return res

我其中
ENGINE:数据库引擎
NAME:数据库名
HOST:主机
PORT:端口
USER:用户
PASSWORD:密码
OPTIONS:可以设也可以不设置,我这里设置的是解决 python3 manage.py migrate时候的报错 设置完成之后,设置models模型
我一共设置了4个字段id为主键并且索引自动增长
后续3个就不介绍了,只说下password这个字段的max_length必须要大
设置完成之后使用命令创建表结构
python3 manage.py makemigrations
python3 manage.py migrate
需要设置view
首先是登录函数:
UserForm是定义前端的输入框,并且附加class自定义类美化
login是进行登录验证并将验证加入缓存,是后续操作不需要重新登录
class UserForm(forms.Form):
username = forms.CharField(label='用户名:',max_length=20,widget=forms.TextInput(attrs={'class':'txt_input txt_input2'}))
password = forms.CharField(label='密码:',max_length=20,widget=forms.PasswordInput(attrs={'class':'txt_input txt_input2'}))
def login(request):
if request.session.get('is_login',None):
return redirect('/index/')
if request.method == "POST":
uf = UserForm(request.POST)
message='帐号密码必须写'
if uf.is_valid():
username = uf.cleaned_data['username'] #获取前端的数据
password = uf.cleaned_data['password']
try:
user = models.User.objects.get(username=username) #获取数据库对应的数据
except:
message = '用户不存在'
return render_to_response(request, 'pages/login.html', {'uf':uf})
if user.password == hash_code(password):
request.session['is_login'] = True #加入缓存 凭is_login判断是否已经登录
request.session['user_id'] = user.id
request.session['user_name'] = user.username
return redirect('/index/') #登录成功 重定向到主页
else:
message='密码错误'
print(hash_code(password))
return render(request, 'pages/login.html', {'uf':uf})
else:
uf = UserForm()
return render(request, 'pages/login.html', {'uf': uf})
设置完成之后需要自己定义装饰器装饰每个函数 使他们没经过登录就跳转到登录界面
def outer(func):
print ('start --------------------------------')
def wrap(request,*arg,**kwargs):
is_login=request.session.get('is_login',None)
if is_login:
ret = func(request,*arg,**kwargs)
return ret
else:
return redirect('/')
return wrap
后续只需要在每个函数前面加这个装饰器就可以了:@outer
注销函数:
def logout(request):
del request.session["user_name"] # 删除session
del request.session["user_id"]
del request.session["is_login"]
uf = UserForm(request.POST)
return render(request, 'pages/login.html', {'uf': uf})
注册函数:
class RUserForm(forms.Form):
username = forms.CharField(label='用户名:',max_length=100,widget=forms.TextInput(attrs={'class':'txt_input txt_input2'}))
password1 = forms.CharField(label='密码:',widget=forms.PasswordInput(attrs={'class':'txt_input txt_input2'}))
password2 = forms.CharField(label='重新输入密码:', widget=forms.PasswordInput(attrs={'class': 'txt_input txt_input2'}))
alias = forms.CharField(label='别名:',max_length=100,widget=forms.TextInput(attrs={'class':'txt_input txt_input2'}))
def register(request):
if request.session.get('is_login',None): #判断会话缓存是否有这个值 如果有就跳转到首页
return redirect('/index/')
if request.method == "POST": #判断请求方式
register_form = RUserForm(request.POST)
if register_form.is_valid():
username = register_form.cleaned_data['username']
password1 = register_form.cleaned_data['password1']
password2 = register_form.cleaned_data['password2']
alias = register_form.cleaned_data['alias']
if password1 != password2:
message= '两次输入的密码不相同'
return render(request,'pages/register.html',locals())
else:
smae_name_user = models.User.objects.filter(username=username)
if smae_name_user:
message = '用户名已经存在。请重新选择'
return render(request, 'pages/register.html', locals())
new_user={'username':username,'password':hash_code(password2),'alias':alias}
models.User.objects.create(**new_user)
message='注册成功'
return render(request, 'pages/register.html', locals())
register_form = RUserForm()
return render(request, 'pages/register.html', locals()) #locals是获取当前的所有变量变成集合
后续也可以将该数据表放到后台方便管理:
在admin.py里写入
|