6.4-6.5 使用form表单验证,完善登录页面
之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面。
users > views.py 的内容是:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from .models import UserProfile
from django.db.models import Q
from django.views.generic.base import View
from .forms import LoginForm
# Create your views here.
def user_login(request):
if request.method == 'GET':
return render(request, 'login.html', {})
if request.method == 'POST':
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
# 成功返回user,失败返回None
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user) # 直接登录
return redirect('home')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误。'})
# 实现 用户名和邮箱都可以登录
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
class LoginView(View):
def get(self, request):
return render(request, 'login.html', {})
def post(self, request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
# 成功返回user,失败返回None
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user) # 直接登录
return redirect('home')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误。'})
else:
return render(request, 'login.html', {'login_form': login_form})
if login_form.is_valid(): 是说如果表单验证通过则进入下一层,表单内容验证不通过则跳出
在users模块中添加forms.py文件,对登录输入的内容做数据校验:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=8)
from django.views.generic.base import View django 中的View,有get和post方法,不用自己去判断了。
login_form = LoginForm(request.POST) 使用 django的Form表单验证,把request.POST来的数据进行校验,比如 密码长度少于8位,则直接返回错误,不进行数据库查询。 最后是urls.py的修改:
from django.contrib import admin
from django.urls import path
import xadmin
from django.views.generic import TemplateView
from users.views import LoginView
urlpatterns = [
path('xadmin/', xadmin.site.urls),
path('', TemplateView.as_view(template_name='index.html'), name='home'),
# path('login/', TemplateView.as_view(template_name='login.html'), name='login'),
# path('login/', user_login, name='login'),
path('login/', LoginView.as_view(), name='login'),
]
LoginView.as_view() 使用LoginView的as_view()方法来实现登录验证和登录逻辑。
6.4-6.5 使用form表单验证,完善登录页面的更多相关文章
- form表单验证-Javascript
Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...
- django之form表单验证
django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- form表单验证2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作
一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...
- [php基础]PHP Form表单验证:PHP form validator使用说明
在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...
- django form表单验证
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- 抽屉之Tornado实战(7)--form表单验证
在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
随机推荐
- log4j2配置日志大小,个数等
1:设置log输出文件 https://www.cnblogs.com/sa-dan/p/6837225.html <?xml version="1.0" encoding= ...
- PAT 1129 Recommendation System[比较]
1129 Recommendation System(25 分) Recommendation system predicts the preference that a user would giv ...
- Qt工程文件说明
Qt工程文件说明 2017-10-16 天天快乐6... 转自 LZS2851 修改 微信 分享: 这篇文章是我从360doc上转的,本来是要把转的url列出来的,但是它们居然禁掉了复制,而且 ...
- EF Code First 学习笔记:关系(转)
一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...
- ArrayBuffer:类型化数组
类型化数组是JavaScript操作二进制数据的一个接口. 这要从WebGL项目的诞生说起,所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的.实时的数据交 ...
- C++多线程学习资料参考
新的C++11语法:<Professional C++>,或<C ++ Primer Plus>: C++11多线程:<C++ Concurrency in Actio ...
- Django学习笔记之Ajax与文件上传
Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输 ...
- g711u与g729比较编码格式
•g711a—编解码格式为G.711 alaw •g711u—编解码格式为G.711 ulaw (the default) •g729—编解码格式为G.729 •g729a—编解码格式为G.729a ...
- 2018-2019 Russia Open High School Programming Contest (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
前言 有一场下午的cf,很滋磁啊,然后又和dalao(见右面链接)组队打了,dalao直接带飞我啊. 这是一篇题解,也是一篇总结,当然,让我把所有的题目都写个题解是不可能的了. 按照开题顺序讲吧. 在 ...
- 更换Ubuntu14.04主题
闲暇之余,想玩一玩Ubuntu的主题,想把原来的主题换成Numix主题,说干就干. sudo add-apt-repository ppa:numix/ppa sudo apt-get update ...