Flask学习笔记之HTTP(一)

先整理一下HTTP基础知识:

HTTP 方法:GET 对比 POST

HTTP 的工作方式是客户机与服务器之间的请求-应答协议。web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。

举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST:
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据。

一般来说,GET被认为是安全的,该操作用于获取信息而非修改信息,类似数据库查询,不会修改数据,不会影响资源的状态;而POST可以改变资源状态。


浅谈HTTP中Get与Post的区别

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。

  • 如果数据是英文字母/数字,原样发送,
  • 如果是空格,转换为+,
  • 如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

注:Python 3中encode参数的函数: parse.urlencode()

Python中以GET方式抓取数据:

from urllib import request, parse 

# Base URL being accessed
url = 'http://httpbin.org/get'

# Dictionary of query parameters (if any)
parms = {
       'name' : 'wang',
       'age' : '/'
}
    
# Encode the query string
querystring = parse.urlencode(parms)

# Make a GET request and read the response
u = request.urlopen(url+'?' + querystring)
resp = u.read()


POST把提交的数据则放置在是HTTP包的包体中。

Python中以POST方式抓取数据:

from urllib import request, parse 
...
u = request.urlopen(url, querystring.encode('ascii'))



除了urllib,也可以用request达到相同目的,而且更强大,比如加上请求头:

import requests
...
# Extra headers
headers = { 'User-agent' : 'none/ofyourbusiness', 'Spam' : 'Eggs'} 
resp = requests.post(url, data=parms, headers=headers)
 
# Decoded text returned by the request
text = resp.text



Extract请求头信息:

import requests
resp = requests.head('http://www.python.org/index.html')
status = resp.status_code 
last_modified = resp.headers['last-modified'] 
content_type = resp.headers['content-type'] 
content_length = resp.headers['content-length']



实现登录:

import requests
resp = requests.get('http://pypi.python.org/pypi?:action=login',
auth=('user','password'))



Pass cookies

import requests

# First request
resp1 = requests.get(url) 

# Second requests with cookies received on first requests
resp2 = requests.get(url, cookies=resp1.cookies)



用POST上传资源

import requests
url = 'http://httpbin.org/post'
files = { 'file': ('data.csv', open('data.csv', 'rb')) }
r = requests.post(url, files=files)

参考资料:《Python Cookbook》

你可能感兴趣的:(Flask学习笔记之HTTP(一))