在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里写入