Django笔记(⼀)⽤户登陆实现和模板渲染
⽤户登陆:
在这⾥我使⽤Django⾃带的auth⽤户认证系统调⽤authenticate、login函数来完成⽹站的登陆,以下是对form表单中的get和post请求进⾏分析处理。
视图函数:
1def user_login(request):
hod == 'POST': #是post请求就取出form表单中传过来的⽤户名和密码
3
4        user_name = ('username', '')
5        pass_word = ('password', '')
6        user = authenticate(username=user_name, password=pass_word)
7#调⽤authenticate函数来验证⽤户名和密码合法性,authenticate函数接受2个参数username和passsword
8#authenticate⽅法验证合法返回user对象,不合法返回None
9if user is not None:
10            login(request, user)#调⽤login函数完成user对象登陆,login⽅法传⼊request和user对象
11return render(request, 'index.html')  #登陆成功返回⾸页
12else:
13            context = {
14'msg_error': '⽤户名或密码错误!'#如果为None返回login页⾯
15            }
hod == 'GET': #是get请求直接返回login页⾯
17        context = {
18
19        }
20return render(request, 'login.html', context)
authenticate函数只是验证⽤户名和密码的合法性并⽣成⼀个合法证书,完成⽹站的登陆需要使⽤login函数并传⼊request和⼀个合法的user对象参数。
加⼊表单验证:
上⾯的代码只是处理了⽤户名密码正确错误的合法性,但没有处理不规范的⽤户名密码如密码为空、⼩于6位等,通过加⼊表单验证可以有效解决这些问题,减轻对数据库的查询负担。在本⽬录新建forms.py通过django⾃带的表单功能来继续完善登陆机制。
1#forms.py
2
3from django import forms
4
5class LoginForm(forms.Form): #继承forms.FOrm
6    username=forms.CharField(required=True)  #设置required=True表⽰是必填字段
7    password=forms.CharField(required=True,min_length=6,max_length=15)#设置必填字段,最⼩字符长度6,最⼤15
在⽤户登陆逻辑中引⼊LoginForm并进⾏实例化,传⼊request.POST字典(包含前端传进的username和password),login_form对象下有⼀个is_valid⽅法可以来验证是否符合我们设置的LoginForm表单验证需求。
1#views.py
2
3def user_login(request):
hod == 'POST': #是post请求就取出form表单中传过来的⽤户名和密码
5        login_form=LoginForm(request.POST)#实列化Login_Form传⼊request.POST字典
6if login_form.is_valid():#调⽤实例下的is_valid()⽅法验证是否符合表单的需求
7            user_name = ('username', '')
8            pass_word = ('password', '')
9            user = authenticate(username=user_name, password=pass_word)
10# 调⽤authenticate⽅法来验证⽤户名和密码合法性,authenticate⽅法接受2个参数username和passsword
11# authenticate⽅法验证合法返回user对象,不合法返回None
12if user is not None:
13                login(request, user)  # 调⽤login⽅法完成user对象登陆,login⽅法接受request和⼀个合法的user对象参数
14return render(request, 'index.html')  # 登陆返回⾸页
15else:#当user对象⽤户名密码不正确返回login页⾯,
16                context = {
17'error_msg': '⽤户名或密码错误!'
18                }
19return render(request,'login.html',context)
20else:#未通过form表单验证返回登陆页⾯,并显⽰错误信息
21            context={
22'login_form':login_form
23            }
24return render(request,'login.html',context)
hod == 'GET': #是get请求直接返回login页⾯
26        context = {
27
28        }
29return render(request, 'login.html', context)
模板渲染:
通过视图逻辑中传到前端的错误信息context字典变量在模板中使⽤DTL语法渲染,{% for key,error in items %} {{ error }} {% endfor %} 1#login.html
2<div class="fl form-box">
3<h2>帐号登录</h2>
4<form action="/login/" method="post" autocomplete="off">
5<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
6<div class="form-group marb20 ">{% if s.username %}errorput{% endif %}
7<label>⽤ ;户 ;名</label>
8<input name="username" id="account_l" type="text" placeholder="⼿机号/邮箱"/>
9</div>
10<div class="form-group marb8 {% if s.password %}errorput{% endif %}">
11<label>密     ;码</label>
12<input name="password" id="password_l" type="password" placeholder="请输⼊您的密码"/>
13</div>
14<div class="error btns login-form-tips" id="jsLoginTips"></div>
15                    {% for key ,error in s.items %}
16                    {{ error }}
前端页面模板
17                    {% endfor %}
18                    {{ error_msg }}
19
20<div class="auto-box marb38">
21
22<a class="fr" href="forgetpwd.html">忘记密码?</a>
23</div>
24<input class="btn btn-green" id="jsLoginBtn" type="submit" value="⽴即登录 > "/>
25<input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
26                    {% csrf_token %}
27</form>
28<p class="form-p">没有慕学在线⽹帐号?<a href="register.html">[⽴即注册]</a></p>
29</div>
函数视图改造为类视图:
上⾯⼀直是使⽤函数视图的⽅式来处理get和post请求,实际上⼯作中采⽤类视图更加⽅便,从from ic import View引⼊View。
构造我们⾃⼰Login类视图需要继承View重写我们⾃⼰的get和post⽅法,然后类视图可以根据request来⾃动调⽤get还是post。
1#views.py
2from ic import View
3
4class LoginView(View):
5def get(self,request):是get请求返回登陆页
6return render(request,'login.html')
7
8def post(self,request):#是post请求取出form表单中传过来的⽤户名和密码
9        login_form=LoginForm(request.POST)#实列化Login_Form传⼊request.POST字典
10if login_form.is_valid():#调⽤实例下的is_valid()⽅法验证是否符合表单的需求
11            user_name=('username','')
12            pass_word=('password','')
13            user=authenticate(username=user_name,password=pass_word)
14#调⽤authenticate⽅法来验证⽤户名和密码合法性。
15# authenticate⽅法验证合法返回user对象,不合法返回None
16if user is not None:
17                login(request,user) #调⽤login函数登陆
18return render(request,'index.html')
19else:#当user对象⽤户名密码不正确返回login页⾯,
20                context={
21'error_msg':'密码或账号错误'
22                }
23return render(request,'login.html',context)
24else:# login_form⽤户名和密码不符合form表单, 返回登录页⾯, 并提⽰错误信息
25
26return render(request,'login.html',{'login_form':login_form})
在url配置中因为只允许函数视图,不允许类视图,因此我们要采⽤类视图下的.as_view⽅法把类视图改造为函数视图。
path("login/",LoginView.as_view(),name='login'),

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。