Tornado开发硬件监测 - 实现简单搜索功能

实验数据的简单搜索功能

400 服务器未能理解请求 也就是前后端参数有时候会不注意写错 更正就好了

获取前端参数 比如实验日期 搜索 例如20190304
开始查询数据库 建立session之类的 我也不会 找找看
实验就全部出来了 然后得canvas实现 表单的打印功能 也可以不用canvas 找找方案

前后端通信这块没问题了

前后端通信

往数据库里增添数据 mysqlworkbench
mysqlworkbench 添加数据

基本操作

session query 数据库查询方法
涉及到的数据库查询方法都在这里了
Tornado SQLAlchemy 操作
官方参考文档
我用到的是模糊查询

rs = session.query(Test_lib).filter(Test_lib.lib_machine_time.like('%' + search_val + '%')).all()
//这里注意 like里面的写法 而且返回的是对象 实例 里面是list 得循环遍历获得每一项 然后简单做个操作返回给前端即可

model里代码

# -*- coding: utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base  # 模型继承父类
from sqlalchemy import create_engine
from sqlalchemy.dialects.mysql import BIGINT  # 导入字段
from sqlalchemy import Column,String # 创建字段




# 配置一下连接信息
mysql_configs = dict(
        db_host="127.0.0.1",  # 主机地址
        db_name="monitor",  # 数据库名称
        db_port=3306,  # 数据库端口
        db_user="root",  # 数据库用户
        db_pwd="root"  # 数据库密码
    )

"""
连接格式:mysql+驱动名称://用户:密码@主机:端口/数据库名称
"""
link = "mysql+mysqlconnector://{db_user}:{db_pwd}@{db_host}:{db_port}/{db_name}".format(
        **mysql_configs
)

# 创建连接引擎,encoding定义编码,echo是(True)否(False)输出日志
engine = create_engine(link, encoding="utf-8", echo=True)

Base = declarative_base(engine)  # 调用

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine)
session = Session()

class Test_lib(Base):
    __tablename__ = "board_data"
    id = Column(String(20),primary_key=True)
    create_date = Column(String(20))
    lib_machine_num = Column(BIGINT)
    lib_machine_tem = Column(String(20))
    lib_machine_time = Column(String(20))
    lib_machine_valum = Column(String(20))
    lib_machine_elect = Column(String(20))
    lib_machine_g_elect = Column(String(20))



if __name__ == '__main__':
    Base.metadata.create_all(engine)

view层代码

# -*- coding: utf-8 -*-
import tornado.web
import json
from app.models.lib_models import Test_lib, session


class SearchHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.render("search.html")

    def post(self, *args, **kwargs):
        search_val = self.get_argument("search_val")
        print(search_val)
        data_list = set()
        rs = session.query(Test_lib).filter(Test_lib.lib_machine_time.like('%' + search_val + '%')).all()
        b = {}
        a=[]

        # print(rs,type(rs))
        for p in rs:
            keys = ('id',
                    'create_date',
                    'lib_machine_num',
                    'lib_machine_tem',
                    'lib_machine_time',
                    'lib_machine_valum',
                    'lib_machine_elect',
                    'lib_machine_g_elect')
            values = ((p.id,
                  p.create_date,
                  p.lib_machine_num,
                  p.lib_machine_tem,
                  p.lib_machine_time,
                  p.lib_machine_valum,
                  p.lib_machine_elect,
                  p.lib_machine_g_elect
                           ))

            b={k:v for k,v in zip(keys,values)}  //这里我处理了很久 就是python的数据类型不是太熟悉 花了很久 其实这里也学到了一些方法
            print(b)
            a.append(b)
        str_json = json.dumps(a, indent=2, ensure_ascii=False)
        print(str_json)
        self.write(str_json)

这里有2篇讲ORM_SQLAlchemy写的挺好的
第一篇
第二篇

前后端通信:
总流程:
(1)生成application实例

(2)服务器监听

(3)到收到请求的时候,生成request对象,根据 交给 application查询路径映射表

(4)根据路径表生成handler实例.

(5)把request发送给handler实例.

(6)handler实例进行处理.

详细情况如下:
(1)basehandler实例化.执行basehandler的init(),然后执行对应handler的init()
(2)当进入某个请求,比如get()方法, 会先执行get_current_user()方法.如果有这返回这个用户的信息,没有就是None.
(3)如果get()方法嵌套了修饰器, 那么就先get,作为参数, 传入修饰器, 先执行修饰器
(4)最后执行get()方法.

实例代码


# tornado读取客户端提交的访问参数演示
# 获取参数用 arg=self.get_query_argumnet()  -----get方式
# args=self.get_query_arguments()      -----get方式
# 异常,不传递参数时的处理
# post方式获取参数

'''
前端方式提交post的时候,会以name的值的属性为键,input中的值为值传递给后台
真正的post到后台的数据时放到请求体中的
arg=self.get_body_argument()
args=self.get_body_arguments()
-----------------------------------------------
第三种取参
先获取地址栏中的内容,在取请求体中的内容
 #get_argument = get_query_argument+get_body_argument
        arg2 = self.get_argument('day')
        print('get_argument获取的arg: ',arg2)
        arg2s = self.get_arguments('day')
        print('get_arguments获取的args: ', arg2s)
        
获取请求头中的信息
self.request.headers
'''
 
 
 
import tornado
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_config_file
from tornado.web import Application, RequestHandler
 
# 用来响应用户请求
class IndexHandler(RequestHandler):
    #响应以get方式发起的请求
    def get(self, *args, **kwargs):
        #CTRL + / 注释代码
        # 第一种处理不传参数的方式
        # try:
        #     arg = self.get_query_argument('day')
        # except Exception as e:
        #     arg = None
 
        #第二种处理不传参数的方式
        #同一个参数可以赋予不同的值,一次统一提交到服务器
        arg = self.get_query_argument('day',None)  #只取一个参数,最新的,最近的
 
        print('arg---->',arg)
        args = self.get_query_arguments('day')          #获取所有的参数
        print('args---->',args)
 
        # 服务器给浏览器的响应内容
        self.write('hello aid1710')
    #响应以post方式发起的请求
    def post(self, *args, **kwargs):
 
        arg = self.get_body_argument('day',None)
        print('post方式获取的arg: ',arg)
        args = self.get_body_arguments('day')
        print('post方式获取的args: ', args)
 
 
        #get_argument = get_query_argument+get_body_argument
        arg2 = self.get_argument('day')
        print('get_argument获取的arg: ',arg2)
        arg2s = self.get_arguments('day')
        print('get_arguments获取的args: ', arg2s)
 
        #利用requesthandler中的一个属性request
        #获取请求头中感兴趣的内容
        #Content-Type, myheader, yourheader
        head = self.request.headers
        print('head的类型:',type(head))
        ct = head.get('Content-Type',None)
        mh = head.get('myheader',None)
        yh = head.get('yourheader',None)
 
        print('Content-Type--->',ct)
        print('myheader--->',mh)
        print('yourheader--->',yh)

        self.write('hello post')

推荐
前后端是如何通信的

我遇到的问题:
1.list 合并
2.list 转 dict (即转json 传输用不然会提示 list不能用来传递)

import json
l=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
keys=['a','b','c','d']
list_json=[dict(zip(keys,item)) for item in l]
#  indent缩进量,ensure_ascii=False支持中文
str_json=json.dumps(list_json,indent=2, ensure_ascii=False)
print(str_json)

数据类型操作汇总
3.python的for 循环是没有index的 要加上 for i,k in enumerate(data_list) 类似这样

不支持哈希

4.前后端通讯 一定要清楚而且设计合理

还有一些内容想不起来了 就先写到这里
22点14分 再不走没车回家了 fuck

你可能感兴趣的:(Tornado开发硬件监测 - 实现简单搜索功能)