python get argument_Python-Web框架-get_argument方法
Python-Web框架-get_argument方法
目录概览
1.使用get_argument获取url query参数
2.为何get_argument不区分POST与GET?
3.get_argument返回unicode数据类型的问题
1.使用get_argument获取url query参数
Tornado的每个请求处理程序,我们叫做handler,handler里可以自定义自己的处理程序,其实也就是重写方法,如post,get,get_current_user,send_error等等,这里我们只讲get和post的自定义。
我们都知道,在Tornado里,获得用户的输入,都是一个get_argument搞定,似乎很顺理成章:
def post(self):
nowamagic = self.get_argument('nowamagic')
self.write( nowamagic )
import urlparse
urlparse.urlparse('http://www.nowamagic.net/academy/detail/13321002?page=1#comment')
ParseResult(scheme='http', netloc='www.nowamagic.net', path='/academy/detail/13321002', params='', query='page=1', fragment='comment')
url由scheme(协议),netloc(主机),path(路径),params(最后路径的参数),query(查询字段),fragment(锚)组成。
下面我们要获取URL里的GET参数,也就是获取url query中的参数,怎么办呢?
对于单一的值,在get和post中调用self.get_argument("name", "default")。
对于多选的值,调用self.get_arguments("name")即可。
get_argument方法可以设置默认值,也可以设置是否删除两端的空格。
源码声明如下:
get_argument(self, name, default=_ARG_DEFAULT, strip=True)
get_arguments(self, name, strip=True)
2.为何get_argument不区分POST与GET?
Tornado的get_argument有点类似PHP的 $ _REQUEST,是不区分GET与POST的。而且Tornado好像是没有PHP里的$ _GET,$ _POST这样的区分获取get数据与post数据的方法。为什么会这样么?
URL的query string还是x-www-form-encode的数据可以按key/value方式来解析,其实是一种约定俗成的规矩。甚至表单POST的编码格式都是和GET的query string编码是一样的。CGI的实现中也只用了一套代码来处理。就说两种方法实际上在做同一件事情。
而同时提供key/value的query string和x-www-form-encode的POST数据,也不违反任何协议和标准。
其次,通常当你要提交key/value数据的时候,目的是一致的。POST只不过允许你提交更多的数据而已。为什么要混用两套东西呢?
tornado做的,只不过是提供接口提高最常见场景的编码效率。如果应用场景比较特殊,可以自行解析request.body, request.url,获取原始的数据进行处理。
从安全角度来说,在Tornado中,一个RequestHandler中,处理GET和POST是两个不同的函数,这是一个很关键的因素。
对于某些Framework(比如Zend Framework),Model不区分GET和POST方法,换句话说,一个URL Patten不管是通过POST还是GET来访问,处理函数都是同一个,所以Zend的getParam方法就向程序员提供了数据来源的选择。而且这对于Zend Framework程序的安全也是至关重要。
对于GET请求,没什么好说的,因为GET请求的数据来源只有query string一条路,所以指定数据来源是没有意义的。
对于POST请求,XSRF攻击者的确可以将本来应该写在x-www-form-encode里的数据转移到query string里,但是这么做毫无意义。因为这样做会使请求变为get函数来处理。攻击自然会失败。
所以,Tornado的这种做法是有道理的,而不是简单的为了提高编码效率。毕竟,编码效率的提高也必须建立在保证安全的基础上。
3. get_argument返回unicode数据类型的问题
在 Tornado 里,self.get_argument返回的数据类型为unicode:
chars = self.get_argument('chars')
self.write( str(type(chars)) )
# 输出
#
get_argument在获取数据的时候,会进行decode("utf-8")操作,因为get_argument最终调用了tornado.escape下面的to_unicode方法,也就是argument会通过decode("utf-8")来转成unicode:
def to_unicode(value):
"""
Converts a string argument to a unicode string.
If the argument is already a unicode string or None, it is returned
unchanged. Otherwise it must be a byte string and is decoded as utf8.
"""
if isinstance(value, _TO_UNICODE_TYPES):
return value
assert isinstance(value, bytes)
return value.decode("utf-8")
# to_unicode was previously named _unicode not because it was private,
# but to avoid conflicts with the built-in unicode() function/type
_unicode = to_unicode
get_argument获取数据之后一般需要先使用u.encode('utf-8')转换成string类型后才能使用。
如果用get_argument无法获取数据,可以用更加原始的方法通过self.request.arguments获取GET或者POST的所有参数字典,这个字典是未经过decode处理的原生参数,每个参数都是字典里面的一项,主要每个参数对应的项都是一个列表。
python get argument_Python-Web框架-get_argument方法相关推荐
- 手撸web框架即引入框架思想,wsgierf模块,动静态网页,模板语法jinja2,python三大主流web框架,django安装,三板斧...
手撸web框架 web框架 什么是web框架? 暂时可理解为服务端. 软件开发架构 C/S架构 B/S架构 # 后端 import socketserver = socket.socket() # 不 ...
- python四大主流web框架
python四大主流web框架 转载自博客:https://www.cnblogs.com/an-wen/p/11330834.html --爱文飞翔 Python 四大主流 Web 编程框架 目前P ...
- Python之简易Web框架搭建
Python之简易Web框架搭建 Web框架介绍 WSGI协议 Web框架开发 项目结构 MyWebServer.py 之前的静态服务器代码 WSGI协议的要求 更新代码 framework.py 返 ...
- python协程框架_FastPy3.0 发布,高性能 python 协程web框架
FastPy3.0 发布了,FastPy是python领域一个高性能的web框架,底层封装gevent协程模型,使得python原生库操作mysql或者http时自动变成异步模式,使用上又具有djan ...
- asp.net web开发框架_用Python开发一个Web框架
一.Web框架 首先我们今天要做的事是开发一个Web框架.可能听到这你就会想.是不是很难啊?这东西自己能写出来? 如果你有这种疑惑的话,那就继续看下去吧.相信看完今天的内容你也能写出一个自己的Web框 ...
- Python超级明星WEB框架Flask
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- Python 最快Web框架
点上方"菜鸟学Python",选择"星标" 463篇原创干货,第一时间送达 作者:ConnorZhang 链接:https://juejin.cn/post/6 ...
- Python之路--WEB框架本质
一.本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf-8im ...
- Python开发自定义Web框架
文章目录 开发自定义Web框架 1.开发Web服务器主体程序 2.开发Web框架主体程序 3.使用模板来展示响应内容 4.开发框架的路由列表功能 5.采用装饰器的方式添加路由 6.电影列表页面的开发案 ...
最新文章
- 给定二叉树先序、中序遍历序列,求后序遍历
- docker 建mysql
- python学习之老男孩python全栈第九期_day004知识点总结
- python读取文档中有很多指标的数据 写成矩阵_图像处理与特征提取 —— 从 MATLAB 到 Python(一)图像、矩阵与数据的读写...
- 曾经风光无限的 JSP,为什么现在很少有人使用了?
- 哈工大计算机非全日制调剂,哈尔滨工业大学计算学部2021年非全日制专业学位硕士调剂...
- 帝国败局:一代首富,因何退隐江湖?
- 程序化交易是指所有利用计算机程序软件,程序化交易软件 电脑程式交易指买进、卖出股票(期货,外汇…)的讯号皆来于自电脑。 程式编写者将其投资理念以电脑语言表示,... - 雪球...
- 名帖311 成亲王 行书《杜甫秋兴诗》
- Monitor(管程)是什么意思?Java中Monitor(管程)的介绍
- 人工智能就业越来越严峻,你还在坚持吗
- python问题中国五城市pm2.5_数据之路- 中国五城市PM2.5数据解读
- Android开源项目分类汇总【畜生级别】[转]
- Mac电脑使用pip install出现语法错误
- 日常需要哪些账本记账
- 摄像头防水性能测试软件,手机摄像头防水测试/手机摄像头气密性检测方法分享...
- 揭秘用小程序裂变给公众号涨粉10w的7个案例
- 新浪微博如何自定义来源尾巴
- java 异步线程池_Java - 异步线程池
- 信任的纽带——XFS
热门文章
- pythonurllib微博登陆是什么_而不是使用urllib登录网站http.clien
- python3与Beautiful Soup库
- Python黑客入门:暴力破解zip,零基础也可以学会!
- Spring Boot 拦截器
- VTK:重新采样附加的 PolyData用法实战
- VTK:隐式布尔值用法实战
- VTK:3DArray用法实战
- boost::units模块实现带有转换的用户定义单位的测试程序
- boost::multiprecision模块gmp相关的测试程序
- boost::mpl模块实现lower_bound相关的测试程序