当前位置: 首页 > 工具软件 > Jo Web Server > 使用案例 >

Tornado提升之tornado.web.RequestHandler

卫高谊
2023-12-01

tornado提升_

整理基础工程

  • 将原先的server包装集划分成以下几个文件
    • views包

       用来存放视图函数
      
    • applation.py

        用来存放路由和配置
      
    • config.py

        用来设置配置信息
      
    • static目录

        静态文件
      
    • templates目录

        存放模板文件
      
    • server.py

        服务器
      

Aplication

  • settings
    • debug/autoreload

       设置tornado是否是在工作模式下,默认时False,即工作在生产模式下。
       = True的4个特性:
                1.自动重启,tornado会监控源代码文件,当有保存改动,便会重新启动服务器,这样可以减少
           手动重启的次数从而提高开发效率
           注意:如果保存后代码有错误会导致重启失败,修改错误后就不会自动重启了
                    autoreload = True 
                2.取消缓存编译的模板
                    compiled_template_cache = False
                3取消缓存静态文件的hash值
                    static_hash_cache = False
                4提供追踪信息
                    serve_traceback = True
                5关闭当前项目的的自动转义(一般不用)
                    "autoescape":None,
                6 配置安全cookie密钥
                "cookie_secret":"tfA8keUBRy2y+HdXA91DSSDVq3v3EUp6gbsGqeHUHTA=",
                7 开启XSRF保护
                "xsrf_cookies":True
                8 不符合验证用户的逻辑,请求会将访客重定向到配置中的login_url所指定的路由
                "login_url":"/login"
      
    • static_path

        设置静态文件目录
      
    • template_path

        设置模板文件目录
      
  • 路由
    • (r’/’,index.IndexHandler) 无参数

       正常书写http 的 GET,POST等一些方法
      
    • (r’/luciano’,index.LucianoHandler,{“word1”:“good”,“word2”:“nice”}), 有参数

       需要重写initialize()方法接受传递的参数
      
    • tornado.web.url(r’/yaoge’,index.yaogeHandler,{“word3”:“good”,“word4”:“nice”},name=“fanxiangdaili”) 有参数+反向解析

        tornado.web.url()如果使用name属性来写带反向解析的路由,不能直接使用元组写
      
        self.reverse_url("fanxiangdaili") 会获取到name为“fanxiangdaili”的路由的正则匹配
      

tornado.web.RequestHandler

  • 利用HTTP协议向服务器传递参数

    • 提取uri的特定部分

        http://127.0.0.1:9000/liuyifei/is/a/woman   
        
        url:(r'/liuyifei/(\w+)/(\w+)/(\w+)',index.liuyifeiHandler),
        
        handler:class liuyifeiHandler(RequestHandler):
                # 接受路由的正则表达式的"组"
                    def get(self,h1,h2,h3,*args,**kwargs):
                        print(h1+"-"+h2+"-"+h3)
                        self.write("刘亦菲")
        ----------------------------------------------------
        url:(r'/liuyifei/(?P<h1>\w+)/(?P<h2>\w+)/(?P<h3>\w+)', index.liuyifeiHandler),
        
        handler:class liuyifeiHandler(RequestHandler):
                # 接受路由的正则表达式的"组"
                    def get(self,h3,h1,h2,*args,**kwargs):
                        print(h1+"-"+h2+"-"+h3)
                        self.write("刘亦菲")
      
    • 查询字符串(get方式传递参数)

        http://127.0.0.1:9000/zhangmanyu?a=1&b=2&c=3
        
        
        get_query_argumenr()方法:
        self.get_query_argument(name,default=ARG_DEFAULT,strip=True)
        参数说明:
        name:从get请求参数字符串中返回指定参数的值
            注意:如果出现多个同名参数,返回的是最后一个值
        default:如果设置了未传的name参数时会返回default的默认的值,
            如果default也没有设置,那么会抛出警告"tornado.web.MissingArgumentError"
        strip:表示是否过滤掉两边的空白字符,默认True
        ------------------------------------------
        实例:
        application:
        (r'/zhangmanyu',index.zhangmanyu),
        
        handler:
        class zhangmanyu(RequestHandler):
        def get(self,*args,**kwargs):
            a = self.get_query_argument("a")
            b = self.get_query_argument("b")
            c = self.get_query_argument("c")
            print(a,b,c)
            self.write("张曼玉")
        ----------------------------------------------
        http://127.0.0.1:9000/zhangmanyu?a=1&a=2&b=2&c=3
        
        get_query_argumenrs()方法:
        self.get_query_arguments(name,strip=True)
        class zhangmanyu(RequestHandler):
      
            def get(self,*args,**kwargs):
                alist = self.get_query_arguments("a")
                b = self.get_query_argument("b")
                c = self.get_query_argument("c")
                print(alist[0],alist[1],b,c)
                self.write("张曼玉")
      
    • 请求体携带数据(post方式传递参数)

        self.get_body_argument(name,default=ARG_DEFAULT,strip=True)
        self.get_body_arguments(name,strip=True)    
        -------------------------------------------------
        实例:
        class postfile(RequestHandler):
        # get用来展示页面
        def get(self, *args, **kwargs):
            self.render('postfile.html')
      
        # post用来接受Post请求传递过来的数据
        def post(self, *args, **kwargs):
            username = self.get_body_argument("username")
            password = self.get_body_argument("password")
            hobbylist = self.get_body_arguments("hobby")
            print(username,password,hobbylist)
            self.write("dsd")
      
    • 既可以获取get请求,也可以获取post请求(一般不用)

       self.get_argument(name,default=ARG_DEFAULT,strip=True)
       self.get_arguments(name,strip=True)
      
    • 在http报文头中增加自定义字段

        sad 
      
  • request对象

    • 作用:存储了关于请求的相关信息
    • 属性:
      • method : HTTP请求的方式

      • host : 被请求的主机名

      • uri : 请求的完整资源地址,它包括路径和get查询参数部分

      • path : 请求的路径部分

      • query : 请求参数部分

      • version : 使用的http版本

      • headers : 请求的协议头,是一个字典类型

      • body : 请求体数据

      • remote_ip : 客户端的ip地址

      • files : 用户上传的文件,是一个字典类型

          实例:
              def get(self,*args,**kwargs):
                  print(self.request.method)
        
  • tornado.httputil.HTTPFile对象

    • 作用:它是接受到的文件对象
    • 属性:
      • filename :文件实际名字

      • body : 文件的数据实体

      • content_type : 文件的类型

        文件对象的格式:
        {
        ‘file’:[
        {
        ‘filename’:‘a.txt’,
        ‘body’:'lucinao is goodman ',
        ‘content_type’:‘text/plain’

              },{}
          ],
          'img':[
              {
              'filename':'a.png',
              'body':'afwaeeij8998sdf32jo... ',
              'content_type':'image/png'
            
              },{},{}...
          ]
          }
        

        代码部分:
        import config
        import os
        class upfileHandler(RequestHandler):
        def get(self,*args,**kwargs):
        self.render(‘upfile.html’)

          def post(self,*args,**kwargs):
              filesDict = self.request.files
              # 遍历 文件所有对象集合的key
              for inputname in filesDict:
                  # 获取字典对象中的 valus 即 一个列表
                  fileArr = filesDict[inputname]
                   # 获取文件对象
                  for fileobj in fileArr:
                      # 指定存储路径
                      filePath = os.path.join(config.BASE_DIRS,'upfile/'+fileobj.filename)
                      # 保存到服务器的upfile文件上
                      with open(filePath,'wb') as f:
                          f.write(fileobj.body)
        
              self.write("上传成功")
        
 类似资料: