Python之Flask 请求和响应

1. 请求request

flask内置对象 request,使用时导包需导包进来

from flask import request

1.1 URL路径参数的处理

例如,有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息。此时如何从url中提取出123的数据?

Flask不同于Django直接在定义路由时编写正则表达式的方式,而是采用转换器语法:

from users import users_bp

# 若users蓝图的前缀为users,故下面的url为 http://127.0.0.1:5000/users/123
@users_bp.route('/<user_id>')
def user_info(user_id):
    print(type(user_id))  # <class 'str'>
    return "hello user %s" % user_id

此处的 <> 即是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、并以字符串为数据类型类型、 user_id为参数名传入视图。

Flask也提供其他类型的转换器

# 此项配置在 flask依赖的werkzeug中的routing.py中
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {
    "default": UnicodeConverter,
    "string": UnicodeConverter,
    "any": AnyConverter,
    "path": PathConverter,
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}

说明:

转换器说明
string(缺省值) 接受任何不包含斜杠的文本
int接受正整数
float接受浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串

将上面的例子以整型匹配数据,可以如下使用:

@users_bp.route('/1.0/<int:user_id>')
def user_info(user_id):
    print(type(user_id))  # <class 'int'>
    return "hello user %s" % user_id

# 具体转换器内可指定哪些如min、max等属性,请去看werkzeug的routing.py中的DEFAULT_CONVERTERS对应的转换器
# http://127.0.0.1:5000/users/2.0/0  Not Found
@users_bp.route('/2.0/<int(min=1):user_id>')
def user_info2(user_id):
    print(type(user_id))  # <class 'int'>
    return "hello user %s" % user_id

自定义转换器

如果遇到需要匹配提取/sms_codes/18512345678中的手机号数据,Flask内置的转换器就无法满足需求,此时需要自定义转换器。

自定义转换器主要做3步

  1. 创建转换器类,保存匹配时的正则表达式
from werkzeug.routing import BaseConverter


class MobileConverter(BaseConverter):
    # 指定属性regex的值,regex是BaseConverter的属性
    regex = r'1[3-9]\d{9}'
  1. 将自定义的转换器告知Flask应用
from ustils.converts import MobileConverter

app = Flask(__name__)

# 注册自定义转换器 
#  将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters['mobile'] = MobileConverter

# 注意,如果在users_bp蓝图中使用到了转换器,必须在注册蓝图前定义转换器

# 注册蓝图 url_prefix指定url前缀
app.register_blueprint(users_bp, url_prefix='/users')


  1. 在需要使用时指定转换器
# http://127.0.0.1:5000/users/1.0/send_sms_code/13499998888
@users_bp.route('/1.0/send_sms_code/<mobile:mobile>')
def send_sms_code(mobile):
    print(type(mobile))
    return 'be going to send sms to %s' % mobile

1.2 其他参数

如果想要获取其他地方传递的参数,可以通过Flask提供的request对象来读取。

不同位置的参数都存放在request的不同属性中

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

例如
想要获取请求/articles?channel_id=1中channel_id的参数,可以按如下方式使用:

from flask import request

from users import users_bp

# http://localhost:5000/users/1.0/articles?id=1
@users_bp.route('/1.0/articles')
def get_articles():
    print(request.args)
    id = request.args.get('id', None)
    return 'get articles : %s ' %id

上传图片 客户端上传图片到服务器,并保存到服务器中

from flask import request

from users import users_bp

@users_bp.route('/1.0/upload', methods=['post'])
def upload_file():
    f = request.files['pic']
    f.save('./demo.png')  # 这意味着传到main的同级目录,因为这个蓝图最终是在main中运行的
    return 'ok'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 响应response

2.1 返回模板

使用 render_template 方法渲染模板并返回
例如,新建一个模板 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎</title>
</head>
<body>
    我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>

后端视图

from flask import render_template

@app.route('/index', methods=['GET'])
def index():
    mstr = 'hello flask'
    mint = 10
    return render_template('index.html', my_str=mstr, my_int=mint)

2.2 重定向

使用 redirect 方法

from flask import redirect

@app.route('/to_baidu')
def to_baidu():
    return redirect('http://www.baidu.com')

2.3 返回JSON

使用 jsonify 方法

from flask import jsonify

@app.route('/get_json')
def get_json():
    json_dict = {
        'id': 10,
        'name': 'zhangsan'
    }
    return jsonify(json_dict)

2.4 自定义状态吗和响应头

  1. 元组方式
    可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
@app.route('/demo1')
def demo01():
    return '状态码 666', 666, {'python':'hello'}
  1. make_response 方式
from flask import make_response

@app.route('/demo2')
def demo02():
    resp = make_response("make response 测试")
    resp.headers['python'] = 'hello'
    resp.status = '404 Not found'
    return resp

3. cookie

3.1 设置

from flask import make_response

@app.route('/cookie')
def set_cookie():
    resp = make_response(' set cookie ok')
    resp.set_cookie('username', 'zhangsan', max_age=3600)
    return resp

3.2 读取

from flask import request

@app.route('/get_cookie')
def get_cookie():
    cookie = request.cookies.get('username', None)
    return cookie

3.3 删除

from flask import make_response

@app.route('/del_cookie')
def del_cookie():
    resp = make_response(' del completed')
    resp.delete_cookie('username')
    return resp

4. session

说明:session 是一个 dict ,它用于储存横跨请求的值。当验证 成功后,用户的session信息被储存于一个新的会话中。会话数据被储存到一个 向浏览器发送的 cookie 中,在后继请求中,浏览器会返回它。 Flask 会安全对数据进行 签名 以防数据被篡改。

Flask的session是存储在浏览器中的。相当于是个加密的cookie。有一个加密过的key为sessionid的cookie和加密过的key为session的cookie。sessionid相当于一个客户端私钥,session就是存储的加密过后的session信息。
Flask的session依赖 SECRET_KEY,即要想使用session,必须有SECERT_KEY。
服务器的SECERT_KEY应是唯一的,这样也就能满足一个站点一个cookie,其他网站没有我的签名,这样你即使读取到本站的session(加密cookie)也解析不了,而其他网站的session没有我的经过本站的签名加密,我也识别不出来。

4.1 设置

from flask import session

class DefaultConfig(object):
    SECRET_KEY = 'fih9fh9eh9gh2'
# app.config.from_object(DefaultConfig)
app.secret_key = 'abcdefg'

@app.route('/set_session')
def set_session():
    session['username'] = 'zhangsan'
    return 'set session ok!'

4.2 读取

from flask import session

class DefaultConfig(object):
    SECRET_KEY = 'fih9fh9eh9gh2'
# app.config.from_object(DefaultConfig)
app.secret_key = 'abcdefg'

@app.route('/get_session')
def get_session():
    username = session.get('username', None)
    return 'get session username: %s' %username

4.3 删除

@app.route('/del_session')
def del_session():
    # session.clear()
    mobile = session.pop('mobile')
    return 'del session mobile: %s' %mobile
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Flask 实现 POST 请求的示例代码: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/data', methods=['POST']) def post_data(): data = request.get_json() # 获取 POST 请求中的 JSON 数据 # 在这里对数据进行处理和计算 result = {'result': 'success'} return jsonify(result) if __name__ == '__main__': app.run(debug=True) ``` 在这个例子中,我们使用 Flask 框架创建了一个名为 `app` 的应用程序。我们创建了一个 `post_data` 函数,它将处理 POST 请求并返回响应。我们使用 `@app.route` 装饰器指定了路由路径 `/api/data` 和请求方法 `POST`。 在 `post_data` 函数中,我们使用 `request.get_json()` 方法获取 POST 请求中的 JSON 数据,并将其存储在 `data` 变量中。在这里,我们可以对数据进行处理和计算,并将结果存储在 `result` 变量中。最后,我们使用 `jsonify` 方法将 `result` 变量转换为 JSON 格式,并将其作为响应返回。 当我们运行这个应用程序时,它将在本地主机(localhost)的 5000 端口上监听请求。可以使用类似于以下的 curl 命令来向 `/api/data` 路由发送 POST 请求: ``` $ curl -X POST -H "Content-Type: application/json" -d '{"data": "example"}' http://localhost:5000/api/data ``` 这个命令将发送一个包含 JSON 数据的 POST 请求。在这个例子中,我们发送的 JSON 数据是 `{"data": "example"}`。收到请求后,Flask 将执行 `post_data` 函数并返回 JSON 格式的响应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值