Flask request和requests(客户端服务器)

news2024/11/17 23:48:05

Flask request和requests

  • 1、Flask request属性
  • 2、requests属性
  • 3、实现代码

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

'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

辅助驾驶功能开发-功能规范篇(21)-3-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 七、全自动泊车(AutoParking) • 自动泊车辅助(AutoParking Assist)、斜列式车位泊车辅助(Diagonal AutoParking Assist) - 产品定义 基于超声波传感器和环视摄像头对空间和车位的识别,通过自动泊车系统实现全自动泊车入库。 - 功能说…

使用HHDESK图形化功能管理服务器

服务器的管理通常繁琐而枯燥&#xff0c;需要大量的命令行来执行。 所以图形化功能应运而生。 本篇以传输文件为例&#xff0c;简单介绍一下HHDESK的图形化管理功能。 首先需要配置好服务器。 点击连接管理&#xff0c;在连接类型中选择SSH&#xff0c;按照刚才在服务器中配…

方波信号轨迹跟踪(过冲与圆角)

在控制系统中&#xff0c;方波信号轨迹跟踪可能会面临过冲和圆角的问题。过冲是指跟踪信号超过期望值的现象&#xff0c;而圆角是指在方波信号变化时产生平滑的过渡。这些问题主要是因为传统的控制方法无法完美跟踪非线性的方波信号导致的。 过冲通常也称为超调。在方波信号的…

C++中的vector使用详解及重要部分底层实现

本篇文章会对vector的语法使用进行详解。同时&#xff0c;还会对重要难点部分的底层实现进行讲解。其中有vector的迭代器失效和深拷贝问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C中的动态数组容器vector 二、vector的常…

vue中实现div可编辑,并插入指定元素,样式

前言&#xff1a; vue中实现一个既可以编辑内容&#xff0c;有可以动态编辑内容插入一个带有样式的内容&#xff0c;改变默认内容后&#xff0c;这个样式消失的效果&#xff0c;这里来整理下调研与解决实现问题之路。 实现最终效果&#xff1a;图2为默认内容 1、可以光标点击任…

自定义MVC框架优化

目录 一、前言 二、优化问题 1.子控制器的初始化配置问题 2.页面跳转优化代码冗余问题 3.优化参数封装问题 三、进行优化 1.解决子控制器初始化配置 2.解决页面跳转的代码冗余问题 3.解决优化参数封装问题 4.中央控制器 一、前言 在自定义MVC框架原理中讲述了什么是…

Redis - Redis GEO实现经纬度测算距离,附近搜索范围

Redis GEO 主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作&#xff0c;该功能在 Redis 3.2 版本新增 一、Redis GEO 操作方法 geoadd&#xff1a;添加地理位置的坐标 geopos&#xff1a;获取地理位置的坐标 geodist&#xff1a;计算两个位置之间的距离 geor…

client-go初级篇,从操作kubernetes到编写单元测试

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 尽管长篇系列《client-go实战》的内容足够丰富&#xff0c;然而内容太多每个知识点也有一定深度&#xff0c;对于打算快速学习并开始kubernetes开发…

分层架构简介

MVC是架构模式&#xff08;设计模式中的结构性模式&#xff09;&#xff0c;不是系统架构&#xff0c;更不是我们常说的三层架构 MVC的缺陷如下&#xff1a; 1.导致控制器冗余&#xff08;有大量的业务逻辑&#xff0c;可能开始没有&#xff0c;但是后来越来越多&#xff09;…

QT学习笔记5--槽函数重载解决办法

connect函数 connect(sender, signal, receiver, slot); 槽函数示例 void student:: treat(QString foodname) void student:: treat(int index) 由上可见&#xff0c;有两个名字相同&#xff0c;但形参不同的槽函数。 可以通过函数指针的方式 &#xff0c;用指针指向具体…

linux环境安装mysql8.0.32

linux环境安装mysql8.0.32 一、下载安装包二、安装前准备2.1 卸载旧版本mysql2.2 检查是否安装了 mariadb 数据库2.3 安装依赖包创建 mysql 用户 三、安装3.1 上传并解压安装包&#xff08;上传路径没有要求&#xff0c;一般在/usr/local&#xff09;3.2 初始化数据库3.3 注册数…

Java面试题6月

redis有哪些缓存淘汰策略 https://blog.51cto.com/u_11720620/5198874 生产环境内存溢出&#xff08;OOM&#xff09;问题处理方案 https://note.youdao.com/ynoteshare/index.html?id5cc182642eb02bc64197788c7722baae&typenote&_time1688287588653 jstack找出占用…

C++之GNU C的__attribute__((constructor))和((destructor))静态构造函数实现(一百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Elasticsearch实战(二十三)---ES数据建模与Mysql对比 一对多模型

Elasticsearch实战—ES数据建模与Mysql对比实现 一对多模型 文章目录 Elasticsearch实战---ES数据建模与Mysql对比实现 一对多模型1.一对多 模型1.1 Mysql建模 2.一对多 Index ES 数据模型2.1 类似Mysql, 依旧创建两个Index索引库2.2 采用ES架构 嵌套数组模型2.3采用ES架构 冗余…

【JUC-2】Synchronized关键字相关知识

Synchronized synchronized是Java中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 修饰一个代码块&#xff0c;被修饰的代码块称为同步语句块&#xff0c;其作用的范围是大括号{}括起来的代码&#xff0c;作用的对象是调用这个代码块的对象&#xf…

【C++2】进程 信号 dbus

文章目录 1.进程&#xff1a;fork()&#xff0c;ps -ef (同-aux) | more2.信号&#xff1a;signal&#xff08;, EXIT&#xff09;&#xff0c;jps2.1 捕捉信号&#xff1a;ctrlc&#xff1a;22.2 捕捉信号&#xff1a;kill -9&#xff1a;92.3 捕捉信号&#xff1a;kill&#…

欧几里得算法

0x00 前言 改补的内容是一点都不会少。本章来看欧几里得算法 0x01 概述 欧几里得算法又称为辗转相除法&#xff0c;指用于计算两个非负整数a和b的最大公约数。 两个整数的最大公约数是能够同时整除他们的最大的正整数。 基本原理&#xff1a;两个整数的最大公约数等于其中…

【动态规划】子数组系列(上)

子数组问题 文章目录 【动态规划】子数组系列&#xff08;上&#xff09;1. 最大子数组和1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态转移方程1.2.3 初始化1.2.4 填表顺序1.2.5 返回值 1.3 代码实现 2. 环形子数组的最大和2.1 题目解析2.2 算法原理2.2.1 状态表示2.2.2 …

C++2(表达式和关系运算)

目录 1.表达式基础 1.表达式基础 运算符重载&#xff0c;就是自己定义 - * / 之类的运算符怎么运算 C中的左值和右值 C语言左值在左侧&#xff0c;右值在右侧 在cpp中要复杂的多 能取到地址的表达式是左值 不能取到地址的表达式是右值 常量对象为代表的左值不能作为赋值语句的左…

【Linux】网络相关概念概述以及原理简单分析介绍

文章目录 [toc] Linux 网络概述网络发展独立模式网络互联局域网LAN 和 广域网WAN 认识 "协议"协议的分层网络协议栈OSI七层模型TCP/IP五层(四层)模型TCP/IP网络协议栈 与 操作系统 的关系 **重新以计算机的视角看待 网络协议栈 局域网内部通信原理简单介绍不同局域网…