Python 的一个 library "Requests" 是怎样发挥作用的?

2011-10-19 22:00:47 +08:00
 jiyinyiyong
http://docs.python-requests.org/en/latest/index.html
初学 python 和 flask, 对 http 协议方面了解不是很多,
GET/POST 不是从浏览器发出向服务器请求的吗, Python 用来完成什么?
新手, :) 求各位指点,,
4972 次点击
所在节点    Python
14 条回复
binux
2011-10-19 22:19:49 +08:00
完成浏览器所完成的工作,比如在python中获取百度首页的内容。
jiyinyiyong
2011-10-19 22:45:31 +08:00
获取页面内容..我在网上看到博客讲, 所以开始关心这个框架的:
http://gun.io/blog/python-for-the-web/
搞不清楚整块, 这个是小部分吧.
keakon
2011-10-19 23:22:12 +08:00
@jiyinyiyong 用来解析请求和生成响应的…

比如你访问 http://xxx.com/abc?x=123,你得知道协议是http,域名是xxx.com,路径是/abc,请求字符串是x=123,方法是GET,可能带了哪些cookie等。
这些解析完后要传给你的脚本,你的脚本按照逻辑处理这个请求,并输出响应。
est
2011-10-20 01:16:50 +08:00
Requests只是一个改良的接口而已。接口的实现还是靠下面一层。
Weakdancer
2011-10-20 03:54:51 +08:00
比如 你键入 http://baidu.com/?s=something

> GET/POST 不是从浏览器发出向服务器请求的吗

本质是和服务器建立TCP连接。
然后发送文本:

GET /?s=something HTTP 1.1
Host : baidu.com
User agent :“你的浏览器版本信息”
有cookie的话再会有个
Cookie :“xxx”

除此之外就什么都没有了
这一切是透明的,没有什么其他的额外操作,它就是这样工作的,发送的只是普通的数据,而不是一个什么专用的东西。


框架就得到这些数据

然后帮你解析

而且,开发过程中服务器端除了python程序之外并没有什么其他程序在干什么事,就是一个独立的python程序而已。
Weakdancer
2011-10-20 04:00:27 +08:00
https://github.com/kennethreitz/requests/blob/master/requests/api.py#L96

这是源码,这么一堆复杂的东西,就是为了把那几行对计算机友好的数据转换成让人类方便获取的一些方法的。

Requests: HTTP for **Humans**
Weakdancer
2011-10-20 04:09:23 +08:00
看到 @keakon 的解释后,我竟然没有仔细读代码。

非常不好意思。

我和@keakon 都把这个 request 理解成 常见的请求(名词)了

实际上是个动词

在这里request是个包名

https://github.com/kennethreitz/requests/tree/master/requests

request.get 就是里边的 get.py

具体参见

http://docs.python.org/tutorial/modules.html
Ctrl - F package
是一种代码管理方式

request 只是起了一个名字的作用
jiyinyiyong
2011-10-20 10:54:59 +08:00
@Weakdancer , 感谢回答, 好像我没问到重点.
我看了那片博客上介绍 request.get() 的用法例子, 才疑问的,
因为之前我理解是浏览器用 js 发起 get/post 请求的,
差不多我理解只有下面 ajax 的内容吧,
http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_send.asp
但是 Python 是在服务器上执行的呀, 服务器上再用 get 是做什么?
keakon
2011-10-20 12:05:46 +08:00
@jiyinyiyong 囧,你看看描述吧,相当于urllib2的作用
>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
reorx
2011-10-20 12:21:24 +08:00
@jiyinyiyong 发出GET请求的服务器,相对于请求接受方,比如"www.baidu.com",就是客户端了。

按照你的思路,把它当成没有界面的浏览器吧。这其实就是反向代理的基本工作原理————服务器作为中转,发出请求,获取返回,再发送给最下级客户端。
Weakdancer
2011-10-20 13:07:56 +08:00
这个模块用了一个容易引起歧义的名字而已,它不是常见的request的GET获取,而是对urllib的封装,是客户端
Weakdancer
2011-10-20 13:09:34 +08:00
这个不是服务器的代码。

python不是只可以做服务器。
Weakdancer
2011-10-20 13:11:08 +08:00
另外,它并不是标准库,你完全可以做个叫printA 的模块,用来输出B的
jiyinyiyong
2011-10-20 13:26:12 +08:00
原来也是做客户端啊, 大概理解了.
那在服务器上怎么做来对付 GET 请求呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/19856

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX