Flask表单-cookie登录

一、基于Flask的请求方式简介

Flask前端表单

前端flask请求和其他的web请求没有区别

后端flask必须在aap.route里面通过method=[]来声明post方法,才可以接受post数据

Flask当中,request是一个独立的模块,我们需要导入

From flask import request

Flask 试图函数当做,和django一样可以通过,request.method来判断我们请求的方式,但是flask 用request.vlaues.get方法来获取post,get提交过来的值

语法如下面的代码:

@app.route("/student/add/",methods=["GET","POST"])
def add_student():
    result = ""
    csrf = random.randint(1000000000000,9999999999999999)
    if request.method == "POST":
        value = request.values.get("student_name")
        s = Student(name=value)
        session.add(s)
        session.commit()
        result = "提交成功"
    else:
        result = "学员姓名不可以为空"
    return render_template("add_student.html",result = result,csrf = csrf)

再开始做此项目之前需要先安装flask-wtf插件

需要注意:Flask的form插件在前端使用的意义不大,我们通常使用插件进行后端校验。

二、后端校验步骤

1、前端自定义表单,但是表单的id和name需要对应后端forms表达的字段名称

如图所示:

2、然后我们说明一下后端orm表达调用的步骤

1、在项目当中创建forms文件

2、在forms文件当中编写表单类

1、表单类的父类Form

2、表单类的字段类型 wtforms

3、表单类的校验 validators

 

表单校验语法需要注意:

校验的方式:在字段参数当中使用validators=[],在列表当做编写校验规则

如图所示:

语法规则:

1、使用validators自带规则

Required 字段不可以为空 message 提示消息

Lenth 字段的长度

Max 最大长度

Min 最下长度

Message 提示消息

Min不可以大于max

Regexp 使用正则进行校验

Regex 正则

Message 提示消息

2、自定义校验规则

1、定义类来描述规则

2、在构造函数当中编写message消息

3、定义__call__来接受字段数据,进行校验

4、如果不符合校验用validators.ValidationError来报错

自定义校验:

表单校验:

在视图当中当做使用form类进行后端校验的步骤

1、导入表单

2、通过request.form将请求数据传递给form类

3、使用validator方法来发起校验

4、使用formData.errors来接受错误

三、使用flask制作一个简单的注册项目:

首先需要创建如下图所示目录以及文件:

导入对应的模板文件以及静态文件

然后分别在目录下面几个模块中分别编写程序:

首先是__init__.py文件,此文件相当于初始化,需要在里面编写 创建app 和 实例化数据库

代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect as CsrfProtect
app = Flask(__name__)

import os
BaseDir = os.path.join(
    os.path.dirname(
    os.path.abspath(__file__)
),
    'school.db'
).split('\\',1)[1]
print(BaseDir)
db_path = 'sqlite:'+ BaseDir.replace('\\','/')
app.config['SQLALCHEMY_DATABASE_URI'] = db_path
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SECRET_KEY'] = '123123123'
CsrfProtect(app)
db = SQLAlchemy(app)

models.py文件中通过Python语句,创建类及对应的属性字段,通过orm的sqlalchem模块实现创建数据库中对应的表以及对应的字段的关系映射,代码如下

from School import db

class User(db.Model):
    id = db.Column(db.Integer,primary_key= True)
    username = db.Column(db.String(32))
    email = db.Column(db.String(32))
    password = db.Column(db.String(32))

    def __repr__(self):
        return self.username

views.py文件响应浏览器请求,将前端内容显示在浏览器,以及获取浏览器的form表单注册的数据,放入数据库

代码如下


from flask import render_template
from flask import request
from School.forms import UserForm
from School.models import User,db
from School import app

import hashlib
session = db.session



def setPassword(password):
    md5 = hashlib.md5()
    md5.update(password.encode())
    result = str(md5.hexdigest())
    return result


@app.route('/')
def index():
    return 'hello world'

@app.route('/register',methods=['POST','GET'])
def register():
    error = ''
    if request.method == "POST":
        data = UserForm(request.form)
        if data.validate():
            clean_data = data.data
            user = User(
                username = clean_data['username'],
                password = setPassword(clean_data['password']),
                email = clean_data['email']
            )
            session.add(user)
            session.commit()
            error = 'success'
        else:
            error = data.errors


    return render_template('register.html',error = error)

forms.py文件,通过对应前端form表单的id和name字段,对该字段内容进行正则匹配校验,或者自定义校验

代码如下

from flask_wtf import FlaskForm as Form
import wtforms
from wtforms import validators
from School.models import User

class EmailVailder:
    def __init__(self,message):
        self.message = message
    def __call__(self, form,field):
        data = field.data
        user = User.query.filter_by(email = data).all()
        if not user:
            return None
        raise validators.ValidationError(self.message)


class UserForm(Form):
    username = wtforms.StringField('用户姓名',validators=[
        validators.length(min = 6,max = 8,message='用户名必须大于6位小于8位'),
        validators.Regexp(regex=r'[0-9a-zA-Z]{6,8}',message='用户名必须是6-8位的数字字母下划线')
    ])
    email = wtforms.StringField('用户邮箱',validators=[
        validators.Regexp(regex=r'\w+@\w+\.\w+',message='格式错误'),
        EmailVailder(message='邮箱重复')

    ])
    password = wtforms.StringField('用户密码',validators=[
        validators.length(min = 6,max = 8,message='用户密码必须大于6位小于8位')
    ])

最后是manage.py文件,负责开启项目以及同步数据库

代码如下:

from School.views import app
from School.models import db
db.create_all()
app.run()

对应的register.html文件是:

 <form class="user" method="post">
                <div class="form-group row">
                  <div class="col-sm-12 ">
                    <input type="text" class="form-control form-control-user" id="username" name="username" placeholder="学生姓名">
                  </div>
                   </div>
                 <div class="form-group row">
                  <div class="col-sm-12 ">
                    <input type="email" class="form-control form-control-user" id="email" name="email" placeholder="邮箱">
                  </div>
                 </div>
                 <div class="form-group row">
                  <div class="col-sm-12 ">
                    <input type="password" class="form-control form-control-user" id="password" name="password" placeholder="密码">
                  </div>
                 </div>
                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
                <input type="submit" class="btn btn-primary btn-user btn-block" value="注册用户">


              </form>
              
              <p style="color: red;text-align: center" >{{ error }}</p>

 

运行项目:

由于填写的内容不规范,于是下方会出现对应的表单检验的不规范提示

自定义的邮箱重复校验

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值