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()
方法并传入保存路径来直接保存这个文件。

'''

猜你喜欢

转载自blog.csdn.net/weixin_44986037/article/details/131407583
今日推荐