form表单校验

Flask form表单校验

flask 中需要安装 flask-wtf,安装命令:pip install flask-wtf
首先创建一个form.py

#!/usr/bin/env python
#-*-coding:utf-8-*-

#导入模块
from flask_wtf import FlaskForm                 #FlaskForm 为表单基类   
from wtforms import StringField,PasswordField,SubmitField     #导入字符串字 段,密码字段,提交字段    
from wtforms.validators import DataRequired,ValidationError
from models import Admin          #从models导入模型(表)

#定义登录表单,并且需要在视图函数(views.py)中实例化
class LoginForm(FlaskForm):
    account = StringField(
        # 标签
        label="账号",
        # 验证器
        validators=[
            DataRequired('请输入用户名')
        ],
        description="账号",
        # 附加选项,会自动在前端判别
        render_kw={
            "class":"form-control",
            "placeholder":"请输入账号!",
            "required":'required'               #表示输入框不能为空,并有提示信息
        }
    )

    pwd = PasswordField(
        # 标签
        label="密码",
        # 验证器
        validators=[
            DataRequired('请输入密码')
        ],
        description="密码",
        # 附加选项(主要是前端样式),会自动在前端判别
        render_kw={
            "class": "form-control",
            "placeholder": "请输入密码!",
            "required": 'required'      # 表示输入框不能为空
        }
    )

    submit = SubmitField(
        label="登录",
        render_kw={
            "class": "btn btn-primary btn-block btn-flat",
        }
    )

views.py 视图函数

from . import adminbapp    ##导入appfrom flask import  render_template,redirect,url_for,flash,session,requestfrom admin.forms import LoginForm      #引入forms.py文件from models import Admin            #导入数据库模型from functools import wraps      #导入装饰器模块from movie_project import db      #引入sqlalchemy实例化对象#登录验证装饰器def login_required(func):
    @wraps(func)    def decorated_function(*args, **kwargs):        if session.get('admin'):           #验证session            return func(*args, **kwargs)        else:            return redirect(url_for('admin.login'))    return decorated_function
@adminbapp.route('/login/',methods=['GET','POST'])
def login():
    forms = LoginForm()                #实例化forms
    if forms.validate_on_submit():       #提交的时候进行验证,如果数据能被所有验证函数接受,则返回true,否则返回false
        data = forms.data                #获取form数据信息(包含输入的用户名(account)和密码(pwd)等信息),这里的account和pwd是在forms.py里定义的
        admin = Admin.query.filter_by(name=data["account"]).first()    #查询表信息admin表里的用户名信息
        if admin == None:
            flash("账号不存在")                            #操作提示信息,会在前端显示
            return redirect(url_for('admin.login'))
        elif admin != None and not admin.check_pwd(data["pwd"]):            #这里的check_pwd函数在models 下Admin模型下定义
            flash("密码错误")
            return  redirect(url_for('admin.login'))
        session['admin'] = data['account']                          #匹配成功,添加session
        return redirect(request.args.get('next') or url_for('admin.index'))  #重定向到首页
    return render_template('admin/login.html',form=forms)

数据库模型models.py

class Admin(db.Model):
    __tablename= 'admin'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False, unique=True)  # unique代表不能重复,唯一的
    pwd = db.Column(db.String(100), nullable=False)
    is_super = db.Column(db.SmallInteger)  #是否为超级管理员
    role_id = db.Column(db.Integer,db.ForeignKey('role.id'))
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

    adminlogs = db.relationship('Adminlog',backref='admin')
    adminoption = db.relationship('Oplogs', backref='admin')

    def __repr__(self):
        return '<Admin %r>' % self.name
     #定义密码验证函数
    def check_pwd(self,pwd):
        from werkzeug.security import check_password_hash    #由于密码是加密的,所以要引入相应的加密函数
        return  check_password_hash(self.pwd,pwd)

前端 login.html

<div class="login-box-body">
        {% for msg in get_flashed_messages() %}          <!--这里对应视图函数里定义的提示信息 flash-->

        <p class="login-box-msg" style="color: red;">{{ msg }}</p>    <!--信息在前端显示-->
        {% endfor %}
        <form method="POST" id="form-data">              <!--使用form,这里可以不用写action-->
            <div class="form-group has-feedback">
                {{ form.account }}             <!--常规情况下,这里应该为一个input框,用来定义用户输入,由于在forms里已经定义,这里直接调用就行-->
                <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
                {% for err in form.account.errors %}        <!--错误信息-->
                    <div class="col-md-12">

                        <span style="color: red">{{ err }}</span>  <!--显示错误信息-->
                    </div>
                {% endfor %}
            </div>
            <div class="form-group has-feedback">
                {{ form.pwd }}                <!--同上面的用户输入-->
                <span class="glyphicon glyphicon-lock form-control-feedback"></span>
                {% for err in form.pwd.errors %}            <!--pwd输入错误的提示信息-->
                    <div class="col-md-12">
                        <font style="color: red">{{ err }}</font>
                    </div>
                {% endfor %}
            </div>
            <div class="row">
                <div class="col-xs-8">
                </div>
                <div class="col-xs-4">
                    {{ form.submit }}            <!--提交按钮-->
                    {{ form.csrf_token }}          <!--csrftoken必须要写,同时还要设置 app的secret_key-->
                </div>
            </div>
        </form>
    </div>

配置secret_key

import os
app.config['SECRET_KEY'] = os.urandom(24)

django中form表单校验

创建form.py

django中form表单校验自带,不需要安装

1、先导入forms模块

1
from django import forms
  
2、创建模板的类

# 1、创建模板
class loginform(forms.Form):
    # 2、模板中的元素
    name = forms.CharField(min_length=6,error_messages={"requird":"用户名不能为空","min_length":"最小长度为6"})
    # requird这个是错误码
 
    email = forms.EmailField()
  

这里这个error_messages写出错的信息,每个不同的错误码对应不同的报错信息

3、在视图函数中使用这个类
def login(request):
    if request.method.lower() == "post":
        # 3、创建一个模板的对象,然后把数据传递个这个对象
        obj = loginform(request.POST)
 
        # 4、启动校验
 
        status= obj.is_valid()
        print(status)
 
        # 5、正确的信息
        success_dict = obj.clean()
        print(success_dict)
 
        # 6、错误的信息
        failed_dict = obj.errors.as_json()
        print(failed_dict)
        return redirect("/app1/login")
    else:
        return render(request,"login.html")

这里就会校验前台发来的数据中,k为name和email的值的合法性
###html文件
与flask中基本相同,注意input属性中 name =" ",一定要与form表单对应
###后端代码
因为是form表单,所以提交后页面会刷新,上次输入的数据就没有了,我们可以通过下面的方式实现保留上次输入的值

from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
# Create your views here.
 
 
 
from django import forms
 
"""
def login(request):
    if request.method.lower() == "post":
        print(request.POST.get("name"))
        return redirect("/app1/login")
    else:
        return render(request,"login.html")
        # return redirect("/app1/login")
    # return HttpResponse("hahh")
"""
 
 
 
# 1、创建模板
class loginform(forms.Form):
    # 2、模板中的元素
    name = forms.CharField(min_length=6,error_messages={"required":"用户名不能为空","min_length":"最小长度为6666666666"})
    # requird这个是错误码
 
    email = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
 
def login(request):
    if request.method.lower() == "post":
        # 3、创建一个模板的对象,然后把数据传递个这个对象
        obj = loginform(request.POST)
 
        # 4、启动校验
 
        status= obj.is_valid()
        print(status)
 
        # 5、正确的信息
        success_dict = obj.clean()
        print("正确的信息----------->",success_dict)
 
        # 6_1、错误的信息1
        # failed_dict = obj.errors.as_json()
 
        # 6_2、错误的信息1
        failed_dict = obj.errors
 
        if not obj.is_valid():
            # print(failed_dict["name"])
            # print(failed_dict["name"][0])
            print("错误的信息----------->",failed_dict)
            print("名称的错误信息-------->",failed_dict["name"][0])
            print("邮箱的错误信息-------->", failed_dict["email"][0])
        return render(request, "login.html", {'xx': obj})
        # return redirect("/app1/login")
    else:
        obj = loginform()
        # return render(request,"login.html")
        # return redirect("/app1/login")
        return render(request,"login.html",{"xx":obj})
    # return HttpResponse("hahh")

如果还有较为复杂的逻辑校验,上面的校验不能满足需求,需要定义clearn_方法

def clearn_name(self):
    name = self.cleaned_data.get('name')
    if name in ['admin']:
        raise ValidationError('不能有敏感字符')

注意:clearn_是系统做完上面校验后自动调用,不需要自己调用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
<script language="JavaScript" type="text/javascript"> 02.function challs_flash_update(){ //Flash 初始化函数 03.var a={}; 04.//定义变量为Object 类型 05. 06.a.FormName = "Filedata"; 07.//设置Form表单的文本域的Name属性 08. 09.a.url="update.asp"; 10.//设置上传接收文件地址 11. 12.a.parameter="bs=tyi&id=50"; 13.//设置提交参数,以GET形式提交 14. 15.a.typefile=["Images (*.gif,*.png,*.jpg)","*.gif;*.png;*.jpg"]; 16.//设置可以上传文件 数组类型 17.//"Images (*.gif,*.png,*.jpg)"为用户选择要上载的文件时可以看到的描述字符串, 18.//"*.gif;*.png;*.jpg"为文件扩展名列表,其中列出用户选择要上载的文件时可以看到的 Windows 文件格式,以分号相隔 19. 20.a.UpSize=0.5; 21.//可限制传输文件总容量,0或负数为不限制,单位MB 22. 23.a.fileNum=4; 24.//可限制待传文件的数量,0或负数为不限制 25. 26.a.size=100; 27.//上传文件限制大小,单位MB,可以填写小数类型 28. 29.a.FormID=['select','select2']; 30.//设置每次上传时将注册了ID的表单数据以POST形式发送到服务器 31.//需要设置的FORM表单中checkbox,text,textarea,radio,select项目的ID值 32.//参数为数组类型,注意使用此参数必须有 challs_flash_FormData() 函数支持 33. 34.a.CompleteClose=true; 35.//设置为true时,上传完成的条目,将也可以取消删除条目,这样参数 UpSize 将失效, 默认为false 36. 37.return a ; 38.//返回Object 39.} 40. 41.function challs_flash_onStart(a){ //每个文件开始上传时调用的函数,并传入一个Object类型变量,包括刚上传文件的大小,名称,文件类型 42.var name=a.fileName //获取上传文件名 43.var size=a.fileSize //获取上传文件大小,单位字节 44.var type=a.fileType //获取上传文件类型,在 Windows 上,此属性是文件扩展名。 在 Macintosh 上,此属性是由四个字符组成的文件类型 45. 46.} 47. 48.function challs_flash_onComplete(a){ //每个文件上传完成时调用的函数,并传入一个Object类型变量,包括刚上传文件的大小,名称,上传所用时间,文件类型 49.var name=a.fileName //获取上传文件名 50.var size=a.fileSize //获取上传文件大小,单位字节 51.var time=a.updateTime //获取上传所用时间 单位毫秒 52.var type=a.fileType //获取上传文件类型,在 Windows 上,此属性是文件扩展名。 在 Macintosh 上,此属性是由四个字符组成的文件类型 53. 54.} 55. 56.function challs_flash_onCompleteData(a){ //获取服务器反馈信息,参数 a 字符类型,包含了服务器返回的文本信息 57. 58.var Data = a; //获取服务器反馈信息 59. 60.} 61. 62.function challs_flash_onCompleteAll(a){ //上传文件列表全部上传完毕事件,参数 a 数值类型,返回上传失败的数量 63. 64.var Num = a; //获取上传失败数量 65. 66.//文件列表已经全部上传完毕 67. 68.} 69. 70.function challs_flash_FormData(a){ // 使用FormID参数时必要函数 71.try{ 72. 73.return document.getElementById(a).value; 74. 75.}catch(e){ 76. 77.return ''; 78. 79.} 80.} 81.</script> FLASH组件调用代码 view source print? 1.<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="408" height="323" id="update_" align="middle"> 2.<param name="allowFullScreen" value="false" /> 3.<param name="allowScriptAccess" value="always" /> 4.<param name="movie" value="update_.swf" /> 5.<param name="quality" value="high" /> 6.<param name="bgcolor" value="#ffffff" /> 7.<embed src="update_.swf" quality="high" bgcolor="#ffffff" width="408" height="323" name="update_" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> 8.</object>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值