记可视化项目学习之旅--1.RequestHandler;python-self;mongodb

来源:互联网 发布:西瓜影音播放网络文件 编辑:程序博客网 时间:2024/06/05 06:06

第一次接手做前端后端大融合的一个小项目,项目代码在手里已经一个月了,一直没太有时间仔细研究。沉下心来去学点东西、做点事情还是很开心的。

从今天开始开个专栏,每天记录一下自己所学的内容。可能条理性不是很清晰,因为是初学,大致就是笔记性质的内容。从后端代码开始入手,一点点从最基础的内容开始。

项目是地铁信息的可视化,数据存在服务器上,会在前端生成一个地铁线路图主导的可视化界面。

最近的一个小目标,就是为项目添加一个小功能,时间线。

好啦,我要开始努力了!

-----------------------------------------------------------1. RequestHandler--------------------------------------------------

之前连mvc都不懂的我,先从后端数据读取调用开始学习好了~

关于mvc,之前转载了一篇很棒的文章,现在主要研究某个请求到了后端之后,数据如何被调用提取。

后端的模块约有10个,我仔细研究了一下,好像每个文件的结构都很类似,基本上都是下面这个样子:

import json
import os
import gc
import pymongo
import tornado.web

class SXXXBXXXInfoHandler(tornado.web.RequestHandler):

dbConnect = None

def initialize(self, db_connect):
self.dbConnect = db_connect

def post(self, input):
try:...
except AssertionError:...
return

result = {}
...
self.write(result)

def get_basic_info(self, curType):

station_info = {}
line_info = []
...
return station_info, line_info

后来就看到一篇关于RequestHandler的很棒的博客,总结一下要点:

C/S(客户端/服务器)工作原理:服务器被动地捕获(监听)客户端的信息,并对客户端发送来的请求选择性地完成某项行为并反馈给客户。比如你在网页上点击一按钮,那么就会有一条“某某按钮被按下”的请求发送给当前网页的后台服务器。服务器收到这条请求后,可能返回一条“刷新”的指令到你的浏览器,那么你的浏览器作为客户端收到这条指令便执行刷新行为,于是一个C/S过程就完成了。

RequestHandler就是服务器处理客户端请求的一个,它的主要任务就是上述接受“某某按钮被按下”的请求,并返回“刷新”指令。

大多数Tornado网页应用的具体行为都是在继承了RequestHandler的子类里完成的。handler子类可以利用get(),post()等方法处理接受到的各种各样的网页请求(request),而每一个handler可以定义多个get(),post()等方法。通常这些方法都有一个参数self,代表自身的RequestHandler对象。在handler内,利用self调用self.render(...)(RequestHandler.render(...))或者self.write(...)(RequestHandler.write(...))等函数执行一些行为。render通过名字加载一个模板(template),可以是html等文件。write是基于非模板类的输出,它接受字符串(strings)、字节(bytes)和字典(dictionaries)作为输出。

工作流程:

每当RequestHandler收到一个request请求,都将依次执行下面的步骤:

1.新的RequestHandler对象被创建(对应每一个请求)

2.对象的initialize()被调用,传入的参数来自Application组态。initialize应该只把传入的参数保存在自身的成员变量中,而不应该提供任何的输出或调用如send_error等方法。

3.对象的prepare()被调用,这是你所有handler子类所继承的最有用的函数,因为不管哪一个HTTP方法被使用prepare都会被调用,并且prepare可以提供输出。如果prepare里使用了finish或者redirect(etc),那么进程就在此结束。

4.其中一个HTTP方法(get()/post()/put() .etc)被调用,如果URL的正则表达式含有捕获信息,那么额外的参数将被传入这个方法。如[url(r"/reverse/(\w+)",ReverseHandler)],那么在class ReverseHandler(tornado.web.RequestHandler)类里就可以使用def get(self, input):,其中传入的参数input就是url正则表达式中(\w+)捕获信息提供的。

5.当请求任务完成时,对象的on_finish()函数被调用。值得注意一点的是,on_finish函数在单线程handler里是紧跟get()(etc)返回后执行的,而在异步handler里它是在finish()后执行的。


除了get()/post()/..等方法,RequestHandler还有许多方法需要程序员重写才能利用。因此常见的方法是自己先定义一个BaseHandler继承RequestHandler,然后重写里面的一些函数,使用时再继承BaseHandler,而不是到使用时再在每个类里重写RequestHandler。


原文请见:http://blog.csdn.net/simba_scorpio/article/details/41144177


这样子每个后台的小模块的基本结构就差不多清楚了

-----------------------------------2.python--self -----------------------

下一个困惑是关于self,希望对python中self的调用方法和规则明确一下,总结为以下几点:

1.self只有在类的方法里才会有,而且在定义类的方法时必须有(调用时不必传入相应参数),独立的函数或方法不必有self。

2.self名称不是必须的

3.self指的是类实例对象本身,而非类本身!!

-----------------------------------------------3.mongodb --$match $group----------------------

项目的数据存在mongodb中,对数据进行读取还必须了解一下:数据读入、过滤、聚合的方法和pipeline相关知识

mongodb是非关系型数据库,不过学习其对于数据的查询处理可以类比SQL。

sxxxExxxPipeline = [
{'$match': {
'TIME_RANGE_INDEX': {'$gte': curStTimeIndex, '$lte': curNdTimeIndex}
}},
{'$group': {
'_id': "$STATION_ID",
'count': {'$sum': "$START_COUNT"}
}}
]

(1)$match: 滤波操作,筛选符合条件文档,作为下一阶段的输入,语法和查询表达式(db.collection.find())的语法相同

db.articles.aggregate( [

{ $match : { score : { $gt : 70, $lte : 90 } } },

{ $group: { _id: null, count: { $sum: 1 } } }

] );

$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。

(2)$group 对数据进行分组

    $group的时候必须要指定一个_id域,同时也可以包含一些算术类型的表达式操作符:

db.article.aggregate(

{ $group : {

_id : "$author",

docsPerAuthor : { $sum : 1 },

viewsPerAuthor : { $sum : "$pageViews" }

}});

注意:  1.$group的输出是无序的。

          2.$group操作目前是在内存中进行的,所以不能用它来对大量个数的文档进行分组。