首页 > 编程语言 >python学习笔记-tornado框架

python学习笔记-tornado框架

时间:2023-12-07 23:35:13浏览次数:26  
标签:__ python self random 笔记 tornado str def

一、简单介绍tornado

tornado学习概要

1、基本操作
-路由系统
-视图函数
2、自定义开源组件
session
Form表单验证
3、自定义异步非阻塞web框架

1、简单示例

import tornado.ioloop
import tornado.web

class MainHandle(tornado.web.RequestHandler):
    def get(self):
        self.write("hello,world")

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

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

结果:

 二、tornado基本操作

1、使用render

2、配置模板路径

目录

 配置setting

 3、redirect

 4、基于cookie的登录验证

设置cookie

 获取cookie

 5、使用加密cookie

加密cookie依赖配置文件cookie_secret

获取和设置加密cookie

self.get_secure_cookie("xxx")
self.set_secure_cookie("xxx","000")

在setting里配置

 浏览器访问,cookie

 6、基本方法整理

get_argument 从get和post里都去取
get_query_argument 从get里面取
get_body_argument 从post里去取

self.get_argument()
self.get_arguments()
self.get_cookie()
self.set_cookie()
self.get_secure_cookie()
self.set_secure_cookie()
v=self.request.files['asd']

三、模板引擎(更接近python)

1、基本场景

{{ li[0] }}

{% for i in range(10) %}
{% end %}

模板原理:用的字符串拼接的方式

2、UIMethod,UIModule  类似于Django的simple_tag的功能,在模板中自定制方法

  UIMethod      内容

  UIModule      css,js  内容(可以返回这些内容)

2.1、示例

uimothod示例

>定义,创建py文件

#uimethods.py
def tab(self):  #这里的self是request对象
    return 'UIMethod'

>注册

> 使用

 >结果

 uimodule示例

>定义,创建py文件uimodules.py

from tornado.web import UIModule

class Custom(UIModule):
    def render(self,*args,**kwargs):
        return 'modules'

>注册和应用同上

2.2、uimethod,uimodule还可以传参数

2.3、uimethod默认会转义,uimodule默认不转义

UIMethod含HTML标签时,前端显示的字符串,是因为<>符号进行了转义

UIMethod

 UImodule

 前端效果

 >UImethod有标签语句时,设置不转义,输出标签而不是字符串,有2中方法,如下

方法一:前端写法实现

{% raw tab() %}

  

效果

 方法二:在setting里设置实现

 效果

 >uimodule不转义,可以自己设置转义,如下

modules.py

from tornado.web import UIModule
from tornado import escape

class Custom(UIModule):
    def render(self,*args,**kwargs):
        v=escape.xhtml_escape('<del>modules</del>')
        return v

前端

 效果

 2.4、uimodule可以引入css,js

from tornado.web import UIModule
from tornado import escape

class Custom(UIModule):
    #引入css文件,(从静态文件中引入的,要先配置静态文件夹)
    def css_files(self):
        return "commons.css"
    #嵌入css
    def embedded_css(self):
        return ".c1{display:none}"
    #引入js
    def javascript_files(self):
        return "commons.js"
    #嵌入js语句
    def embedded_javascript(self):
        return "function f1(){alert(123)}"
    def render(self,*args,**kwargs):
        v=escape.xhtml_escape('<del>modules</del>')
        return v

配置的静态文件

 查看网页,引入了css,js

 四、tornado自定义session

1、继承的回顾

super不仅仅找父类,按照深度优先或广度优先找的

class C:
    def f1(self):
        print('C')
        super(C,self).f1()#从c的父类中找,没找到按照广度从B中找,执行B的f1
class A(C):
    def f1(self):
        print('A')
        super(A,self).f1()
class B:
    def f1(self):
        print("B")
class Foo(A,B):
    pass

obj=Foo()
obj.f1()

 执行obj.f1(),输出是A,C,B

指定要执行的方法,写法

class A(C):
    def f1(self):
        print("A")
        B.f1(self)

2、自定义session的原理

》tornando,源码逻辑,是先实例化再执行的post或get,自己的没有写init一定是继承的父类实现了这个方法
查看源码是init中预留了initialize方法,直接写方法并进行继承就可以实现自定制,(根据深度广度优先Foo写在前面)

 另一种写法:

 python有这两种写法,因为pytho支持多继承,java不支持就只有一种写法

obj['asdf']=123      #自动调用执行了obj对象中的__setitem__方法

def __setitem__(self,key,value):
    pass

obj['asdf']              #__getitem__(self,key)
del obj["asdf"]       #__delitem__(self,key)

#自定义session要实现的步骤
1、生成随机字符串
2、写入用户cookie
3、后台存储

3、自定义session

示例1

import tornado.ioloop
import tornado.web

import time
import hashlib

container={}

class Bar(object):
    def __init__(self,handler):
        self.handler=handler
    def create_random_str(self):
        v=str(time.time())
        m=hashlib.md5()
        m.update(bytes(v,encoding="utf-8"))
        return m.hexdigest()

    def __setitem__(self, key, value):
        # 1、生成随机字符串
        # 2、写入用户cookie
        # 3、后台存储
        random_str=self.create_random_str()
        self.handler.set_cookie("session_id",random_str)
        if random_str in container:
            container[random_str][key]=value
        else:
            container[random_str]={}
            container[random_str][key]=value

    def __getitem__(self, item):
        pass
    def __delitem__(self, key):
        pass

class Foo(object):
    def initialize(self):
        #self是MainHandle对象
        self.session=Bar(self)
        super(Foo,self).initialize()

class MainHandle(Foo,tornado.web.RequestHandler):
    def get(self):
        self.session["xx"]="addf"
        self.session["aaa"]='BBBB'
        self.write("Hello,world")

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

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

实例2,根据不同用户,对session进行处理

import tornado.ioloop
import tornado.web

import time
import hashlib

container={}

class Bar(object):
    def __init__(self,handler):
        self.handler=handler
        self.random_str=None
        #x先去请求获取session_id,如果没有,新用户
        client_random_str=self.handler.get_cookie("session_id")

        if not client_random_str:
            #新用户
            self.random_str = self.create_random_str()
            container[self.random_str]={}
        else:
            if client_random_str in container:
                #老用户
                self.random_str=client_random_str
            else:
                #非法用户
                self.random_str=self.create_random_str()
                container[self.random_str] = {}

        self.handler.set_cookie("session_id",self.random_str)
    def create_random_str(self):
        v=str(time.time())
        m=hashlib.md5()
        m.update(bytes(v,encoding="utf-8"))
        return m.hexdigest()

    def __setitem__(self, key, value):
        container[self.random_str][key]=value

    def __getitem__(self, key):
        return container[self.random_str].get(key)
    def __delitem__(self, key):
        del container[self.random_str][key]
    def clear(self):
        del container[self.random_str]

class Foo(object):
    def initialize(self):
        #实例去调时,这里self是MainHandle对象
        self.session=Bar(self)
        super(Foo,self).initialize()

class HomeHandle(Foo,tornado.web.RequestHandler):
    def get(self):
        user=self.session['uuuu']
        if not user:
            self.redirect("http://www.baidu.com")
        else:
            self.write("Hello,world,%s"%user)

class LoginHandle(Foo,tornado.web.RequestHandler):
    def get(self):
        self.session["uuuu"]="root"
        self.redirect('/home')


application=tornado.web.Application([
    (r"/login",LoginHandle),
    (r"/home",HomeHandle),
])

if __name__=="__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
自定义session二

实例3,增加过期时间,扩展session存储到不同的介质的方法 封装

》语句in,执行in逻辑时候,相当于调用了__contains__方法

class Foo:
    def __contains__(self,item):
        print(item)
        return True
obj=Foo()

v="x" in obj   #执行结果是打印x


》session封装

import tornado.web

import time
import hashlib

#保存到缓存
class Cache(object):
    def __init__(self):
        self.container={}
    def __contains__(self, item):
        return item in self.container
    def initial(self,random_str):
        self.container[random_str] = {}
    def open(self):
        pass
    def close(self):
        pass
    def get(self,random_str,key):
        return self.container[random_str][key]
    def set(self,random_str,key,value):
        self.container[random_str][key]=value
    def delete(self,random_str,key):
        del self.container[random_str][key]
    def clear(self,random_str):
        del self.container[random_str]
#保存到文件
class File(object):
    pass

P=Cache
class Session(object):
    def __init__(self,handler):
        self.handler=handler
        self.random_str=None
        self.ppp=P()
        self.ppp.open()
        #x先去请求获取session_id,如果没有,新用户
        client_random_str=self.handler.get_cookie("session_id")

        if not client_random_str:
            #新用户
            self.random_str = self.create_random_str()
            self.ppp.initial(self.random_str)
        else:
            if client_random_str in self.ppp:
                #老用户
                self.random_str=client_random_str
            else:
                #非法用户
                self.random_str=self.create_random_str()
                self.ppp.initial(self.random_str)
        ctime=time.time()
        self.handler.set_cookie("session_id",self.random_str,expires=ctime+1800)
        self.ppp.close()
    def create_random_str(self):
        v=str(time.time())
        m=hashlib.md5()
        m.update(bytes(v,encoding="utf-8"))
        return m.hexdigest()

    def __setitem__(self, key, value):
        self.ppp.open()
        self.ppp.set(self.random_str,key,value)
        self.ppp.close()
    def __getitem__(self,key):
        self.ppp.open()
        v= self.ppp.get(self.random_str,key)
        self.ppp.close()
        return v
    def __delitem__(self, key):
        self.ppp.delete(self.random_str,key)
    def clear(self):
        self.ppp.open()
        self.ppp.clear(self.random_str)
        self.ppp.close()
class Foo(object):
    def initialize(self):
        #实例去调时,这里self是MainHandle对象
        self.session=Session(self)
        super(Foo,self).initialize()

class HomeHandle(Foo,tornado.web.RequestHandler):
    def get(self):
        user=self.session['uuuu']
        if not user:
            self.redirect("http://www.baidu.com")
        else:
            self.write("Hello,world,%s"%user)

class LoginHandle(Foo,tornado.web.RequestHandler):
    def get(self):
        self.session["uuuu"]="root"
        self.redirect('/home')


application=tornado.web.Application([
    (r"/login",LoginHandle),
    (r"/home",HomeHandle),
])

if __name__=="__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
自定义session三

 

标签:__,python,self,random,笔记,tornado,str,def
From: https://www.cnblogs.com/steven223-z/p/17884249.html

相关文章

  • Python 深拷贝和浅拷贝详解
    import logging 一、深拷贝和浅拷贝概念理解1、浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和......
  • 聪明办法学python-12.4——12.8笔记打卡
     python中Debug的方法  必要性:在于程序可能出现不符合预期结果的情况 困难:在于bug的出触发原因多种多样,只能看到最终结果 调试代码的基本思路:让bug在设计时更容易暴露出来,包括利用print和断言来解决简单问题,利用IDE进行调试 常见的错误:函数未定义会报错,需要检查函数......
  • Python的hashlib模块
    一、什么是摘要算法1、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)用于生成数据或文本的简短摘要或哈希值的算法。它们被广泛应用于密码学、数据完整性验证和信息检索等领域。摘要算法通过对输入数据进......
  • debug-聪明办法学Python
    如何Debug调试理论开始调试之前通过不断地调试,比如在循环中打印某个元素检查不得不承认机器永远只认编程语言不过你必须要时刻关注你的变量名称是否发生变更,这在大改前必须要注意的调试已知程序有bug,如何找到?调试困难的根本原因因为bug的触发经历了漫长的过程需求->设......
  • Python之的sys、os、subprocess、shutil 模块
    一、sys模块 sys模块是与python解释器交互的一个接口1、sys.argv() 在Python中,sys.argv是一个列表,它包含了命令行参数传递给Python脚本的参数值。sys.argv列表的第一个元素是脚本的名称,后面的元素是传递给脚本的参数。importsys#打印脚本名称print("脚本名称:",s......
  • python第五次学习笔记
    1.调试: 调试(debugging)是暂停正在运行的程序,并解决程序中出现的问题的过程。调试Python程序非常简单,Python调试器会设置条件断点,并一次执行一行代码。接下来我们将使用Python标准库中的pdb模块调试Python程序。2.调试技术: 我们可以使用多种方法调试Python程序,以下是调试......
  • Python的json序列化模块
    一、jsonJson模块提供了四个功能:dumps、dump、loads、load1、前景什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。序列化的目的以某种存储形式使自定义对象持久化;将对象从一个地方传递到另一个地方。使程序更具维护性在Python中,能够......
  • python的异步迭代器含义
    python的异步迭代器什么意思?什么是迭代器:迭代器是一种遵循迭代器协议的对象,可以被用在像for循环这样的迭代环境中。迭代器协议包含两个方法:__iter__():返回迭代器自身。__next__():返回迭代器的下一个元素。如果没有更多元素,则抛出StopIteration异常。就是这两个方法要包......
  • python-文件IO操作实例
    一、如何复制文件1、使用shutil模块来复制importshutil#导入shutil模块#定义源文件和目的文件的路径#图片src_path="E:/python/py/基础篇/01_基础/06_文件操作/图片.jpg"dst_path="D:/图片.jpg"#文本src1_path="E:/python/py/基础篇/01_基础/06_文件操作/......
  • 聪明办法学Python 选学02
    聪明办法学Python学习笔记调试Debug1.如何进行Python程序调试,包括调试理论和常用模块与库的使用调试的必要性在于程序可能出现不符合预期结果的情况调试的困难在于bug的触发原因多种多样,只能看到最终结果2.调试代码的基本思路和方法,包括利用print和断言来解决简单......