一.请求带参
1、路径中带参
固定参数是指在URL中固定的, 是不可获取的一部分, 区别与查询字符串, 查询字符串是可有可无的.
标准格式
/path/<参数>
默认 参数 格式是字符串
但是我们还有其他的格式,可以做数据格式转换
flask提供了常见数据格式的转换
string、int、float、path、uuid
# 2请求参数的获取
# (1).语法形式:
@app.route('/users/<user_id>')
def user_info(user_id):
print(user_id)
print(type(user_id))
return '获取到的userid为: {}'.format(user_id)
# (2).语法解释:
在路由中使用<user_id>来接收固定参数, 且不要忘记传递给视图, 即视图必须定义形参user_id.
注意:
- 路由中的user_id前可以限定类型, 写法参考: <int:user_id>, 限定了类型, 前端传来的固定参数就必须符合类型要求, 否则报错; 如果不限定类型, 默认接收到的为字符串类型
- 视图必须定义形参, 且形参的名字必须与路由中一直, 即路由中写user_id, 视图函数形参也必须是user_id
/path/<string:参数> 默认string可不写 /path/<int:参数> 会把参数 转成 整数 如果参数不是整数 会报错返回 404 /path/<float:参数>
# .转换器
上面的固定参数是使用转换器实现的, flask自带的转换器共有6个:
- UnicodeConverter: 字符串转换器
- AnyConverter: 匹配any中任意路径, 写法:'/users/<any(xxx,yyy):user_id>'
- PathConverter: 路径转换器, 与字符串转换器相似, 但参数中可以包含"/"
- IntergerConverter: 整型转换器
- FloatConverter: 浮点型转换器
- UUIDConverter: UUID唯一标识码转换器
-
自定义 转换器
1、创建一个自定义转换器 自定义Converter类 class PhoneConverter(BaseConverter): # 重写 正则规则 查看参数是否匹配该正则 regex = r'1[3-9]\d{9}' 2、注册至converters容器 phone 转换器别名 app.url_map.converters['phone'] = PhoneConverter 3、使用自定义转换器 @app.route('/user/<phone:user_id>') def user_info(user_id): return "手机号登录:{}".format(user_id)
二.处理请求
处理请求
flask提供了视图函数,可以在视图函数中 处理请求
1、获取url后?参数
request.args.get("参数","默认值") title = request.args.get("title", "没有")
2、form表单传参
title = request.form.get("title") price = request.form.get("price")
3、 json格式传参
title = request.json.get("title") price = request.json.get("price")
4、文件上传
file1 = request.files.get("file1")
可以获取文件名
file1.filename
保存文件
file1.save()
def upload_file():
# 获取前端传递过来的文件对象
img = request.files.get('pic')
# 获取文件对象的文件名
file_name = img.filename
# 保存文件对象
img.save(file_name)
return '上传成功!'
三.响应
1、返回字符串
默认就可以直接返回字符串,其实返回的还是网页,只不过内容是纯文本
return "返回图书集合"
2、返回模板网页
from flask import render_template @app.route("/", methods=["GET", "POST"]) def hello_world(): return render_template("home.html")
-
扩展一点 Jinjia2 模板引擎
Jinjia2模板 和我们django 内置模板语法 基本一致, 我们简单了解
我们在 视图中 定义好 变量数据
@app.route("/", methods=["GET", "POST"]) def hello_world(): new_list = ["新闻1", "新闻2", "新闻3", "新闻4"] return render_template("home.html", news={"news_list": new_list, "title": "我是新标题"})
在 模板中使用 定义好的变量数据
{{变量名}} 会展示变量的值
{% for 语句 %} 循环体 {% endfor %}
<body> <h1>{{ news.title }}</h1> <h1>《功勋-李延年》</h1> {% for item in news.news_list %} <p>{{ item }}</p> {% endfor %} </body>
3、返回重定向地址
有的时候,资源不在当前 路径对应的视图中,而是在另外一个地方,我们就需要重定向,告诉浏览器你在访问 这个地方。
浏览器 其实访问了两遍
from flask import redirect
from flask import url_for
@app.route("/books", methods=["GET"]) def go_book(): return redirect("/book")
-
url_for函数
我们在代码中 尽量避免 直接写路径,如果写的多了,想修改某路径的时候,那就需要修改很多地方。
我们使用endpoint 参数 给 路由 起别名, 使用别名代表 该用户
@app.route("/book", endpoint="book") def book_list(): title = request.args.get("title", "没有") return "返回图书集合"
url_for 传入别名 找到对应的路由
@app.route("/books", methods=["GET"]) def go_book(): return redirect(url_for("book"))
4、返回json格式数据
我们要返回json格式数据,可以借助于 提供的函数 jsonify
from flask import jsonify
jsonify 会返回一个 Content-Type是 application/json 格式的 响应对象
5、返回元组响应
我们可以 同时设置 返回内容、响应码、响应头等信息
(响应内容,响应码,响应头)
@app.route("/book/add", methods=["POST"]) def book_add(): return ("添加图书成功", 500, {"Content-Type": "application/json"})
6、make_response 返回
我们也可以自定义返回的内容,使用make_reponse 方法。
from flask import make_response
@app.route("/book/<int:id>/") def book_one(id): print(type(id)) resp = make_response("我要升天") resp.headers["Content-Type"] = "text/html" resp.status_code = 500 resp.status = "500 error"