请求(请求扩展) 与 响应(四件套)

一. 请求对象

在 flask 中, 请求对象是全局的,需要导入, 但是在哪个视图函数中使用, 就是那个视图函数的 request 对象。

''' 导入 request 对象 '''

  from flask import request

1.1 request 中的一些方法

1. 请求方法
    request.method

2. get 请求携带的数据
    request.args

3. post 请求携带的数据
    (1) 表单数据
        request.form
    (2) 请求体中
        data = request.get_json()
        user = data.get('<名称>')

4. post和get提交的数据总和
    request.values

5. 客户端所带的cookie
    request.cookies

6. 请求头
    request.headers

7. 请求路径 >>> '/login'
    request.path

8. 不带域名,带参数的请求路径 >>> '/login?name=lqz&age=28'
    request.full_path

9. 带域名带参数的请求路径 >>> 'http://127.0.0.1:5000/login?name=lqz&age=28'
    request.url

10. 带域名请求路径 >>> 'http://127.0.0.1:5000/login'
    request.base_url

11. 域名 >>> 'http://127.0.0.1:5000/'
    request.url_root
    request.host_url

12. request.script_root  ???
    print('服务端:', request.script_root)

1.2 请求扩展

重要

以装饰器的形式使用 >>> 类似于 django 的中间件

1. before_request (重要)

(1) 多个的话,会从上往下, 依次执行

(2) 在这里面,正常使用request对象

@app.before_request
def beforeIn():

    print('我进来了哦')

    return '四件套 or str' >>> '''这里如果还回了字符串 或者 四件套, 就直接执行了, 后面的就不会执行了'''

2. after_request (重要)

(1) 多个的话,会从下往上,依次执行, 与 before_request 相反

(2) 要有参数,和返回值,参数就是response对象,返回值也必须是resposne对象

(3) session,request 照常使用

@app.after_request
def afterTo(response):    >>> ''' 接受一个参数, response对象 '''

    print('我走了哦')

    return response       >>> ''' 返回值也必须是resposne对象 '''

了解

3. before_first_request

(1) 项目启动后,第一次访问会执行,以后再也不执行了

(2) 可以做一些初始化的操作

4. teardown_request

(1) 每一个请求之后绑定一个函数,即使遇到了异常,每个请求走,都会执行,记录错误日志

@app.teardown_request
def tear_down(e):
    print(e)                  # 如果有异常,这是异常对象
    print('我执行了')

5. errorhandler

(1) 路径不存在时404

(2) 服务器内部错误500, debug为False请情况下才能看到

@app.errorhandler(404)       # 路径不存在时404
def error_404(arg):
    print('404会执行我')
    # return "404错误了"
    return render_template('404.html')


@app.errorhandler(500)       # 服务器内部错误500, debug为False请情况下才能看到
def error_500(arg):
    print('500会执行我')
    return "服务器内部错误"

6. template_global 模板 ------- template_filter过滤器

@app.template_global()             # 在模板中用  {{sb(1,2)}}
def sb(a1, a2):
    return a1 + a2


@app.template_filter()             # 在模板中用  {{10|db(1,2)}}
def db(a1, a2, a3):
    return a1 + a2 + a3

二. 响应(四件套)

2.1 响应对象 >>> 手动构造响应数据

代码:

from flask import Flask
from flask.views import MethodView

app = Flask(__name__)


class LoginView(MethodView):
    def get(self):
        user_info = {'name': '孙悟空', 'age': 520, 'gender': 'man', }

        return user_info, 201, {'Content-Type': 'text/plan', 'server': 'lqz'}


app.add_url_rule('/login', view_func=LoginView.as_view('login'))

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

浏览器展示:
image
image

2.2 响应对象 >>> make_response

通过 make_response 包裹后,是一个 bytes 类型

''' 导入 make_response 对象 '''

from flask import Flask,  make_response

代码:

from flask import Flask, make_response
from flask.views import MethodView

app = Flask(__name__)


class LoginView(MethodView):
    def get(self):

        user_info = {'name': '大帅', 'age': 320, 'gender': 'man', }

        # 通过 make_response 包裹后,是一个 bytes 类型
        res = make_response(user_info, {'Content-Type': 'text/plan', 'server': 'lqz'})

        # 设置状态码
        res.status = 201
        # 设置响应头
        res.headers['name'] = 'lqz'
        # 设置 cookie
        res.set_cookie('session_key', 'session_value')
        # 删除 cookie
        res.delete_cookie('session_key')

        return res


app.add_url_rule('/login', view_func=LoginView.as_view('login'))

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

浏览器展示:

image
image

2.3 响应对象 >>> jsonify

1. 通过 jsonify 包裹后,也是一个 bytes 类型

2. 不能通过对 jsonify 传参,设置 响应头了

''' 导入 jsonify 对象 '''

from flask import Flask,  jsonify

代码:

from flask import Flask, jsonify
from flask.views import MethodView

app = Flask(__name__)


class LoginView(MethodView):
    def get(self):

        user_info = {'name': '大帅', 'age': 320, 'gender': '男', }
        # user_info = json.dumps(user_info, ensure_ascii=True)

        # 不能通过对 jsonify 传参,设置 响应头了
        res = jsonify(user_info=user_info)

        res.status = 201
        res.headers['name'] = 'lqz'
        res.set_cookie('session_key', 'session_value')

        return res


app.add_url_rule('/login', view_func=LoginView.as_view('login'))

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

浏览器展示:

image
image

2.4 响应对象 >>> redirect

''' 导入 redirect 对象 '''

from flask import Flask,  redirect


''' 使用 redirect 对象 '''

return redirect('/index', 202, Response=None)


''' 参数介绍 '''

redirect (
    location: str, code: int = 302, Response: t.Optional[t.Type["Response"]] = None
)

location:    # the location the response should redirect to.
code:        # the redirect status code. defaults to 302.
Response:    # a Response class to use when instantiating a response. The default is :class:`werkzeug.wrappers.Response` if unspecified.
posted @ 2023-05-15 20:59  codegjj  阅读(5)  评论(0编辑  收藏  举报