Python 测开28期 - WL - 学习笔记 - 请求与响应

后端开发 - 请求与响应

请求方法

常用配置方法

请求 说明
GET 获取服务器资源
POST 新增服务器资源
PUT 更新服务器资源(客户端提供改变后的完整资源)
DELETE 删除服务器资源

接口设计

  • 查询:get
  • 新增:post
  • 修改:put
  • 删除:delete

get请求格式

# get 请求
@app.router("/testcase",methods=["get"])
def select_case():
    return {"code": 0,"msg":"get success"}
  • methods 是一个列表,可以添加多种请求方式,post,put等

post请求格式

# post 请求
@app.router("/testcase",methods=["post"])
def post_case():
    return {"code": 0, ",sg":"post seccess"} 

put请求格式

# put 请求
@app.router("/testcase",methods=["put"])
def put_case():
    return {"code": 0, "msg":"put seccess"}

delete请求格式

# delete 请求
@app.router("/testcase",methods=["delete"])
def delete_case():
    return {"code": 0, "msg":"delete seccess"}

处理请求数据

属性/方法 说明
args 记录请求中的查询参数
json 记录请求中的json数据
files 记录请求上传的文件
form 记录请求中的表单数据
method 记录请求使用的HTTP方法
url 记录请求的URL地址
host 记录请求的域名
headers 记录请求的头信息

get 请求参数

  • 场景:
    • 普通的url链接,接收一个get请求
  • 解决办法
    • request.args
    • 导入的是 Flask里的request,不是requests
  • 示例代码
from flask import Flask, request
app = Flask(__name__)
@app.router("/login",methods=["get"])
def login():
    result = request.args
    a = result.get("a")
    b = result.get("b")
    return {"code": 0, "msg":"get seccess"}
# 请求地址:http://****/login?a=1&b=2&c=3

json 请求

  • 场景:
    • POST 相关的请求,带有 json 数据格式
  • 解决办法
    • request.json
  • 示例代码
@app.router("/regist",methods=["post")
def post_regist():
    return {"code": 0, "msg":"post seccess"}
 # 请求时有json数据传入

表单请求

  • 场景:
    • 比如:测试人网站的登录接口,需要用户名和密码,前端会提交一个form表单给后台
  • 解决办法
    • request.form
  • 示例代码
# 比如注册接口,需要 用户名、密码、确定密码、邮箱等
@app.router("/regists",methods={"put"})
def put_regists():
    name = request.form.get("name")
    password = request.form.get("password")
    password_confirm = request.form.get("password_confirm")
    email = request
    .for,.get("email")
    logger.info(request.form)
logger.info(f"注册用户:name:{name},password:{password}, password_confirm:{password_confiorm},email:{email}")
    return {"code": 0, "msg":"put seccess"}

文件请求

  • 场景:
    • 页面上有个更新头像的功能,或者上传一个excel文件的功能,允许我们提交一个图片,或者文件到后端服务器
  • 解决办法
    • request.files.get(‘file’)获取文件对象
    • filename 获取文件对象的文件名
    • save()方法 保存文件到指定路径下
  • 示例代码
@app.router("/file/",methods=["file"])
def file_file():
    # 获取上传的文件对象
    fileobj = request.files.get("file")
    # 获取上传文件对象的文件名
    filename = fileobj.filename
    # 将上传文件重新保存到指定路径
    fileobj.save("./logo1.png")
  • file路径后边要有斜杠 “/xxxx/”
  • 测试用例
import requests

def test_file():
    url = "http://127.0.0.1:5000/file_file
    file = {'file': open("/users/juanxu/Downloads/logo.jpg","rb")}
    r = requests.post(url, files=file)
    assert r.status_code == 200
# 发送该文件请求此上传文件接口

处理响应信息

  • 常见类型:
    • 文本型
    • 元组
    • Json
    • html
    • 额外数据

文本类型处理

@app.router("/text")
def get_text():
    return "返回文本"

元组

  • 返回元组
    • (response,status)
    • (response,headers)
    • (response,status,headers)
  • 响应状态码默认为200
@app.router("/tuple")
def tuple_res():
    return "你好呀", 200, {"hogwarts":"ad"}

json

  • 直接返回 dict会转换为json
  • 使用jsonify()方法,通过参数传入键值对
# 返回json
@app.router("/json")
def get_json():
    # jsonify({"status": 0})
    return jsonify(status=1, name="ad", age=2)
 # 返回字典
 @app.router("/dict")
 def get_dict():
    return {"status": 0}

html

  • 使用模板渲染技术
  • html 文件必须在统计的templates目录下
from Flask import render_template
@app.router("/html")
def get_html():
    # 调用render_template方法,传入 html 文件的名称
    # 注意html 文件必须在 templates目录下
    return render_template('demo.html')

# <!--
# html 文件必须在templates目录下
# /application.py
# /templates
#       /hello.html
#       -->
# <html<>
#   <body>
#       <h1>霍格沃兹开发学社</h1>
#   </body>
# </html>

额外数据

  • 添加更多的响应信息
    • 设置 cookie
    • 设置响应头信息等
import flask.make_response
@app/router("/")
def index():
    resp = make_response(render_template('demo.html'))
    # 设置 cookie
    resp.set_cookie('username', 'the username')
    # 设置响应头信息
    resp.headers["hogwarts"]="ad2
    return resp

服务配置

监听的主机

  • 设置 host参数
    • 127.0.0.1 只能本机访问,默认值
    • 0.0.0.0 服务发布到局域网
app.run(host="0.0.0.0")

监听的端口

  • 设置 port 参数,默认值是5000
app.run(host="0.0.0.0", port=5000)

Debug 模式

  • 设置 debug=True(开发模式),默认值是 production(生产模式)
    • 实现热加载
    • 开发调试方便
app.run(host="0.0.0.0", port=5000, debug=True)