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

'''

4、接收前端的图片,并转成OpenCV格式

import os
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import dlib
import cv2
import numpy as np


#人脸检测
def facebyte_detect(face_byte):    
    detector = dlib.get_frontal_face_detector()
    gray = cv2.cvtColor(face_byte, cv2.COLOR_BGR2GRAY)
    face_rects = detector(face_byte, 1)

    # return len(face_rects)
 
    print('脸:',len(face_rects))
    if  not len(face_rects):
        print('空')

    for index, face in enumerate(face_rects):
        print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(),
                                                                     face.bottom()))
        # 在图片中标注人脸,并显示
        left = face.left()
        top = face.top()
        right = face.right()
        bottom = face.bottom()
        cv2.rectangle(face_byte, (left, top), (right, bottom), (0, 255, 0), 2)

    cv2.imwrite('../myimg/out/mei3.png',face_byte)
    return len(face_rects)






@app.route('/upload', methods=['POST'])
def upload():  
  

    try:
        if 'file' not in request.files:
            # return "No file part"
            return {'code': 400, 'msg': '没有file键值对,请上传文件'} 
        file = request.files['file']
        if file.filename == '':
            # return "No selected file"
            return {'code': 400, 'msg': '接收到的文件为空,请上传文件'} 
        
    except Exception as e:
            return {'code': 500, 'msg': '获取数据异常:'+str(e), }
    

    try:

        file = request.files['file']
        print('文件类型:',type(file))
        file_bytes = file.read()  #FileStorage类 临时内存文件数据流的读取
        print('file_bytes类型:',type(file_bytes))
        gimg=cv2.imdecode(np.array(bytearray(file_bytes), dtype='uint8'), cv2.IMREAD_UNCHANGED)
        print('gimg类型:',type(gimg))
        # cv2.imwrite('../myimg/dowm/test.png', gimg)

        if facebyte_detect(gimg):
            return {'code': 200, 'msg': '图片中有人脸'}  
        else:
            return {'code': 201, 'msg': '图片中没有人脸'}  
    
    except Exception as e:
            return {'code': 500, 'msg': '处理数据异常:'+str(e), }



if __name__ == '__main__':
    app.run(debug=True,port=5000)
### 智谱 AI 异步调用返回结果为空的原因分析及解决方法 智谱 AI 的异步调用接口设计中,返回的结果可能不包含直接的文本内容,而是提供一个任务标识符(如 `request_id`),用于后续查询任务完成状态实际结果。这种设计的主要原因是异步调用允许模型在后台处理复杂任务,而客户端无需长时间等待响应[^2]。 当用户通过异步接口发起请求后,服务器会立即返回一个包含 `request_id` 的响应,但此时并不包含完整的文本数据。这是因为模型仍在处理输入并生成结果。如果直接查看 `choices` 字段,可能会发现其内容为空或不完整,这属于正常现象[^2]。 为了正确获取文本数据,用户需要根据返回的 `request_id` 调用查询接口,以检查任务是否已完成以及获取最终的生成结果。查询接口的具体实现方式请参考智谱 AI 提供的开发文档[^2]。 以下是使用 Python 实现异步调用结果查询的一个示例代码: ```python import requests import json def query_async_result(request_id, api_key): url = "https://open.bigmodel.cn/api/paas/v4/async/chat/completions/result" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_key}" } payload = { "request_id": request_id } response = requests.post(url, headers=headers, data=json.dumps(payload)) if response.status_code == 200: result = response.json() if result.get("status") == "completed": return result["choices"][0]["message"]["content"] else: return "Task is not completed yet." else: return f"Error: {response.status_code}, {response.text}" # 示例调用 request_id = "8741747907789403382" # 替换为实际的 request_id api_key = "your_api_key_here" # 替换为实际的 API 密钥 text_result = query_async_result(request_id, api_key) print(text_result) ``` 上述代码展示了如何通过 `request_id` 查询异步任务的结果,并提取生成的文本内容[^2]。 ### 注意事项 - 如果查询接口返回的任务状态不是 `completed`,则需要定期重试查询,直到任务完成。 - 确保 API 密钥的安全性,避免泄露给未经授权的用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值