9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用

本文主要是介绍9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在很多情况下,前端模板中在很多页面有都重复的内容可以使用,比如页头、页尾、甚至中间的内容都有可能重复。这时,为了提高开发效率,我们就可以考虑在共同的部分提取出来,
主要方法有如下:
1. 模板继承
2. UI模板

1 模板继承

common/base.html

{% block content %}
{% end %}

shop2.html

{% extends 'common/base.html'%}{% block content %}
{% end %}

2 UI模板

Tornado中支持累死Vue中的组件功能,就是也公共的内容提取出来当成组件。
具体的使用方式是用tornado.web.UIModule

class Entry(tornado.web.UIModule):def render(self, entry, show_comments=False):return self.render_string("module-entry.html", entry=entry, show_comments=show_comments)settings = {"Entry": Entry,
}

3 个人信息案例

环境搭建

在网站中,少了数据CRUD的操作,但在tornado中,我们知道若想操作的话尽量使用异步的操作,这样效率才会高。

那应该如何编写呢,下面我们来一起做下吧。首先我们先一起搭建下环境。

具体的操作如下:

前端

copy 原生素材

html —> templates

css —> static/css

js —> static/js

img —> static/img

到项目中

后端

from tornado import web, ioloop
from tornado.web import StaticFileHandlerclass IndexHandler(web.RequestHandler):def get(self):self.render('personal.html')import os
base_url = os.path.dirname(os.path.abspath(__file__))
settings={'static_path':os.path.join(base_url,'static'),'static_url_prefix':'/static/','template_path':os.path.join(base_url,'templates')
}
if __name__ == "__main__":app = web.Application([web.URLSpec('/',IndexHandler,name='index'),],debug=True,**settings)app.listen(8000)ioloop.IOLoop.current().start()

MySQL

CREATE TABLE `tornado_demo1`.`t_user`  (`id` int(10) NOT NULL,`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`nick_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`passsword` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

熟悉Mysql操作

之前我们了解过pymysql操作数据库,但那是同步的。

我们需要使用一个异步的框架,在这,我们推荐使用aiomysql,它的底层大量的使用了pymysql,只是它通过asyncio实现的访问数据库

安装方式

pip install aiomysql

使用方式

import asyncio
import aiomysqlasync def test_example(loop):pool = await aiomysql.create_pool(host='127.0.0.1', port=3306,user='root', password='root',db='mysql', loop=loop)async with pool.acquire() as conn:async with conn.cursor() as cur:await cur.execute("SELECT 42;")print(cur.description)(r,) = await cur.fetchone()assert r == 42pool.close()await pool.wait_closed()loop = asyncio.get_event_loop()
loop.run_until_complete(test_example(loop))

4 ORM的使用

4.1 peewee的使用

官网链接

Peewee是一个简单而小型的ORM。使其易于学习且使用直观。

  • 一个小的,表达力很强的ORM
  • python 2.7+和3.4+(使用3.11开发)
  • 支持sqlite,mysql,postgresql和cockroachdb
  • 大量的扩展

安装

pip install peewee
 tip
需要安装pymysql,不然会报错

peewee.ImproperlyConfigured: MySQL driver not installed!

### 使用方式 #### 创建表from peewee import *db =  MySQLDatabase('message', host="127.0.0.1", port=3306, user="root", password="root")class BaseModel(Model):create_time = DateTimeField(default=datetime.now, verbose_name="添加时间")class Music(BaseModel):name = CharField(index=True)singer = CharField(max_length=11, verbose_name="演唱者")duration = CharField(max_length=11, verbose_name="时长")_type = CharField(max_length =11,verbose_name="音乐类型")commany = ForeignKeyField(Commany,verbose_name="版权",backref = "musics")class Meta:database = db table_name = 't_music'class Commany(BaseModel):name = CharField()address = CharField()year - CharField()
db.create_tables([Cmmany,Music])
增加数据
    c = Commany()c.name = '北京尚学堂'c.full_name = '北京'c.year = 2003c.save()print(c.id)m = Music(name='中国', singer='中国1', duration='1:50',_type='流行', commany=c.id)m.save()

案例数据

    commanys = [{'name': '滚石唱片','full_name': '滚石国际音乐股份有限公司','year': 1980},{'name': '华谊兄弟','full_name': '华谊兄弟传媒股份有限公司','year': 1994},{'name': '海蝶音乐','full_name': '北京太合音乐文化发展有限公司','year': 1986},]musics = [{"name": "你是我左边的风景","singer": "林志炫","duration": "2:20","_type": "摇滚","commany": 1},{"name": "把你揉碎捏成苹果","singer": "薛之谦","duration": "2:10","_type": "摇滚","commany": 3},{"name": "游戏人间","singer": "童安格","duration": "1:20","_type": "流行","commany": 2},{"name": "故乡的云","singer": "费翔","duration": "2:40","_type": "摇滚","commany": 1},{"name": "诺言Jason","singer": "青城山下白素贞","duration": "1:10","_type": "古典","commany": 3},{"name": "勇敢的幸福","singer": "Sweety","duration": "1:23","_type": "古典","commany": 2},{"name": "爱丫爱丫","singer": "By2","duration": "2:22","_type": "流行","commany": 1},{"name": "我也曾像你一样","singer": "马天宇","duration": "2:28","_type": "流行","commany": 1}]#### 查询数据The following types of comparisons are supported by peewee:| Comparison | Meaning                                 || ---------- | --------------------------------------- || `==`       | x equals y                              || `<`        | x is less than y                        || `<=`       | x is less than or equal to y            || `>`        | x is greater than y                     || `>=`       | x is greater than or equal to y         || `!=`       | x is not equal to y                     || `<<`       | x IN y, where y is a list or query      || `>>`       | x IS y, where y is None/NULL            || `%`        | x LIKE y where y may contain wildcards  || `**`       | x ILIKE y where y may contain wildcards || `^`        | x XOR y                                 || `~`        | Unary negation (e.g., NOT x)            |Because I ran out of operators to override, there are some additional query operations available as methods:| Method                | Meaning                                         || --------------------- | ----------------------------------------------- || `.in_(value)`         | IN lookup (identical to `<<`).                  || `.not_in(value)`      | NOT IN lookup.                                  || `.is_null(is_null)`   | IS NULL or IS NOT NULL. Accepts boolean param.  || `.contains(substr)`   | Wild-card search for substring.                 || `.startswith(prefix)` | Search for values beginning with `prefix`.      || `.endswith(suffix)`   | Search for values ending with `suffix`.         || `.between(low, high)` | Search for values between `low` and `high`.     || `.regexp(exp)`        | Regular expression match (case-sensitive).      || `.iregexp(exp)`       | Regular expression match (case-insensitive).    || `.bin_and(value)`     | Binary AND.                                     || `.bin_or(value)`      | Binary OR.                                      || `.concat(other)`      | Concatenate two strings or objects using `||`.  || `.distinct()`         | Mark column for DISTINCT selection.             || `.collate(collation)` | Specify column with the given collation.        || `.cast(type)`         | Cast the value of the column to the given type. |To combine clauses using logical operators, use:| Operator   | Meaning              | Example                                              || ---------- | -------------------- | ---------------------------------------------------- || `&`        | AND                  | `(User.is_active == True) & (User.is_admin == True)` || `\|` (pipe) | OR                   | `(User.is_admin) \| (User.is_superuser)`              || `~`        | NOT (unary negation) | `~(User.username.contains('admin'))`                 |Here is how you might use some of these query operators:# Find the user whose username is "charlie".
User.select().where(User.username == 'charlie')# Find the users whose username is in [charlie, huey, mickey]
User.select().where(User.username.in_(['charlie', 'huey', 'mickey']))Employee.select().where(Employee.salary.between(50000, 60000))Employee.select().where(Employee.name.startswith('C'))Blog.select().where(Blog.title.contains(search_string))

更新数据

def update_music():# 方法1:获取数据,在对象上直接修改# m = Music.get_by_id(1)# m.singer='林志炫666'# m.save()# 方法2:利用类方法# update table set ??? where ???Music.update(singer='林志炫').where(Music.id == 1).execute()

删除数据

def delete_music():# 方法1:直接删除对象# m = Music.get_by_id(8)# m.delete_instance()# 方法2:利用类方法Music.delete().where(Music.id >5).execute()

4.2 peewee_async

peewee_async

安装

PostgreSQL

pip install --pre peewee-async
pip install aiopg

MySQL

pip install --pre peewee-async
pip install aiomysql

案例

import asyncio
import peewee
import peewee_async# Nothing special, just define model and database:database = peewee_async.PostgresqlDatabase(database='db_name',user='user',host='127.0.0.1',port='5432',password='password'
)class TestModel(peewee.Model):text = peewee.CharField()class Meta:database = database# Look, sync code is working!TestModel.create_table(True)
TestModel.create(text="Yo, I can do it sync!")
database.close()# Create async models manager:objects = peewee_async.Manager(database)# No need for sync anymore!database.set_allow_sync(False)async def handler():await objects.create(TestModel, text="Not bad. Watch this, I'm async!")all_objects = await objects.execute(TestModel.select())for obj in all_objects:print(obj.text)loop = asyncio.get_event_loop()
loop.run_until_complete(handler())
loop.close()# Clean up, can do it sync again:
with objects.allow_sync():TestModel.drop_table(True)# Expected output:
# Yo, I can do it sync!
# Not bad. Watch this, I'm async!

5 WTForms的使用

简介

WTForms是用于Python Web开发的灵活的表单验证和呈现库。它可以与您选择的任何Web框架和模板引擎一起使用。

WTForms文档
WTForms_Tornado

安装

pip install wtforms-tornado

案例

import tornado.ioloop
import tornado.webfrom wtforms.fields import IntegerField
from wtforms.validators import Required
from wtforms_tornado import Formclass SumForm(Form):a = IntegerField(validators=[Required()])b = IntegerField(validators=[Required()])class SumHandler(tornado.web.RequestHandler):def get(self):self.write("Hello, world")def post(self):form = SumForm(self.request.arguments)if form.validate():self.write(str(form.data['a'] + form.data['b']))else:self.set_status(400)self.write("" % form.errors)application = tornado.web.Application([(r"/", SumHandler),
])if __name__ == "__main__":application.listen(8888)tornado.ioloop.IOLoop.instance().start()

表单验证

wftform.py

from wtforms.fields import IntegerField,StringField
from wtforms_tornado import Form
from wtforms.validators import DataRequired, Lengthclass UserForm(Form):id = IntegerField('ID')username  = StringField('用户名',validators=[DataRequired(message='请输入用户名'),Length(min=3,max=8,message='请输入3-8长度的用户名')])nick_name = StringField('昵称')email = StringField('Email')password = StringField('密码')phone = StringField('手机号')language = StringField('语言')

handler.py

forms = UserForm(self.request.arguments)
if forms.validate():del forms.data['id']await objs.create(User,**forms.data)self.render('personal26.html',user_form = forms)
else:self.render('personal26.html',user_form = forms)

HTML生成

{% autoescape None %}{% for field in user_form %}{% if field.label.text == "ID"%}<div class="form-group">{{ field(class_="au-input au-input--full",placeholder=field.label.text)}}</div>{% else %}<div class="form-group">{{ field.label }}{{ field(class_="au-input au-input--full",placeholder=field.label.text)}}{% if field.errors %}{{field.errors}}{% end %}</div>{% end %}                            
{% end %}

这篇关于9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/462372

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —