Flask请求和响应

Flask请求和响应

flask请求对象

使用Flask Request对象需要在Flask应用程序中导入request模块。

requset:全局的,但是也是每个请求一个request

from flask import Flask, render_template, request
from flask.views import View, MethodView

app = Flask(__name__, template_folder='templates')


@app.route('/', methods=['GET', 'POST'])
def index():
    # 在哪个视图函数执行 , request对象就是属于哪个视图函数
    print(request.path)  # /
    return 'index'


@app.route('/home', methods=['GET', 'POST'])
def home():
    print(request.path)  # /home
    return 'home'


if __name__ == '__main__':
    app.run()

request参数

Flask Request对象是一个封装了HTTP请求信息的类,它提供了访问HTTP请求的各种属性和方法

如URL参数、表单数据、文件上传等。

request.method  		提交的方法
request.args 			get请求提及的数据
request.form   			post请求提交的数据
request.values  		post和get提交的数据总和

request.cookies  		客户端所带的cookie
request.headers  		请求头

request.path     		不带域名,路由中请求路径
request.full_path  		不带域名,带参数的请求路径
request.script_root  
request.url           	带域名带参数的完整的请求路径
request.base_url		带域名请求路径
request.url_root      	域名
request.host_url		只有主机和端口号的url
request.host			127.0.0.1:500
request.remote_addr		客户端ip

request.data			包含传入的请求数据作为字符串
request.json			获取json数据
request.files			获取请求上传的文件


obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename))
from flask import Flask, request

wen = Flask(__name__)

@wen.route("/request/info", methods=["GET"])
def get_request_info():
    print(f"request.args类型:{type(request.args)}")
    print(f"request.args = {request.args}\n")

    print(f"request.json类型:{type(request.json)}")
    print(f"request.json = {request.json}\n")

    print(f"request.files类型:{type(request.files)}")
    print(f"request.files = {request.files}\n")

    print(f"request.form类型:{type(request.form)}")
    print(f"request.form = {request.form}\n")

    print(f"request.method类型:{type(request.method)}")
    print(f"request.method = {request.method}\n")

    print(f"request.url类型:{type(request.url)}")
    print(f"request.url = {request.url}\n")

    print(f"request.host类型:{type(request.host)}")
    print(f"request.host = {request.host}\n")

    print(f"request.headers类型:{type(request.headers)}")
    print(f"request.headers = {request.headers}\n")

    return {"status": 0, "message": "get success"}

if __name__ == "__main__":
    wen.run()

args-Get参数获取

args属性是请求路径中的查询参数,例如:/hello?name=zs, args 解析出来的数据是一个类似字典的对象,例如 args = {"name": 'zx'}

print(request.args)

request.args.get('参数名')   # 获取 GET 请求参数
request.args['name']
request.args['age']           
request.args.get('name')     
request.args.getlist('name')     

form-POST请求参数

form 顾名思义是表单数据,当请求头content-type 是 application/x-www-form-urlencoded 或者是 multipart/form-data 时,请求体的数据才会被解析为form属性。

print(reqeust.form)

request.form.get('参数名')    # 获取 POST 请求参数
request.values.get('参数名')
from flask import request

@app.route('/user')
def user():
    uid = request.args.get('uid')
    return 'USER ID: {}'.format(uid)

JSON

如果我将content-type指定为application/json, flask就会将接收到的请求体数据做一次json编码转换,将字符串转换为字典对象,赋值给属性json

@app.route("/hello", methods=["GET", "POST"])
def hello():
    print("content_type:", request.headers.get("content_type"))
    print("data:", request.data)
    print("form:", request.form)
    print("json:", request.json)
    return ""

request.values

values 是 args 和 form 两个字段的组合

可以同时获取args参数和form表单参数

@app.route("/hello", methods=["GET", "POST"])
def hello():
    print("content_type:", request.headers.get("content_type"))
    print("args:", request.args)
    print("form:", request.form)
    print("values:", request.values)
    return "hello"

路径属性

request.path	路由中的路径
request.url		完整的请求地址
request.base_url	去掉GET参数的url
request.host_url	只有主机和端口号的url
request.remote_addr	客户端ip

路由转化器

有时我们需要将同一类URL映射到同一个视图函数处理
比如:使用同一个视图函数 来显示不同用户的个人信息。
# 请求访问接口地址为:/users/1,其中1是具体请求参数
# 请求访问接口地址为:/users/2,其中2是具体请求参数
# 请求访问接口地址为:/users/3,其中3是具体请求参数

@app.route('/user/<uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)
@app.route('/user/<int:uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)


@app.route('/user/<int(min=5):uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)

自定义转换器

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定义一个转换器类
class RegexMobileConverter(BaseConverter):
    regex = r'1[3-9]\d{9}'
    def __init__(self, url_map):
        #调用父类方法
        super(RegexMobileConverter, self).__init__(url_map)
    
# 将转换器注册到app中去
app.url_map.converters['mobile'] = RegexMobileConverter
#打印输出所有的系统转换器列表
print(app.url_map.converters)

# 路由使用转换器
@app.route('/user/<mobile:temp>')
def create_new(temp):
    print(temp)
    return f'mobile{temp}'


if __name__ == '__main__':
    print(app.url_map)
    app.run()

flask响应返回

Flask中的Response对象是用于构建 HTTP 响应的类。它继承自 Python 标准库中的werkzeug.wrappers.Response 类,提供了一些方便的方法,如设置响应头、状态码和内容等。

可以设置的响应返回有:

  • 1 直接返回字符串
  • 2 返回模板渲染:render_template
  • 3 返回重定向: redirect
  • 4 返回json格式:jsonify
  • 5 自定义响应对象
from flask import Flask, request
app = Flask(__name__)

@app.route('/post',methods = ['POST', 'GET'])
def post():
   if request.method == 'POST':
   	  # request.form:表单数据
      result = request.form
      print(result)
      return "post"


 # 返回模板
@app.route('/')
def student():
   
   return render_template('index.html')


 # 返回字符串
@app.route('/get')
def get():
 	# 获取URL参数中名为name的值,默认为Jack
    name = request.args.get('name', 'Jack')
    return f'Hello, {name}!'


@app.route('/upload', methods=['POST'])
def upload():
	# 获取上传文件对象
    file = request.files['file']
    if file:
        return 'File uploaded successfully.'

if __name__ == '__main__':
    app.run()

返回json

在使用json都是自己使用json.dumps方法把数据转成json。并把响应头媒体类型定义成application/json

其实flask帮我们封装了一个方法,专门用于返回json数据响应对象。

from flask import jsonify

@app.route('/')
def index():
    json_dict = {
        "name": 'Flask',
        "age": 22
    }
    return jsonify(json_dict)

也是用Response类处理

并自动获取config里面的源类型 默认是application/json

自定义响应对象

在return的时时候,可以接收三个参数,第一个响应数据,第二个响应状态码,第三个响应头

可以手动修改 响应状态和响应头

@app.route("/", methods=["GET", "POST"])
def index():
    return json.dumps({"username": "jiangmingbai"}), 201, {"content-type": "application/json"`}

调用 make_response() 函数来创建一个响应对象并将字符串Hello, World设置为响应体。然后,设置响应头部信息 Token,设置响应状态码200 OK,并最终将响应对象返回给客户端。

from flask import make_response

@app.route('/')
def index():
    resp = make_response('Hello World')  #res 就是响应对象, Hello World是响应体
    resp.headers["Token"] = "Python"
    resp.status = "200 OK"

    return resp

make_response()里基于current_app.make_response(args)方法

  def __init__(
        self,
        response=None,  # 响应数据
        status=None,  # 状态码
        headers=None,  # 头信息
        mimetype=None,  # 媒体类型
        content_type=None,  
        direct_passthrough=False,
    ):

from flask import Flask, make_response

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    r = make_response(json.dumps({"username": "beike"}), 201, {"content-type": "application/json"})
    print(r)  # <Response 28 bytes [201 CREATED]>实例对象
    r.status = "202 OK"  # 通过实例在赋值stutas时必须是字符串
    return r
if __name__ == '__main__':
    app.run(debug=True)

重定向

在 Flask 中,可以使用 redirect 函数进行重定向。该函数位于 flask 模块中,可以接受一个 URL 参数作为重定向的目标。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置

  • 网页上的网址(完整的)
  • 自己写的视图函数,使用url_for('蓝图名称.视图函数') 反向解析
# 当用户访问根URL/ 时,会调用index函数,并在其中调用 redirect 函数,将用户重定向到login视图函数所对应的 URL。

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    return 'Login page'



# 当访问URL/test 时,会重定向到baidu.com
@app.route('/test')
def test():
    return redirect('http://www.baidu.com')

URL 参数可以是相对路径或绝对路径。如果传入的是相对路径,则会基于当前请求的 URL 进行解析,生成最终的重定向目标 URL。

Cookies对象

Cookie技术是用来保持web访问状态

Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息

设置cookie,默认有效期是临时cookie,浏览器关闭就失效

在设置 cookie 时,可以指定其过期时间、域名、路径等信息。在 Flask 中,可以通过设置 max_age、expires、domain、path 等参数来实现这些功能。

from flask import make_response

@app.route('/set')
def set():
    resp = make_response('Hello World')
    resp.set_cookie('Token', 'Python' , max_age=3600)
    return resp

# resp.set_cookie('user', 'Tom', max_age=3600, expires=None, domain=None, path='/')

获取和删除

@app.route('/get')
def get():
    resp = request.cookies.get('Token')
    return resp

@app.route('/delete')
def delete():
    response = make_response('Successfully')
    response.set_cookie('username', '', expires=0)  # 设置Cookie过期时间为0
    return response

Cookie的特点

① 数据全都是存储在客户端中,存储使用的是键值对结构进行存储
② Cookie支持过期时间
③ Cookie不能跨域名,不能跨浏览器
④ 根据域名进行Cookie存储
⑤ Cookie是通过服务器创建的Response来创建的

Session会话对象

浏览器中手动添加和修改Cookie是很容易的事情,如果直接把认证信息以明文的方式存储在Cookie里,那么恶意用户就可以通过伪造Cookie的内容来获取对网站的权限。为了避免上述的问题,我们需要对铭感的Cookie内容进行加密,出现了Session

Session指用户会话(user session),即服务器和客户端/浏览器之间或桌面程序和用户之间建立的交互活动

在Flask中,Session对象用来加密Cookie,默认情况下,它会把数据存储在浏览器上一个名为"session"的Cookie里,Session通过密钥对数据进行签名以加密数据,因此我们需要先设置一个密钥,这里的密钥就是一个具有一定复杂度和随机性的字符串

from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'your-secret-key'  # 设置密钥,用于加密Session数据

@app.route('/')
def hello():
    # 设置Session数据
    session['username'] = 'John'
    return 'Hello, World!'

@app.route('/user')
def get_user():
    # 获取Session数据
    username = session.get('username')
    if username:
        return f'Current user: {username}'
    else:
        return 'User not found'

if __name__ == '__main__':
    app.run()

获取删除和设置

session.get(key, default=None)

session['key'] = 'value'

# 删除某一值
session.pop(key)
# 清除所有(慎用,会删除服务器下的所有session)
session.clear()

Session的特点

① 所有数据存储在服务器中,默认存储在内存中
② 存储结构是键值对(key-value)格式
③ Session依赖于Cookie

参考资料

https://blog.csdn.net/qq_38628046/article/details/129090168

https://www.cnblogs.com/dream-ze/p/17659504.html 请求和响应

https://www.cnblogs.com/LyShark/category/2038132.html

https://www.cnblogs.com/jiangmingbai/p/13179950.html#1get请求

posted @ 2024-04-20 20:57  贝壳里的星海  阅读(24)  评论(0编辑  收藏  举报