Flask 学习笔记
一、URL 与 视图
1.1、URL 与 函数的映射
从之前的 helloworld.py 文件中,我们已经看到,一个 URL 要与执行函数进行映射,使用的是 @app.route 装饰器
。装饰器中,可以指定 URL 的规则来进行更加详细的映射,比如现在要映射一个文章详情的 URL,文章详情的 URL 是 /list/id/
,id
有可能为 1、2、3…,那么可以通过以下方式:
@app.route('/')
def hello_word():
return 'Hello World!'
@app.route('/list/')
def lis_word():
return 'list 页面'
@app.route('/list/<id>/')
# @app.route('/list/<int:id>/')
def lis(id):
# 访问 http://127.0.0.1:5000/list/66s
# 访问 http://127.0.0.1:5000/list/66
return f'这是第 {id} 个页面'
其中,尖括号是固定写法,语法为,variable 默认的数据类型是 字符串。如果需要指定类型,则要写成 converter:variable
,其中 converter 就是类型名称(如 int),可以有以下几种:
-
string
:默认的数据类型,接受没有任何斜杠/的字符串。 -
int
:整形。可写成/list/<int:id>/
-
float
:浮点型。 -
path
:和 string 类似,但是可以传递斜杠/。 -
uuid
:uuid 类型的字符串。 -
any
:可以指定多种路径。
any 指定多个路径
@app.route('/<any(article,blog):url_path>/')
def item(url_path):
# 访问 http://127.0.0.1:5000/article
# 访问 http://127.0.0.1:5000/blog
return url_path
如果不想定制子路径来传递参数,也可以通过传统的 ?=
的形式来传递参数,例如:/article?id=xxx
,这种情况下,可以通过 request.args.get('id')
来获取 id
的值。如果是 post 方法,则可以通过 request.form.get('id')
来进行获取。
from flask import request
@app.route('/wd')
def req():
return request.args.get("name")
二、构造 URL
一般我们通过一个 URL 就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个 URL 呢 ?url_for()
函数就可以帮我们实现这个功能。url_for()
函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应 URL 规则的命名参数,如果还出现其他的参数,则会添加到 URL 的后面作为查询参数。
通过构建 URL 的方式而不是选择直接在代码中拼 URL 的原因有两点:
- 将来如果修改了 URL,但没有修改该 URL 对应的函数名,就不用到处去替换 URL 了。
- url_for() 函数会转义一些特殊字符和 unicode 字符串,这些事情 url_for 会自动的帮我们搞定。
from flask import Flask, url_for
app = Flask(__name__)
@app.route("/lis/<aid>/")
def lis(aid):
return f"article list {aid}"
@app.route('/')
def index():
name = url_for("lis", aid=5, name="admin")
print(name) # 控制台打印出 /lis/5/?name=admin
return "Hello World!"
if __name__ == '__main__':
app.run(debug=True)
三、指定 HTTP 方法
在 @app.route()
中可以传入一个关键字参数 methods
来指定方法支持的 HTTP 方法,默认情况下,只能使用 GET 请求。
# 没有 methods 参数默认只接收 get 请求
# 有 methods 参数后, 只接收参数所包含的请求
@app.route("/login/", methods=['GET', 'POST'])
def login():
# print(type(request.args))
# GET请求接受参数
print(request.args.get('username'))
# POST请求接受参数
print(request.form.get("name"))
return "login"
四、页面跳转与重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
-
永久性重定向: http 的状态码是
301
。多用于旧网址被废弃了要转到一个新的网址确保用户的访问。最经典的就是京东网站,你输入www.jingdong.com
的时候,会被重定向到www.jd.com
因为www.jingdong.com
这个网址已经被废弃了,被改成jd.com
,所以这种情况下应该用永久重定向。 -
暂时性重定向: http 的状态码是
302
。表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
在 Flask 中,重定向是通过 flask.redirect(location, code=302)
这个函数来实现的。其中 location
表示需要重定向到的 URL,应该配合之前的 url _for()
函数来使用,code
表示采用哪一个重定向,默认是 302 暂时性重定向,也可以修改成 301 来实现永久性重定向。
from flask import Flask, ur1_ for, redirect
Flask(__name__)
@app.route('/login/', methods=['GET', 'POST'])
def login():
return 'login page'
@app.route('/profile/', methods=['GET', 'POST'])
def profile():
name = request.args.get('name')
if not name:
return redirect(url_for('login'))
else:
return name
五、响应
视图函数可以返回 string, dict, tuple, Response instance, WSGI callable
等类型的值,但是不能返回列表型数据。
from flask import Response, make_response
@app.route("/about/")
def about():
# # 返回字符串
# return "666"
# # 不能返回列表
# return ['a', 'b']
# # 返回字典
# return {'name': 'li', 'age': '18', 'sex': 1}
# # 返回元组, 但默认返回第一个
# return ('name', 'li')
# return ('name', 'li')[1]
# # 一般也不会像上面这个返回元组, 而是如下
# return 'name', 200
# # 返回 Response 对象, 参数: 显示的字符串、状态码、类型
# # 这个返回其实相当于返回字符串
# return Response("haha", status=200, mimetype="text/html")
# 使用 make_response() 创建 Response 对象
# 可以设置额外的数据, 如设置 cookie, header 信息
return make_response("hello")