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

  • Post author:
  • Post category:其他




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

'''



版权声明:本文为weixin_44986037原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。