Auth: 王海飞
Data:2019-02-17
Email:779598160@qq.com
github:https://github.com/coco369/knowledge
在Web应用开发中最为重要的是请求与响应,如何获取请求URL中传递的参数,以及如何响应都是十分重要的。
参数的传递,可以在动态路由的配置时,通过定义带参URL形式传递参数。除此之外,如果不在URL配置时传递参数,还可以通过get_argument()方法获取参数值。
请求URL地址为: http://location:8888/hello?name=xiaoming&age=18,则获取请求中的参数,采用以下语法格式:
1)get_argument(name, default, strip=True)
返回具有给定名称name的参数的值。参数说明: 如果参数name出现在URL中,则获取最后一个name参数对应的值。如果在URL中没有定义参数name,则返回default值。strip参数表示删除字符串两边的空格。
2)get_arguments(names, strip=True)
返回具有给定名称name的参数列表。strip参数表示删除字符串两边的空格。
获取GET请求传递的参数。
import tornado.ioloop
import tornado.web
from tornado.options import define, options, parse_command_line
# 定义默认的端口
define('port', default=8000, type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# 获取请求URL中传递的name参数
name = self.get_argument('name', '小明')
self.write("Hello, %s" % name)
def make_app():
return tornado.web.Application(handlers=[
(r"/hello", MainHandler),
])
if __name__ == "__main__":
parse_command_line()
app = make_app()
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()
定义get_argument()方法用以捕获请求URL中传递的参数,分析如下:
self.get_argument(‘name’, default)方法用于获取请求URL中传递的参数,如果获取不到URL中传递的name参数,则返回默认值。
如果访问地址为http://127.0.0.1:8000/hello,使用self.get_argument(‘name’, default)方法获取不到请求URL中的name参数,则返回default默认值。
如果访问地址为http://127.0.0.1:8000/hello?name=小王,则使用self.get_argument(‘name’, default)方法获取请求URL中的name参数,则返回值为‘小王’
注意: 使用get_argument()和get_arguments()方法获取的是提交GET请求时URL中传递的参数和POST请求提交参数的集合。
获取请求URL中传递的参数还有以下的语法:
get_query_argument(name): 和get_argument语法相似,但该方法仅只能从URL中获取传递的参数值。
get_query_arguments(name): 和get_arguments语法相似,也是只能仅从URL中获取传递的参数,返回的结果是列表。
get_body_argument(name): 和get_argument语法相似,但仅只能从POST请求中获取提交的参数。
get_body_arguments(name): 和get_arguments语法相似,也是只能从POST请求中获取提交的参数,返回的结果是列表。
总结: 开发中常用get_argument和get_arguments方法,因为它们是get_query_argument、get_query_arguments和get_body_argument、get_body_arguments的合集。
在Web开发中如何正确的响应输出给浏览器中。常用的响应输出的语法如下。
语法格式:
1) set_status(status_code,reason=None)
设置响应的状态码,如果有描述信息,则赋值给reason参数。
2) set_header(name, value)
设置给定的HTTP响应中Header名称和值,如果Header中已存在设置的名称,则覆盖Hearder的值。
3) write()
将给定的块写入到输出缓冲区中,并发送给客户端(浏览器)。如果写入的内容为字典,则数据将以JSON的格式发送给客户端,并同时将响应的Content-Type设置为application/json。
4) render(template_name, **kwargs)
用于渲染模板,template_name参数表示需要渲染的模板文件的名称。
5) redirect(url,permanent=False,status=None)
用于重定向,url参数表示重定向的URL地址。
6) add_header(name,value)
添加HTTP响应中的Header头参数
7) clear_header(name)
清空HTTP响应中Header中所有的信息
8) finish(chunk=None)
告知Tornado,Response响应已经完成,chunk参数表示传递给客户端的HTTP body。finish()方法适用于异步请求处理。
9) send_error(status_code=500)
将给定的HTTP错误代码发送给浏览器
10) wirte_error()
自定义错误页面
11)clear()
清楚写入Header和body的内容
12)flush()
将当前缓冲区数据刷新到网络
13)set_cookie(name,value)
以键值对的形式设置cookie值
14)clear_all_cookies(path=”/”,domain=None)
清空本次请求中所有cookie
15)cookies
获取所有的cookie内容
16)get_cookie(name,default)
返回具有给定名称的请求cookie的值,如果获取不到,则返回default参数
实现跳转。
import tornado.ioloop
import tornado.web
from tornado.options import define, options, parse_command_line
# 定义默认的端口
define('port', default=8000, type=int)
class HelloHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write("hello tornado")
self.write('<br/>')
self.write("实现从路由'/redirect/'跳转到本方法中")
class RedirectHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# 使用redirect方法,跳转到根路径"/"地址
self.redirect('/')
def make_app():
return tornado.web.Application(handlers=[
(r"/redirect/", RedirectHandler),
(r"/", HelloHandler),
])
if __name__ == "__main__":
parse_command_line()
app = make_app()
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()
当在浏览器中访问http://127.0.0.1:8000/redirect/地址时,实现分析如下:
路由匹配规则会自动匹配URL路由表,并调用处理器RedirectHandler中的HTTP行为方法get(),在该方法中进行跳转处理,使用redirect(url)方法进行跳转到url地址。在HelloHandler的get()方法中使用self.write()向缓存中写入数据,当函数结束后才将缓存中的数据渲染到页面中。