Flask request和requests
1、Flask request属性
这么多属性什么时候有值什么时候没值,其实完全取决于我们请求头content-type是什么,如果是以表单形式multipart/form-data、application/x-www-form-urlencoded 提交的数据,form或者files属性有值,如果是以application/json提交的数据,data、json就有值。而 args 是通过解析url中的查询参数得来的。
args
args属性是请求路径中的查询参数,例如:/hello?name=zs, args 解析出来的数据是一个类似字典的对象
form
form 顾名思义是表单数据,当请求头content-type 是 application/x-www-form-urlencoded 或者是 multipart/form-data 时,请求体的数据才会被解析为form属性。
application/x-www-form-urlencoded 是浏览器的form表单默认使用的content-type。例如
<form action="http://localhost:8000/demo" method="post">
<input type="text" name="username">
<input type="password" name="password">
<button>登录</button>
</form>
发送HTTP请求类似这样:
POST http://localhost:8000/demo HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
files
当浏览器上传文件时,form表单需要指定 enctype为 multipart/form-data
data
发送的请求体中,当content-type不是multipart/form-data、application/x-www-form-urlencoded 这两种类型时,data才会有值,例如我现在用postman指定的content-type是text/plain
json
如果我将content-type指定为application/json, flask就会将接收到的请求体数据做一次json编码转换,将字符串转换为字典对象,赋值给属性json
-
属性
0)request.values.
values 是 args 和 form 两个字段的组合
1) request.args
这个是用来获取具体内容的,使用字典方式获取。
例如前端给input标签设置了一个id值,就可以使用这个方法直接获取到id的内容。
(2)
request.form
这个是用来专门获取表单数据的。
例如前端的表单里填了用户名和密码,就可以使用这个方法获取内容。
(3)
request.method
这个是用来专门获取用户端的请求方法的,默认是GET请求。
例如前端设置了post请求方法和get请求方法,并且有表单需要提交,就得用这个方法来获取用户的请求方法是什么,然后再根据请求方法处理
(4)
request.referrer
这个是用来获取用户在请求之前所在的url。
例如用户在网站的一个页面中跳到了另一个页面,可能会需要知道他第一个页面的地址,或者是从别的网站跳转过来的,我们可能也想知道他是从哪个网站过来的。
(5)
request.user_agent
这个是用来获取用户是使用什么东西来请求的。
例如用户使用windos笔记本,谷歌浏览器来请求的,就可以用这个方法去获取。
(6)
request.files
这个是用来获取用户上传的文件的方法。
例如用户在前端上传了一个文件,我们可以直接调用save()
方法并传入保存路径来直接保存这个文件。
2、requests属性
-
获取响应内容
获取响应内容(关键词:text)
获取二进制响应内容(关键词:connect)
获取JOSN响应内容 -
获取原始响应内容(关键词:raw)
-
查看编码类型(关键词:encoding)
改变编码格式(关键词:encoding)
改变解码格式(关键词:decode) -
查看响应头(关键词:headers)
查看请求头,通过get方法取响应头的具体内容
属性 说明
r.status_code HTTP请求的返回状态
r.text HTTP响应内容的字符串形式,即:url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.raw 获取原始响应内容(关键词:raw)
原始RAW流,
如果你想获取服务器返回的原始数据流,你可以使用response.raw,它将返回一个HTTPResponse对象,你可以使用该对象的read()方法读取内容。
如果你确实要这么干,你应该在最初的请求中设置stream=True:
response = requests.get(‘https://www.baidu.com/’,stream=True)
response.raw.read(10)
raw.read()和json、text、content,用同一个对象,一个解析完下个没值
print('测json:', r.json()) # raw.read()和json、text、content,用同一个对象,一个解析完下个没值
# print('测raw:',r.raw.read())# raw.read()和json、text、content,用同一个对象,一个解析完下个没值
# 响应内容(str类型)
print('测text:', r.text)
# 响应内容(bytes类型)
print('测content:', r.content)
# 状态码
print('测statuscode:', r.status_code)
# 响应头
print('测headers:', r.headers)
# Cookies
print('测cookies:', r.cookies)
# URL
print('测url:', r.url)
# 请求历史
print('测history:', r.history)
参考链接:
https://blog.csdn.net/weixin_46165569/article/details/105877184
https://www.perfcode.com/p/requests-response.html
3、实现代码
一、客户端requests
import requests
# requests和request不一样,一个是请求,一个是接收的参数
def get1():
import requests
# url = 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13163750276'
url = 'http://127.0.0.1:5000/get?name=zhaojinmai&age=19'
r = requests.get(url=url)
print(type(r.raw),r.raw)
# print(type(r.json()),r.json())
# 响应内容(str类型)
print(type(r.text), r.text)
# 响应内容(bytes类型)
print(type(r.content), r.content)
# 状态码
print(type(r.status_code), r.status_code)
# 响应头
print(type(r.headers), r.headers)
# Cookies
print(type(r.cookies), r.cookies)
# URL
print(type(r.url), r.url)
# 请求历史
print(type(r.history), r.history)
def get2():
# url = 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm'
url = 'http://127.0.0.1:5000/get'
params = {'age': '13163750276','name':'zhaojinmai'}
r = requests.get(url=url, params=params)
print(r.text) # 打印接口请求返回的值
def post_data():
import requests
url = "http://127.0.0.1:5000/postdata"
# 表单数据格式,参数 data ,数据都是字典去保存
data = {"username": "liang001", "password": "123456"}
r_reg = requests.post(url=url, data=data)
print(r_reg.text)
def post_json():
import requests
import json
url = "http://127.0.0.1:5000/postjsion"
header = {'content-type': 'application/json'}
data = {"username": "liang001", "password": "123456","text":"this a text"}
r= requests.post(url=url, data=json.dumps(data),headers=header, stream=True)
# print(r_login.text)
# 字典转换为json串
# data = json.dumps(payload)
print('测json:', r.json()) # raw.read()和json、text、content,用同一个对象,一个解析完下个没值
# print('测raw:',r.raw.read())# raw.read()和json、text、content,用同一个对象,一个解析完下个没值
# 响应内容(str类型)
print('测text:', r.text)
# 响应内容(bytes类型)
print('测content:', r.content)
# 状态码
print('测statuscode:', r.status_code)
# 响应头
print('测headers:', r.headers)
# Cookies
print('测cookies:', r.cookies)
# URL
print('测url:', r.url)
# 请求历史
print('测history:', r.history)
def upload():
url = 'http://127.0.0.1:5000/upload'
data = {"username": "liang001", "password": "123456"}
#filename 为 liang.jpg 文件
#open('D:\\test_data\\liang.jpg','rb') 打开本地的一个文件
files = {'file':open('./jinmai.jpg','rb')}
r=requests.post(url=url,files=files,verify=False,data=data)
print (r.text)
def timeout():
url = "http://127.0.0.1:8000/login"
# 表单数据格式,参数 data ,数据都是字典去保存
data = {"username": "liang001", "password": "123456"}
r_login = requests.post(url=url, json=data, timeout=0.5)
print(r_login.text)
if __name__ == '__main__':
# get1()
# get2()
# timeout()
# post_data()
post_json()
# upload()
二、服务器端flask request
from flask import Flask
import time
import multiprocessing
from flask import Flask, request,render_template
import os
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
@app.route('/get', methods=['GET'])
def get():
data = request.args.to_dict() # {'name': 'gp', 'age': '11'}
print(data)
name = data.get('name')
age = data.get('age')
return 'ok yes'
@app.route('/postdata', methods=['GET', 'POST'])
def post_formdata():
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
data = request.values.to_dict() # {'username': '', 'password': '', 'submit': '提交', 'value': '3'}
print(data)
return '登录成功'
@app.route('/postjsion', methods=['POST'])
def post_jsion():
import json
data = request.json
print(data)
text = data.get('text')
return json.dumps(data)
# return data
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
elif request.method == 'POST':
file = request.files['file']
filename = secure_filename(file.filename)
print(os.path.join('static/upload', filename))
file.save(os.path.join('static', filename))
print('heard:',request.headers)
print('args:',request.args)
# print('json:',request.json)
print(request.values)
print(request.headers.get("content_type"))
print("values:", request.values)
print("files:", request.files)
print('form:', request.form)
print('data:', request.data)
# 获取数据并转化成字典
user_info = request.form.to_dict()
print(user_info)
return "上传成功"
if __name__ == '__main__':
app.run(debug=True,port=5000)
# 参考:
# https://www.jianshu.com/p/80950e5c773a
# https://www.jianshu.com/p/a555005db5b3
'''
request.values.
1) request.args
这个是用来获取具体内容的,使用字典方式获取。
例如前端给input标签设置了一个id值,就可以使用这个方法直接获取到id的内容。
(2)
request.form
这个是用来专门获取表单数据的。
例如前端的表单里填了用户名和密码,就可以使用这个方法获取内容。
(3)
request.method
这个是用来专门获取用户端的请求方法的,默认是GET请求。
例如前端设置了post请求方法和get请求方法,并且有表单需要提交,就得用这个方法来获取用户的请求方法是什么,然后再根据请求方法处理
(4)
request.referrer
这个是用来获取用户在请求之前所在的url。
例如用户在网站的一个页面中跳到了另一个页面,可能会需要知道他第一个页面的地址,或者是从别的网站跳转过来的,我们可能也想知道他是从哪个网站过来的。
(5)
request.user_agent
这个是用来获取用户是使用什么东西来请求的。
例如用户使用windos笔记本,谷歌浏览器来请求的,就可以用这个方法去获取。
(6)
request.files
这个是用来获取用户上传的文件的方法。
例如用户在前端上传了一个文件,我们可以直接调用save()
方法并传入保存路径来直接保存这个文件。
'''