Tornado-0三、Tornado的輸入和輸出

Tornado的輸入和輸出

一、輸入函數

在tornado文件夾下新建文件夾lesson2
在lesson2下新建start1.py寫入下列代碼html


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

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


class TestIndexHandler(tornado.web.RequestHandler):
    def get(self):
        abc = self.get_argument('abc', 'no')
        self.write('hello ' + abc)
        self.write('<br>')
        abc = self.get_arguments('abc')
        print("the type of abc is %s" % type(abc))
        print("the value of abc is %s" % abc)
        self.write(','.join(abc))


if __name__ == '__main__':
    tornado.options.parse_command_line()
    print(options.port)  # 打印端口到terminal
    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 函數獲取查詢字符串或者請求體中的信息python

查詢字符串:就是在瀏覽器的地址欄看到的url中「?」後面的字符串web

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

函數原型:(返回具備給定名稱的參數的值。返回的值編碼始終是unicodeubuntu

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

參數說明:segmentfault

  • 若是未提供default 值,則認爲該參數是必需的,若是缺乏該參數則拋出 MissingArgumentError異常。
  • 若是參數屢次出如今url中,咱們返回最後一個值。
  • strip = True,默認爲剪切字符串兩邊的空格

經過get_arguments 函數獲取查詢字符串或者請求體中的信息瀏覽器

函數原型:返回具備給定名稱的參數的值的列表。返回的值始終是unicode,若是參數不存在返回空列表安全

RequestHandler.get_arguments(name,*strip = True *)

除此以外,還有:服務器

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 )

在以前咱們都是使用url來獲取字符串,經過URI來獲取參數的時候有兩種風格網絡

#查詢字符串風格
http://127.0.0.1:8000/test?abc=weiwei
#符合REST風格的url
http://127.0.0.1:8000/user/weiwei/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))

瀏覽器顯示以下


圖片描述

圖片描述

二、輸出函數

函數原型:

RequestHandler.write(chunk)

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

要將輸出寫入網絡,請使用下面的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)# 轉成json
self.write(li)
print(repr(li),type(li))
li = json.loads(li) # 轉成python
print(repr(li),type(li))

函數原型:

RequestHandler.render(template_name,kwargs)

返回html頁面,頁面中能夠添加變量和函數。

#添加
(r'/html',HtmlHandler),

template_path='templates',

class HtmlHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('hello.html') #html 的文件名
#templates 必須在一個lesson下面,一個文件夾下面,它本身是從起服務這個地方開始找的

在lesson2下新建一個子文件夾並命名爲templates (千萬別寫成了 template 必須和template_path對應)
新建一個html文件命名爲hello
html頁面以下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    hello
</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)

圖片描述

圖片描述

三、附錄

本文章總代碼


文件結構

圖片描述

start1.py

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

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


class TestIndexHandler(tornado.web.RequestHandler):
    def get(self):
        abc = self.get_argument('abc', 'no')
        self.write('hello ' + abc)
        self.write('<br>')
        abc = self.get_arguments('abc')
        print("the type of abc is %s" % type(abc))
        print("the value of abc is %s" % abc)
        self.write(','.join(abc))


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)  # 獲得請求主機的IP
        self.write('-----name=%s --------age=%s-----%s------' % (name, age, self.request.remote_ip))


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

    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)


class MyHandler(tornado.web.RequestHandler):
    def get(self):
        print(self.request.remote_ip)


if __name__ == '__main__':
    tornado.options.parse_command_line()
    print(options.port)  # 打印端口到terminal
    app = tornado.web.Application(
        handlers=[
            (r'/test', TestIndexHandler),
            (r'/user/(.+)/([1-9]+)', UserHandler),
            (r'/bookname/(?P<name>.+)/(?P<age>[1-9]+)', BookNameHandler),
            (r'/html', HtmlHandler),
            (r'/request', MyHandler),
        ],
        template_path='templates',

    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

hello.py

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    hello
    <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>
</body>
</html>

注:本文章使用的是 pycharm+VMware+ubuntu
tornado文件夾對應ubuntu用戶文件夾下的tonado_1文件夾
關於pycharm鏈接ubuntu的相關問題 詳情請見https://segmentfault.com/a/11...

相關文章
相關標籤/搜索