tornado初级篇

一:tornado代码初始化,入门基础

  创建python文件包

#!/usr/bin/env python
# -*- coding:utf-8 -*-

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()

 第一步:执行脚本,监听 8888 端口

 第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8888/index

 第三步:服务器接受请求,并交由对应的类处理该请求

 第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

 第五步:方法返回值的字符串内容发送浏览器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web
from tornado import httpclient
from tornado.web import asynchronous
from tornado import gen

import uimodules as md
import uimethods as mt

class MainHandler(tornado.web.RequestHandler):
        @asynchronous
        @gen.coroutine
        def get(self):
            print ‘start get ‘
            http = httpclient.AsyncHTTPClient()
            http.fetch("http://127.0.0.1:8008/post/", self.callback)
            self.write(‘end‘)

        def callback(self, response):
            print response.body

settings = {
    ‘template_path‘: ‘template‘,
    ‘static_path‘: ‘static‘,
    ‘static_url_prefix‘: ‘/static/‘,
    ‘ui_methods‘: mt,
    ‘ui_modules‘: md,
}

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

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

步非堵塞实例

二、连接数据库,登录版本的tornado

#!/usr/bin/env python
#-*-coding: utf-8 -*-
import tornado.ioloop
import tornado.web
import pymysql

class MainHandler(tornado.web.RequestHandler):
    def get(self):  #get 和 post的区别,get,url中传输数据
        self.render("login.html")

    def post(self, *args, **kwargs):  # 获取用户提交的数据
        username = self.get_argument(‘username‘, None)  # 获取数据,通过,get_argument
        pwd = self.get_argument(‘pwd‘, None)

        # 创建数据库连接
        conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘db1‘)
        cursor = conn.cursor()
        # temp = "select name from userinfo where name=‘%s‘ and password = ‘%s‘" % (username, pwd)    # 不安全
        # print(temp)
        effect_row = cursor.execute("select name from userinfo where name= %s and password = %s ", (username, pwd,))  #安全些
        result = cursor.fetchone()
        conn.commit()
        cursor.close()
        conn.close()
        if result:
            self.write(‘登录成功‘)
        else:
            self.write(‘登录失败‘)

settings = {
    "template_path":"template", # 模板路径
    ‘static_path‘: ‘static‘,     # 静态文件的处理,即对css文件的处理
    ‘static_url_prefix‘: ‘/static/‘,    # 静态文件的前缀
}

# 路由映射,路由系统
application = tornado.web.Application([
    (r"/login", MainHandler),       # ==》login.html
],**settings)

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

 2. login.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login" method="post">
        <input type="text" name="username" placeholder="用户" />
        <input type="text" name="pwd" placeholder="密码" />
        <input type="submit" />
    </form>
</body>
</html>

login.html

三、在tornado中定义模板路径

在模板中默认提供了一些函数、字段、类以供模板使用:

  • escapetornado.escape.xhtml_escape 的別名
  • xhtml_escapetornado.escape.xhtml_escape 的別名
  • url_escapetornado.escape.url_escape 的別名
  • json_encodetornado.escape.json_encode 的別名
  • squeezetornado.escape.squeeze 的別名
  • linkifytornado.escape.linkify 的別名
  • datetime: Python 的 datetime 模组
  • handler: 当前的 RequestHandler 对象
  • requesthandler.request 的別名
  • current_userhandler.current_user 的別名
  • localehandler.locale 的別名
  • _handler.locale.translate 的別名
  • static_url: for handler.static_url 的別名
  • xsrf_form_htmlhandler.xsrf_form_html 的別名

Tornado默认提供的这些功能其实本质上就是 UIMethod 和 UIModule,我们也可以自定义从而实现类似于Django的simple_tag的功能:
1、定义

def tab(self):
    return ‘UIMethod‘

uimethods.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.web import UIModule
from tornado import escape

class custom(UIModule):

    def render(self, *args, **kwargs):
        return escape.xhtml_escape(‘<h1>user</h1>‘)
        #return escape.xhtml_escape(‘<h1>user</h1>‘)

uimodules.py

2、注册

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web
from tornado.escape import linkify
import uimodules as md
import uimethods as mt

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render(‘index.html‘)

settings = {
    ‘template_path‘: ‘template‘,
    ‘static_path‘: ‘static‘,
    ‘static_url_prefix‘: ‘/static/‘,
    ‘ui_methods‘: mt,
    ‘ui_modules‘: md,
}

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

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

main.py

3、使用

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link href="{{static_url("commons.css")}}" rel="stylesheet" />
</head>
<body>
    <h1>hello</h1>
</body>
</html>

index.html

四、关于tornado的cookie的认识

cookie值即是用户登录系统后所有产生的cookie值,保留这种用户的客户端,再次登录只需要验证cookie值,就可登录成功

1、定义一个首页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>首页</h1>
</body>
</html>

index.html

2、定义登录页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login" method="post">
        <input type="text" name="username" />
        <input type="password" name="password" />
        <input type="submit" value="登录" />
        <span style="color: red">{{status_text}}</span>
    </form>
</body>
</html>

login.html

3、定义登录后才见到的页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="/logout">退出</a>
    <h1>银行卡余额1000</h1>
</body>
</html>

manager.html

4、主程序。逻辑关系的呈现

#!/usr/bin/env python
#-*-coding: utf8-*-

# 项目一,关于cookis的认识
#     viems文件夹
#         index.html  主页
#         login.html  登录页
#         manager.html    登录能看的页
#     __init__.py
#     runmain.py

import tornado.ioloop
import tornado.web

# 定义首页
class IndexHandler(tornado.web.RequestHandler):
    def get(self,*args,**kwargs):
        self.render(‘index.html‘,)

# 定义需要登录才能看到的页面,即需要有cookie
class ManagerHandler(tornado.web.RequestHandler):
    def get(self,*args,**kwargs):
        co = self.get_cookie(‘auth‘)
        if co == ‘1‘:
            self.render(‘manager.html‘,)
        else:
            self.redirect("/login")
# 定义登录后出现的退出程序
class LogoutHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.get_cookie(‘auth‘,‘0‘)
        self.render(‘/login‘ )

# 定义登录页,如果成功,则产生cookie
class LoginHandler(tornado.web.RequestHandler):
    def get(self,*args,**kwargs):
        self.render(‘login.html‘,status_text="")

    def post(self, *args, **kwargs):
        username = self.get_argument(‘username‘,None)
        pwd = self.get_argument(‘password‘,None)
        if username == ‘user‘ and pwd == "sb":
            self.set_cookie(‘auth‘,‘1‘)
            self.redirect(‘/manager‘)
        else:
            self.render(‘login.html‘,status_text="登录失败")

settings = {
    ‘template_path‘:‘viems‘,
}

application = tornado.web.Application([
    (r"/index", IndexHandler),
    (r"/login", LoginHandler),
    (r"/manager", ManagerHandler),
    (r"/logout",LogoutHandler)
], **settings)

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

runmain.py

运行程序,检验其逻辑关系,各个页面。127.0.0.1:8888/index ,127.0.0.1:8888/login,各个cookie值

5、补充cookie保存的时间,增加cookie值带的用户名

class LoginHandler(tornado.web.RequestHandler):
    def get(self,*args,**kwargs):
        self.render(‘login.html‘,status_text="")

    def post(self, *args, **kwargs):
        username = self.get_argument(‘username‘,None)
        pwd = self.get_argument(‘password‘,None)
        check = self.get_argument(‘auto‘,None)
        if username == ‘user‘ and pwd == "sb":
            if check:
                self.set_cookie(‘username‘,username,expires_days=7)
                self.set_cookie(‘auth‘,‘1‘,expires_days=7)
            else:
                r = time.time() + 100
                self.set_cookie(‘auth‘,‘1‘,expires=r)
                self.set_cookie(‘username‘, username, expires=r)
            self.redirect(‘/manager‘)
        else:
            self.render(‘login.html‘,status_text="登录失败")

time()_cookies.py

<body>
    <form action="/login" method="post">
        <input type="text" name="username" />
        <input type="password" name="password" />
        <input type="checkbox" name="auto" value="1" />7天免登录
        <input type="submit" value="登录" />

        <span style="color: red">{{status_text}}</span>
    </form>
</body>

time()_cookie.html

原文地址:https://www.cnblogs.com/linu/p/8139225.html

时间: 2024-08-02 01:08:52

tornado初级篇的相关文章

内存泄露之常见问题解决--初级篇

身为一个段子猿,我决定来写写最近的学习心得. 1.简介 在整个Android开发过程中,内存泄露是导致OOM的一个重点因素.大概意思就是:GC无法回收原本应该被回收的对象,这个对象就引发了内存泄露.那有什么危害呢?手机的内存大小是有限的,如果不能释放的话,你就无法创建新的对象,你的新界面等等就无法正常运行,然后程序就OOM了(OutOfMemory). 2.OOM以及内存泄露 OOM通俗点讲就是,你家里有2个厕所,本来你和你老婆用的话,都是够用的,有一天你不小心造人了,从此家里有了1+1=3个人

javascript调试之chrome初级篇

请原谅我的喜新厌旧! 以前我是firebug和firefox的忠实粉丝,虽然现在依然对ff心存好感,但是chrome在我心中的地位与日俱增.以前实习时导师看到我在用firebug调试时善意地告诉我以后要习惯用chrome,我还不以为意,直到现在深深地爱上了chrome的简洁方便.我基本不会html和css,js也只会那么一点,所以现在为止基本上不用用到高级一点的调试,so此文为调试之初级篇.

python_way ,day7 面向对象 (初级篇)

面向对象 初级篇 python支持 函数 与 面向对象 什么时候实用面向对象? 面向对象与函数对比 类和对象 创建类 class 类名 def 方法名(self,xxxx) 类里面的方法,只能对象去调用 对象 = 类名() 通过对象执行方法 对象.方法名(xxxx) 设计,增删改查功能 函数式: def fetch(self,host,port name passwd,sql) pass def create(self,host,port name passwd,sql) pass def re

(转)25个增强iOS应用程序性能的提示和技巧--初级篇

(转)25个增强iOS应用程序性能的提示和技巧--初级篇 本文转自:http://www.cocoachina.com/newbie/tutorial/2013/0408/5952.html 在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程中,有许多事项需要记住,并且关于性能影响很容易就忘记. 本文收集了25个关于可以提升程序性能的提示和技巧,把

移动端https抓包那些事--初级篇

对于刚刚进入移动安全领域的安全研究人员或者安全爱好者,在对手机APP进行渗透测试的时候会发现一个很大的问题,就是无法抓取https的流量数据包,导致渗透测试无法继续进行下去. 这次给大家介绍一些手机端如何抓取https流量的技巧. 下面将主要通过两个层次篇章来逐步向大家进行介绍: 第一篇章-初级篇:浅层次抓包.对于非root设备(Android)或非越狱设备(iOS)如何抓取https流量: 第二篇章-进阶篇:深层次抓包.对于root设备或者越狱设备如何抓取https流量. 对于非root An

canvas画图——初级篇

         canvas画图之初级篇 小女子准备将canvas画图分为初级篇,中级篇和高级篇来介绍,读者们不要着急哦. 初级篇 一.首先什么是canvas呢? canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆 布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现. canvas 英 ['kænv?s]  美 ['kænv?s]   帆布 画布 二.让我们先来了解下canvas的基

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET Identity ASP.NET Identity 其他API介绍 小节 在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP.NET Identity的建

NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者

NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者 作者: raindy 来源:http://bbs.hanzify.org/index.php?showtopic=30029 时间:2005-02-15 点击:70791 raindy NSIS简介: NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System)的缩写,它是一个免费的 Win32 安装.卸载系统,它的特点:脚本简洁高效:系统开销小:当然进行安装.

【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)

本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数