郑文峰的博客 郑文峰的博客
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • python

    • 基础

    • 第三方库

    • django

    • flask

    • tornado

      • tornado 文件上传
      • tornado 使用jwt完成用户异步认证
      • tornado 用户密码 bcrypt加密
      • tornado 结合wtforms使用表单操作
        • 简介
        • 例子
        • html表单
        • wtforms 读取json
      • tornado finish和write区别
      • tornado 使用peewee-async 完成异步orm数据库操作
    • 其他

  • go

  • 其他

  • 编程
  • python
  • tornado
zhengwenfeng
2022-08-10
目录

tornado 结合wtforms使用表单操作

# 简介

在获取请求时,需要将请求的参数进行验证。
使用wtforms和tornado的结合,可以获取到请求的参数,并且对参数进行验证。

该项目的github地址: tornado_learning.git (opens new window)

# 例子

创建student的form

代码: apps/shchool/forms.py


from wtforms_tornado import Form
from wtforms import StringField, IntegerField, TextAreaField
from wtforms.validators import DataRequired, Length

class StudentForm(Form):
    """
    可以作为student的 post 和 put 的表单使用。
    """

    id = IntegerField("id", null=True)
    name = StringField("姓名", validators=[DataRequired("请输入姓名")])
    age = IntegerField("年龄", validators=[DataRequired("请输入年龄")])
    desc = TextAreaField("个人简介", validators=[DataRequired("请输入个人简介")])
1
2
3
4
5
6
7
8
9
10
11
12
13
14

然后通过form接收参数,对参数进行验证,验证通过则操作model,对数据库进行保存操作

通过遍历student_from.errors得到校验失败的字段,然后再返回到前端提示。

代码: apps/school/handler.py


import tornado

from apps.school.forms import StudentForm
from apps.school.models import Student
from tornado_learning.handler import BaseHandler

class StudentHandler(BaseHandler):

        async def post(self):

        ret_data = {}

        student_form = StudentForm(self.request.arguments)
        if student_form.validate():
            await self.application.objects.create(Student, **student_form.data)

            ret_data["ret"] = "success"
        else:
            for field in student_form.errors:
                ret_data[field] = ret_data.errors[field][0]

        return self.finish(ret_data)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# html表单

还可以通过wtforms创建对应的model模板表单。

个人不是很推荐使用,因为前后端耦合性太强。

获取表单

代码: apps/school/forms.py

class StudentFormHandler(BaseHandler):

    def get(self):
        studentForm = StudentForm()
        return self.render("student.html", studentForm=studentForm)
1
2
3
4
5

表单的html模板
将该文件放在templates路径下

代码: templates/student.html

<form action="/student" , method="post">
    {% autoescape None %}
    {% for field in studentForm %}
        <span>{{ field.label.text }} :</span>
        {{ field(placeholder="请输入"+field.label.text) }}

        {% if field.errors %}
            {% for error_msg in field.errors %}
                <div class="error-msg">{{ error_msg }}</div>
                {% end %}
                {% else %}
                <div class="error-msg"></div>
            {% end %}
    {% end %}

    <label>
        <span>&nbsp;</span>
        <input type="submit" class="button" value="提交"/>
    </label>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

需要在设置项中设置模板路径
代码:tornado_learning/settings.py

settings = {
    "template_path": "templates"
}
1
2
3

# wtforms 读取json

使用wtforms_json可以使表单直接对json参数的读取。

初始化wtforms_json

首选需要对wtforms_json初始化。
代码: server.py

import wtforms_json
wtforms_json.init()
1
2

在handler中获取json参数,然后读入到form中

代码: apps/school/handler.py

class TeacherHandler(BaseHandler):
   
    async def post(self):

        ret_data = {}

        param = self.request.body.decode("utf8")
        param = json.loads(param)

        teacherForm = TeacherForm.from_json(param)
        print(teacherForm.data)
        if teacherForm.validate():
            teacher = await self.application.objects.create(Teacher, **teacherForm.data)

            ret_data["ret"] = "success"
        else:
            for field in teacherForm.errors:
                ret_data[field] = teacherForm.errors[field][0]

        return self.finish(ret_data)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#python#tornado
上次更新: 2023/01/15, 15:47:48
tornado 用户密码 bcrypt加密
tornado finish和write区别

← tornado 用户密码 bcrypt加密 tornado finish和write区别→

最近更新
01
django rest_framework 分页
03-20
02
学习周刊-第03期-第09周
03-03
03
学习周刊-第02期-第08周
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2023 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式