前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-登录验证

Django实战-信息资讯-登录验证

作者头像
小团子
发布2019-07-18 16:33:01
6580
发布2019-07-18 16:33:01
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

本次登录采用 django 自带 form 表单验证。登录需要验证的字段有手机号和密码。前篇的生鲜电商采用的是直接处理 POST 请求过来的数据,判断字段是否都存在,而没有进行字段的再一次验证,比如对手机号码的长度要求和输入的是否为正确的手机号。

① 对表单验证错误消息提示

在编写 form 表单验证之前,可以先定义一个验证错误消息提示的 mixin 类。这样就给需要验证的字段提供了前端页面的错误提示。

代码语言:javascript
复制
class FormMixin(object):
    def get_error(self):
        # 映射
        if hasattr(self, 'errors'):
            errors = self.errors.get_json_data()
            # 随机抽取
            error_tuple = errors.popitem()
            error_list = error_tuple[1]
            error_dict = error_list[0]
            message = error_dict['message']
            return message
        else:
            return None

② 登录验证表单 form

代码语言:javascript
复制
from django import forms
from apps.forms import FormMixin
代码语言:javascript
复制
class LoginForm(forms.Form, FormMixin):
    telephone = forms.CharField(max_length=11, min_length=11, error_messages={"required": "必须输入手机号码!", "min_length": "手机号码个数必须是11位!", "max_length": "手机号码个数必须是11位!"})
    password = forms.CharField(min_length=6, max_length=20, error_messages={"required": "必须输入密码!", "min_length": "密码最少不能少于6位!", "max_length": "密码最多不能超过20位!"})
    remember = forms.IntegerField(required=False)

③ django 使用内置 messages

代码语言:javascript
复制
from django.contrib import messages
代码语言:javascript
复制
messages.info(request, "用户名或密码错误!")
代码语言:javascript
复制
messages.debug(request, '调试信息')
messages.info(request, '信息字符串')
messages.success(request, '成功信息字符串')
messages.warning(request, '警告信息字符串')
messages.error(request, '错误信息字符串')

前端 html 显示警告框

代码语言:javascript
复制
{% for message in messages %}
    {{ message }}
{% endfor %}

④ 登录视图

Django 的 Web 开发也遵循经典软件设计开发的 MVC 模式。View (视图) 主要根据用户的请求返回数据,用来展示用户可以看到的内容(比如网页,图片),也可以用来处理用户提交的数据,比如保存到数据库中。Django 的视图(View)通常和 URL 路由一起工作的。服务器在收到用户通过浏览器发来的请求后,会根据 urls.py 里的关系条目,去视图 View 里查找到与请求对应的处理方法,从而返回给客户端 http 页面数据。

基于类的视图(View)

代码语言:javascript
复制
from django.views.generic import View
from django.contrib.auth import authenticate, login
from .forms import LoginForm
代码语言:javascript
复制
class LoginView(View):
    def get(self, request):
        return render(request, 'auth/login.html')
    def post(self, request):
        form = LoginForm(request.POST)
        # 表单验证
        if form.is_valid():
            telephone = form.cleaned_data.get("telephone")
            password = form.cleaned_data.get("password")
            remember = form.cleaned_data.get("remember")
            # username=telephone 验证字段
            user = authenticate(request, username=telephone, password=password)
            # 判断是否登录
            if user:
                login(request, user)
                if remember:
                    # 如果设置过期时间为None,那么就会使用默认的过期时间
                    request.session.set_expiry(None)
                else:
                    # 如果设置过期时间为0,那么浏览器关闭就会结束
                    request.session.set_expiry(0)
                #     如果登录成功就跳转到主页
                return redirect(reverse("news:index"))
            else:
                messages.info(request, "用户名或密码错误!")
                return redirect(reverse("xfzauth:login"))
        else:
            messages.info(request, "表单验证失败!")
            return redirect(reverse("xfzauth:login"))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前端 html 显示警告框
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档