教你分分钟开发一个属于自己的python模块(一)——能够直接在浏览器打印的方法

  曾经,用惯了python print命令的人,惊叹于python语法的精简;后来,用过了tornado、django等web开发框架,不得不佩服当初开发这些框架的人们。于是,我们开始使用它们的框架==》一个被重复了无数次的配置。那么问题来了,如果我很多次的完成某个领域的类似问题,我需要每次都去重复的配置吗?偶然间,我在想,能否在它们的框架上继续精简,以在某种用途上实现更加高效的开发。web框架的使用,包含server端和browser端。本次改装采用tornado框架。

首先,我们从接触python第一天的print(“Helloworld!”)开始。

干货开始:

  首先我们来看一段精简的tornado代码:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/index", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

  上述代码实现了在浏览器端输出hello,world!从上到下各部分的功能依次是:模块导入、业务处理类、路由映射、服务端开启。

本博文详细介绍模块的改装,更多tornado基础内容,详见下面链接:

上述代码虽然实现了在浏览器的输出内容,但是有很多不足之处:

  • 每次打印一个东西,用户都需要写那么多代码
  • 只能支持字符串打印,不能支持字典、列表、元组等常见数据结构

我们知道,python的print用法很简单,只需要我们将需要打印的东西放在print内部,即可用一句话打印出我们想要的结果来。那么问题来了,有没有一种简单的方法能够类似print使用一句话在浏览器上打印出我们想要的任何数据结构?

  答案当然是:有。没错,你没有看错,接下来,博主来带你一步一步实现这个神奇的功能。

模块导入:

import tornado.ioloop
import tornado.web
import json

  和之前有所不同的是,我们增加了json模块,聪明你你应该已经猜到了,博主是想通过json实现对不同数据结构的支持,是的啊,没错!有人说,这不算什么,我也会,好,别走,继续往下看!更多精彩,详见下文!

解决思路:

  事实上,解决这个问题,其实很简单,核心问题就是如何通过传参方式,将用户需要打印的数据传递给self.write。

要解决这个问题,我们需要指定,tornado框架哪些地方可以进行传参,我们再来看一下tornado代码:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/index", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

  我们采用由内向外的分析方法:

  • 首先是self.write("Hello, world"),我们希望实现的结果是self.write(arg),arg代表用户传入的参数。而这个arg又要从哪里传入呢?包着它的是get方法,我们知道http协议的get方法可以通过在浏览器的url上通过问号加键值对的方式传入数据,可是难道用户每次打印数据都去浏览器的url输入吗?这明显不合理。因此get方法传参是行不通的。
  • 接下来往外是业务处理类MainHandler,它能传参吗?我们知道类是可以通过init方法进行传参的,每次对类进行实例化的时候进行传参即可,我们需要自己定义个init方法并继承父类的init方法吗?可是问题是,这个MainHandler到底是在哪里进行实例化的,我们又需要在哪里对其进行传参呢?这里就到了tornado的源码部分,可是源码岂能随便去改,因此init方法传参也不合理。
  • 为了遵循对源码封闭,对扩展开放的原则,其实tornado源码中已经为我们预留了位置,这就是传说中的initialize方法,也就是人们所说的“钩子”。

  initialize方法如何使用呢?

首先需要自己定义一个类,用于复写源码中的initialize方法,因为源码中initialize方法其实什么事也没干。

class BaseHandler(tornado.web.RequestHandler):
    def initialize(self,arg):
        self.arg=arg

  在这里,我们为initialize方法传入了参数arg,并给类增加属性self.arg=arg,这样做的目的是为了继承它的子类能够使用这个参数,这就是面向对象的封装,参数传递一次,这个类的子类的所有方法都是可以使用的。没错,聪明的你又发现了,等会如果我们的MainHandler类只要继承了BaseHandler类,那么MainHandler类的get方法中,就可以使用参数self.arg。下面就是MainHandler类的改装。

class MainHandler(BaseHandler):
    def get(self):
        self.write(self.arg)

  做到这里,你可能已经发现:好吧,initialize方法传参我会了,可是用户输入的参数又是如何传入initialize方法呢?

我们发现唯一跟MainHandler类有关的,就是路由映射了,它是一个元组,元组第0个元素是正则匹配,第一个元素是业务处理类的类名,于是博主就想,这里能否接收第三个参数呢?能否进行传参呢?来看一眼路由映射:

application = tornado.web.Application([
        (r"/index", MainHandler, ),
    ])

经过博主对Application类源码进行分析,果然,它是支持传第三个参数的:

源码截图:

源码中spec即每一个元组。更多源码问题,欢迎读者在下方评论,与博主进行探讨。经过博主多方咨询探讨,最终得出结论,第三个参数支持字典格式进行传递(源码中是**kwargs)。

路由映射改装代码:

  application = tornado.web.Application([
        (r"/index", MainHandler, dict(arg=json.dumps(request))),
    ])

同时,为了支持常见数据结构,博主采用json进行序列化数据。

以上就是整个改装流程,下面附整体代码模块和该模块的使用方法。

import tornado.ioloop
import tornado.web
import json

class BaseHandler(tornado.web.RequestHandler):
    def initialize(self,arg):
        self.arg=arg

class MainHandler(BaseHandler):
    def get(self):
        self.write(self.arg)
def print_to_browser(request,port=8888):
    application = tornado.web.Application([
        (r"/", MainHandler, dict(arg=json.dumps(request))),
    ])
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()

  上述模块是博主原创,封装了tornado路由映射、服务端开启,支持传参,第一个参数即需要打印的内容,第二个参数为可选参数,默认端口8888,如果用户有传递,则以用户输入的参数为准。

鉴于博主有文章被多家网站盗用,鉴于此,原谅博主在此插播声明一条:本博文为博主原创,转账请注明原文链接:http://www.cnblogs.com/wanghzh/p/5869336.html,谢谢合作!

模块使用:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from my.mytornado import print_to_browser  #导入上述模块

print_to_browser([1,2,3,4,])

 结果示例截图:

  上述使用方法是不是同python自带的print一样简单呢,支持字符串、字典、列表、元组等数据结构。默认域名:127.0.0.1,默认端口:8888。用户只需开启浏览器客户端即可(127.0.0.1:8888)。

如果您觉得本文对您有参考价值,,欢迎帮博主点下文章下方的推荐,非常谢谢!

时间: 2024-08-08 17:52:19

教你分分钟开发一个属于自己的python模块(一)——能够直接在浏览器打印的方法的相关文章

如何开发一个java开源框架-----Jvn框架之实现文件的上传以及方法封装(第六讲)八哥实力讲解

前言 一 . 博主正在教大家如何开发一个javaEE框架(Jvn框架),博客里有完整的开发视频,每一篇博文都是一个知识点,帮助大家理解框架: 博客首页:http://www.cnblogs.com/everxs/ 本次内容视频以及源码下载地址:http://pan.baidu.com/s/1pJsoGDd 1,为什么要使用java的框架,以及框架能带来什么好处.  2,帮助你们理解框架的原理. 3,框架是如何实现的.                                        

如何开发一个基于 Docker 的 Python 应用

前言 Python 家族成员繁多,解决五花八门的业务需求.这里将通过 Python 明星项目 IPython Notebook,使其容器化,让大家掌握基础的 Docker 使用方法. IPython Notebook 目前已经成为用 Python 做教学.计算.科研的一个重要工具. Docker 化应用的关键元素 镜像是 Docker 应用的静态表示,是应用的交付件,镜像中包含了应用运行所需的所有依赖:包括应用代码.应用依赖库.应用运行时和操作系统. Dockerfile 是一个描述文件,描述了

【Nginx】开发一个HTTP过滤模块

与HTTP处理模块不同.HTTP过滤模块的工作是对发送给用户的HTTP响应做一些加工. server返回的一个响应能够被随意多个HTTP过滤模块以流水线的方式依次处理.HTTP响应分为头部和包体,ngx_http_send_header和ngx_http_output_filter函数分别负责发送头部和包体.它们会依次调用各个过滤模块对待发送的响应进行处理. HTTP过滤模块能够单独处理响应的头部或者包体或同一时候处理二者.处理头部和包体的方法原型分别例如以下,它们在HTTP框架模块ngx_ht

win 10 开发零基础教学:教你做第一个App—— Hello world

期待已久的win10已经发布了,开发者们现在也可以开发win10 app.如果你是win10 开发的小白,如果你没有接触过app开发,不要怕,今天教大家怎么做一个Hello world应用程序!(此教程适合小白,开发者们请无视!) 1.首先打开vs2015,在文件处点击新建——项目,如图: 选择“通用”——选择“空白应用”,如图并将项目命名为 Hello world,点击确定. 这时候就新建好了我们的一个空白应用程序. 2.首先,我们来认识一下一个空白应用程序的项目组成. 如图所示,点击Main

手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引

近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开发一个小型的b/s结构的管理系统,已达到帮助团队成员快速掌握b/s结构信息系统的开发方法. 源码位置:https://github.com/kamiba/FineUIDemo 源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com

【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于它是一个框架,任何人都可

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

【如何快速的开发一个完整的iOS直播app】(播放篇)

前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦 本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成[ijkplayer]遇见的各种坑. 很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以

学做酷炫有爱的免费网页,学习 Github Page 教你分分钟搭建自己的博客

Github Page 网页搭建教程,教你分分钟搭建自己的博客 更多漂亮的网页搭建教程教程,请看这里:http://www.duobei.com/course/8506331668 1.注册Github账号 2.新建一个仓库,也就是我们代码要存放的位置 为我们仓库起个名字 3.为我们的仓库自动生成一个网页 点击Gihub Pages模块里的Automatic page generator 设置我们网页的Body内容 点击发布,生成我们的网页 按照 username.github.io/repos