tornado的路由映射
先前我们在构建路由映射列表的时候,使用的是二元元组,如
[(r"/", IndexHandler),]
在多个参数传入的时候
我们可以:
- 指定传入参数(字典形式)
- url的名字,用于反向解析
[
(r"/", Indexhandler),
(r"/cpp", SubjectHandler, {"subject":"c++"}),
url(r"/python", SubjectHandler, {"subject":"python"}, name="python_url")
]
对于路由中的字典,会传入到对应的RequestHandler的initialize()方法中:
from tornado.web import RequestHandler
class ItcastHandler(RequestHandler):
def initialize(self, subject):
self.subject = subject
def get(self):
self.write(self.subject)
思考:怎么传入?
对于路由中的name字段,注意此时不能再使用元组,而应使用tornado.web.url来构建。name是给该路由起一个名字,可以通过调用RequestHandler.reverse_url(name)来获取该名子对应的url。
完整示例:
# coding:utf-8
import tornado.ioloop
import tornado.web
import tornado.httpserver
from tornado.web import url
class IndexView(tornado.web.RequestHandler):
def get(self):
a_url = self.reverse_url("python_url")
self.write("""<a href="%s">123"""%a_url)
class SubjectView(tornado.web.RequestHandler):
def initialize(self, subject):
self.subject = subject
def get(self):
self.write(self.subject)
if __name__ == '__main__':
app = tornado.web.Application([
(r"/", IndexView),
(r"/cpp", SubjectView, {"subject":"c++"}),
url(r"/python", SubjectView, {"subject":"python"}, name="python_url"),
], debug=True)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
tornado.ioloop.IOLoop.current().start()
思考:变量名和 字符串匹配
思考:form-data www-form-urlencoded raw binary区别

print self.get_arguments("a")
[u'666', u'777', u'1', u'2']
print self.get_argument("a")
2
print self.get_query_argument("a")
777
print self.get_body_argument("a")
2
print self.get_query_arguments("a")
[u'666', u'777']
print self.get_body_arguments("a")
[u'1', u'2']
利用raw发送json原始数据
postman选择raw
发送 {"a":"1"} json数据类型, body中 类型是字符串格式的json数据。 json loads之后可以提取传递的数据。
class IndexView(tornado.web.RequestHandler):
def post(self):
print "body"
print type(self.request.body)
print "type"
print self.request.headers.get("Content-Type")
dic = json.loads(self.request.body)
print self.write(dic.get("a"))
正则参数匹配
class YKTest(RequestHandler):
def get(self, gnum):
self.write(str(gnum))
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application(
[(r"/", IndexHandler),
(r"/python", SubjectHandler, {"subject": "python"}),
(r"/cpp/",SubjectHandler,{"subject":"cpp"}),
(r"/test/(?P<gnum>[\d]+)",YKTest)
],
debug = True