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方法相关推荐

  1. 手撸web框架即引入框架思想,wsgierf模块,动静态网页,模板语法jinja2,python三大主流web框架,django安装,三板斧...

    手撸web框架 web框架 什么是web框架? 暂时可理解为服务端. 软件开发架构 C/S架构 B/S架构 # 后端 import socketserver = socket.socket() # 不 ...

  2. python四大主流web框架

    python四大主流web框架 转载自博客:https://www.cnblogs.com/an-wen/p/11330834.html --爱文飞翔 Python 四大主流 Web 编程框架 目前P ...

  3. Python之简易Web框架搭建

    Python之简易Web框架搭建 Web框架介绍 WSGI协议 Web框架开发 项目结构 MyWebServer.py 之前的静态服务器代码 WSGI协议的要求 更新代码 framework.py 返 ...

  4. python协程框架_FastPy3.0 发布,高性能 python 协程web框架

    FastPy3.0 发布了,FastPy是python领域一个高性能的web框架,底层封装gevent协程模型,使得python原生库操作mysql或者http时自动变成异步模式,使用上又具有djan ...

  5. asp.net web开发框架_用Python开发一个Web框架

    一.Web框架 首先我们今天要做的事是开发一个Web框架.可能听到这你就会想.是不是很难啊?这东西自己能写出来? 如果你有这种疑惑的话,那就继续看下去吧.相信看完今天的内容你也能写出一个自己的Web框 ...

  6. Python超级明星WEB框架Flask

    Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...

  7. Python 最快Web框架

    点上方"菜鸟学Python",选择"星标" 463篇原创干货,第一时间送达 作者:ConnorZhang 链接:https://juejin.cn/post/6 ...

  8. Python之路--WEB框架本质

    一.本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf-8im ...

  9. Python开发自定义Web框架

    文章目录 开发自定义Web框架 1.开发Web服务器主体程序 2.开发Web框架主体程序 3.使用模板来展示响应内容 4.开发框架的路由列表功能 5.采用装饰器的方式添加路由 6.电影列表页面的开发案 ...

最新文章

  1. 给定二叉树先序、中序遍历序列,求后序遍历
  2. docker 建mysql
  3. python学习之老男孩python全栈第九期_day004知识点总结
  4. python读取文档中有很多指标的数据 写成矩阵_图像处理与特征提取 —— 从 MATLAB 到 Python(一)图像、矩阵与数据的读写...
  5. 曾经风光无限的 JSP,为什么现在很少有人使用了?
  6. 哈工大计算机非全日制调剂,哈尔滨工业大学计算学部2021年非全日制专业学位硕士调剂...
  7. 帝国败局:一代首富,因何退隐江湖?
  8. 程序化交易是指所有利用计算机程序软件,程序化交易软件 电脑程式交易指买进、卖出股票(期货,外汇…)的讯号皆来于自电脑。 程式编写者将其投资理念以电脑语言表示,... - 雪球...
  9. 名帖311 成亲王 行书《杜甫秋兴诗》
  10. Monitor(管程)是什么意思?Java中Monitor(管程)的介绍
  11. 人工智能就业越来越严峻,你还在坚持吗
  12. python问题中国五城市pm2.5_数据之路- 中国五城市PM2.5数据解读
  13. Android开源项目分类汇总【畜生级别】[转]
  14. Mac电脑使用pip install出现语法错误
  15. 日常需要哪些账本记账
  16. 摄像头防水性能测试软件,手机摄像头防水测试/手机摄像头气密性检测方法分享...
  17. 揭秘用小程序裂变给公众号涨粉10w的7个案例
  18. 新浪微博如何自定义来源尾巴
  19. java 异步线程池_Java - 异步线程池
  20. 信任的纽带——XFS

热门文章

  1. pythonurllib微博登陆是什么_而不是使用urllib登录网站http.clien
  2. python3与Beautiful Soup库
  3. Python黑客入门:暴力破解zip,零基础也可以学会!
  4. Spring Boot 拦截器
  5. VTK:重新采样附加的 PolyData用法实战
  6. VTK:隐式布尔值用法实战
  7. VTK:3DArray用法实战
  8. boost::units模块实现带有转换的用户定义单位的测试程序
  9. boost::multiprecision模块gmp相关的测试程序
  10. boost::mpl模块实现lower_bound相关的测试程序