Tornado的輸入和輸出


1.輸入函數

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options

define('port',default=8000,help='run port',type=int)

class TestIndexHandler(tornado.web.RequestHandler):
    def get(self):
        name= self.get_argument('name','no')
        # self.write('hello '+name)
        abc = self.get_arguments('name')
        self.write(','.join(name))
        print(name)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    # print(options.port)
    # print(options.version)
    app = tornado.web.Application(
        handlers=[
            (r'/test',TestIndexHandler),
        ]
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
[`get_argument` ](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.get_argument)

函數獲取查詢字符串或者請求體中的信息

​ 查詢字符串:就是在瀏覽器的地址欄看到的url中“?”后面的字符串

​ 請求體:在POST請求中的body數據,比如表單數據form data、json數據、xml數據

函數原型:(返回具有給定名稱的參數的值。返回的值始終是unicode)

RequestHandler.get_argument(*name*,*default = *,*strip = True *)

參數說明:
- 如果未提供default 值,則認為該參數是必需的,如果缺少該參數則拋出 MissingArgumentError異常。
- 如果參數多次出現在url中,我們返回最后一個值。
- strip = True,默認為剪切字符串兩邊的空格

通過[`get_arguments` ](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.get_arguments)函數獲取查詢字符串或者請求體中的信息

函數原型:返回具有給定名稱的參數的值的列表。返回的值始終是unicode,如果參數不存在返回空列表

此外還有:

RequestHandler.get_query_argument(name,default = <object object>,strip = True )
RequestHandler.get_query_arguments(name,strip = True )
RequestHandler.get_body_argument(name,default = <object object>,strip = True )
RequestHandler.get_body_arguments(name,strip = True )

#查詢字符串風格

http://127.0.0.1:8000/test?name=jingqi

#符合REST風格的url

http://127.0.0.1:8000/user/不懂/18

當時使用REST風格的寫法時,路由映射的寫法:

(r'/user/(.+)/([1-9]+)',UserHandler), #通過url名稱不固定的傳參
(r'/bookname/(?P<name>.+)/(?P<age>[1-9]+)', BookNameHandler),#通過url傳固定名稱的參數,名字固定為name age

Handler的寫法

class UserHandler(tornado.web.RequestHandler):
    def get(self,name,age):
        self.write('---name=%s---age=%s'%(name,age))

class BookNameHandler(tornado.web.RequestHandler):
    def get(self, name, age):
        '''通過url傳入參數名是固定的'''
        print(self.request.remote_ip)
        self.write('-----name=%s --------age=%s-----%s------'%(name, age, self.request.remote_ip))     #self.request.remote_ip 得到請求主機的IP

 2.輸出函數

函數原型:

[`RequestHandler.write(*chunk*)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.write)

- 將給定的塊寫入輸出緩沖區。

- 要將輸出寫入網絡,請使用下面的flush()方法

- 如果給定的塊是字典,我們將其寫為JSON,並將響應的Content-Type設置為application/json。(如果要發送JSON作為其他的Content-Type,調用write()后調用set_header )。

- 請注意,由於潛在的跨站點安全漏洞,列表不會轉換為JSON。所有JSON輸出都應該包裝在字典中。

(r'/write',WriteHandler),

  class WriteHandler(tornado.web.RequestHandler):
      def get(self):
          user = {
              'name':'budong',
              'age':18,
          }
          self.write(user)  #wirte 回去的就是字符串
          
          li = [1,2,3,4]
          import json
          li = json.dumps(li)
          self.write(li)
          print(repr(li),type(li))
          li = json.loads(li)
          print(repr(li),type(li))  

函數原型:

[`RequestHandler.render(*template_name*,**\* kwargs *)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.render)

返回html頁面,頁面中可以添加變量和函數。

r'/html',HtmlHandler),
template_path='templates',

class HtmlHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')  #html 的文件名

#templates 必須在一個lesson下面,一個文件夾下面,它自己是從起服務這個地方開始找的

html頁面如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
hello budong
</body>
</html>

上面這些就是tornado的輸入和輸出,從前台獲取數據,就是輸入,后台把數據返回給前台,就是輸出。

接下來我們看看如果是post請求,改怎么得到信息:

首先在之前的html中添加下面內容:

<form method="post" action="/html">
    <p>用戶名<br><input type="text" name="name"></p>
    <p>密碼<br><input type="text" name="password"></p>
    <input type="submit">
</form>

在HtmlHandler中添加如下代碼

def post(self):
    name = self.get_argument('name','no')
    passwd = self.get_argument('password','no')
    st = '---name=%s---password=%s---'%(name,passwd)
    self.write(st)

get和post的區別是:get就是獲取服務器數據的意思,post是類似於提交數據,往服務器提交數據。

接下來我們看看,我們可以從前台的請求中獲取些什么信息:

(r'/request',MyHandler),
class MyHandler(tornado.web.RequestHandler):
    def get(self):
        print(self.request.remote_ip)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM