请求、响应对象

请求处理-request对象

在视图函数中,flask并不需要使用一个参数来接收请求对象,这点和django的 视图函数是不一样的。

flask如果要使用请求对象,直接导入从from flask import request变量就可以了

request是一个LocalPorxy实例,每个请求、不同的视图函数都是相互隔离的。

与django的对比

flask视图函数使用请求对象:

from flask import Flask, request

@app.route("/userinfo")
def user_info():
  print(request)
  return "user-info"

django视图函数使用请求对象:

# django使用request对象,需要在视图函数中第一个参数接收request
def user_info(request: HttpRequest):
  print(request)
  return HttpResponse("user-info")

# 绑定路由
urlpattern = [
  path("userinfo/", user_info)
]

请求对象的基本属性获取

from flask import Flask, request

@app.route("/userinfo")
def user_info():
  # 请求的url地址
  print(request.url) # http://127.0.0.1:5000/demo1

  # 请求的ip地址
  print(request.remote_addr)

  # 获取请求头
  print(request.headers)  # headers是字典

  # 获取请求方式
  print(request.method)

  return "user-info"

请求参数获取

get请求:request.args

post请求:

  • 表单:request.form
  • 文件:request.files
  • json:request.json
@app.route('/demo2', methods=["post", "get"])
def demo2():

    # 获取GET请求的请求参数(查询字符串) ,request.args
    print(f"{request.args=}")   # django是request.GET    DRF是request.query_param

    # 获取表单数据, request.form
    print(f"{request.form=}")   # django是request.POST   DRF是request.data

    # 获取json, request.json
    if request.is_json:
        print(f"{request.json=}")   # django是request.body然后需要json.loads   DRF是request.data

    # 获取文件类型
    print(f"{request.files=}")  # django是request.FILES    DRF也是request.FILES(应该没记错..)
    
    user_upload_img = request.files.get("img")
    if user_upload_img:
        # 获取上传文件的文件名
        print(user_upload_img.filename)
        # 保存文件到本地
        # 不过一般实际开发大部分都是保存到云(阿里云oss?七牛云),或者保存到分布式存储?minio这类。
        user_upload_img.save("./1.png")

    return "request获取请求参数"

请求常用参数

属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录GET请求中的查询参数,如?name=zhangsan&age=18 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

响应处理-response对象

flask中返回响应的方式

直接返回字符串

  • 直接返回字符串,(会自动包装成Response对象)
@app.route("/demo1")
def demo1():
    return "访问静态资源"

通过模板渲染返回

  • 使用模板渲染返回,使用render_template()函数
@app.route("/demo2")
def demo2():
    # 使用render_template渲染,可以传递上下文,这个和django是一样的
    # index.html是项目目录下的templates目录中寻找
    return render_template("index.html", username="张三")

重定向

  • 重定向,使用redirect()函数
from flask import Flask, redirect

@app.route('/demo3')
def demo3():
    # 重定向到其他网站
    # return redirect(location="http://www.baidu.com", code=302)

    # 重定向到内部路由
    return redirect(location="/demo1")

返回json

  • 返回json,使用jsonify()函数(和js的名字差不多...)
from flask import Flask, jsonify

@app.route('/demo4')
def demo4():
    data = {
        "username": "张三",
        "age": 18,
        "hobby": ["篮球", "足球"]
    }
    return jsonify(data)

json返回中文默认会进行ascii编码,如果想直接显示中文,则需要设置:
# flask 2.2之前:
# app.config["JSON_AS_ASCII"] = False

# flask 2.2之后。原因:2.2提供了一个JsonProvider : https://github.com/pallets/flask/pull/4692
# 拓展:使用orjson,这个json库比较好的样子?速度更快?有空看看。https://www.jb51.net/article/250451.htm
# 这两种方式都可以,因为一个是json类,一个是json类的具体实例,相对应修改的是类属性、实例属性,所以都有效果。
app.json_provider_class.ensure_ascii = False
app.json.ensure_ascii = False

make_response函数返回

  • 使用make_response函数返回响应
@app.route('/demo6')
def demo6():
    # 可以把字符串传进去
    # response = make_response("我是响应体")

    # 也可以渲染模板后丢进去make_response()函数中再返回
    # response = make_response(render_template("index.html", username="wangwu"))

    # 还也可以搞个json
    response = make_response(jsonify({
        "username": "张三",
        "age": 18,
        "hobby": ["篮球", "足球"]
    }))
    return response

通过元组形式返回

  • 使用元组方式,按照一定格式进行返回响应,会自动包装成Response对象

    元素格式:(响应体内容, 状态码, 响应头)

# 自定义相应和相应状态码
@app.route('/demo5')
def demo5():
    # 直接返回一个元组,元组里面的(响应体内容, 状态码, 响应头)
    # 响应头中文不支持,需要编码成utf8
    return "我是响应体", 999, {"user": quote("哈师大合适的".encode('utf-8'))}

响应状态码设置

只需要设置响应对象Response中属性status_code

# 通过make_response()函数设置
response = make_response("oh, shit!!!")
# 当然,通过jsonify()函数返回的也是response对象,同样也可以用变量接收并设置status_code
# response = jsonify(data)

response.status_code = 201

return response

# 通过元组方式返回并设置
return "你好!", 400, {}

响应头设置

response.headers本身是一个字典,直接按字典的方式来设置响应头。

from urllib.parse import quote

response.headers["Content-Type"] = "application/json;charset=UTF-8"

# response.headers.set("username", "哈师大合适的")
# 中文请求头会编码报错,要用utf8编码一下,django的不会....
response.headers.set("username", quote("哈师大合适的".encode('utf-8')))
posted @ 2023-10-04 12:16  蕝戀  阅读(3)  评论(0编辑  收藏  举报