flask-基础篇02 请求与响应
一、处理请求
1、URL路径参数(动态路由)
# 例如,有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息。此时如何从url中提取出123的数据? @app.route("/user/<user_id>") def user_info(user_id): print(user_id) return "hello user {}".format(user_id) # 上面<>是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、并以字符串为数据类型、user_id 为参数名传视图。
2、Flask提供的其他的转换器
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
将上面的例子以整形匹配数据,可以如下使用:
@app.route('/user/<int:user_id>') def user_info(user_id): print(type(user_id)) return "hello world {}".format(user_id)
3、自定义转换器
问题:如果遇到需要匹配提取 /sms_codes/13886555555 中的手机号数据,Flask内置的转换器将无法满足,此时需要自定义转换器。
定义方法(分为三步)
# 第一步、创建转换器类,保存匹配的正则表达式 from werkzeug.routing import BaseConverter class MobileConverter(BaseConverter): """ 手机号码格式 """ regex = r"1[3-9]\d{9}" # 注意 regex 名字是固定的 # 第二步、将自定义的转换器告知Flask应用 app = Flask(__name__) # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为:mobile app.url_map.converters["mobile"] = MobileConverter # 第三步、在使用转换器的地方定义使用 @app.route('/sms_codes/<mobile:mob_num>') def send_sms_code(mob_num): return "send sms code to {}".format(mob_num)
4、其他参数
如果想要获取其他地方传递的参数,可以通过Flask提供的 request 对象来读取。
不同位置的参数都存放在request的不同属性中
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
5、例如 想要获取请求 /articles??channel_id=1 中 channel_id 的参数,可以按如下方式使用:
from flask import request @app.route('/reticles') def get_reticles(): channel_id = request.args.get("channel_id") return 'you wanna get articles of channel {}'.format(channel_id)
6、上传图片
客户端上传图片到服务器,并保存到服务器中
from flask import request @app.route('/upload', methods=['POST']) def upload_file(): f = request.files["pic"] # 图片的键是 pic # with open("./demo.png", "wb") as new_file: # new_file.write(f.read()) f.save(./demo.png) return "ok"
二、处理响应
需求:如何在不同的场景里返回不同的响应信息?
1、返回模板
使用 render_template 方法渲染模板并返回,例如下,新建一个模板 index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我的模板html内容 <br/>{{ my_str }} <br/>{{ my_int }} </body> </html>
后端视图
from flask import render_template @app.route("/") def index(): mstr = "Hello World" mint = 10 render render_template("index.html", my_str=mstr, my_int=mint) # 如果是一个字典,也可以这样 @app.route("/") def index(): my_info = { "mstr":"Hello World" "mint":10} render render_template("index.html", **my_info)
2、重定向
# 将一个路由重定向到百度首页 from flask import redirect @app.route("/demo2") def demo2(): return redirect("http://www.baidu.com")
3、返回json
from flask import jsonify @app.route("/demo3") def demo3(): json_dict = { "user_id": 10, "user_name": "huofei" } return jsonify(json_dict)
4、自定义状态码和响应头
①元祖方式
可以返回一个元组,这样的元组必须是(request, status, headers)的形式,且至少包含一个元素。status 值会覆盖状态代码,headers可以是一个列表 或字典,作为额外的消息头值,实现代码如下:
@app.route("/demo4") def demo4(): # return '状态为 666', 666 # return "状态码为 666", 666, [("name", "huofei")] return "状态吗为 666", 666, {"name": "huofei"}
②make_response方式
@app.route("/demo5") def demo5(): resp = make_response("make response测试") resp.headers["name"] = "huofei" resp.status = "404 not found" return resp
三、Cookie
如何设置?如下代码:
from flask import Flask, make_response app = Flask(__name__) @app.route("/cookie") def set_cookie(): resp = make_response("set cookie ok") resp.set_cookie("username", "huofei") return resp
设置有效期
@app.route("/cookie") def set_cookie(): response = make_response('hello world') # 设置有效期为3600秒 response.set_cookie("username", "huofei", max_age=3600) return response
读取
from flask import request @app.route("/get_cookie") def get_cookie(): resp = request.cookie.get("username") return resp
删除
# 删除的原理是将cookie的有效期修改为1970年了 from flask import request @app.route("/delete_cookie") def delete_cookie(): response = make_response("hello world") response.delete_cookie("username") return response
四、Session
1、需要先设置SECRET_KEY,如下
class DefaultConfig(object): SECRET_KEY = "fq3rfdsqdsaDFAdDAF" app.config.from_object(DefaultConfig) # 或者直接设置 app.secret_key = "abc1dsfq23321adaaf"
2、设置
from flask import session @app.route("/set_session") def set_session(): session["username"] = "huofei" return "set session Ok"
3、读取
@app.route("/get_session") def get_session(): username = session.get("username") return "get session username {}".format(username)