Flask Web 学习笔记2 -- URL与视图函数映射
-学习笔记-
通过 URL 传递参数,接收参数,利用试图函数实现参数到 URL 转换,自定义 URL 转换
URL 是 Uniform Resource Locator 的简写,统一资源定位符。
一个 URL 由以下几部分组成:
scheme://host:port/path/?query-string=xxx#anchor
- scheme:代表的是访问的协议,一般为 http 或者 https 以及 ftp 等。
- host:主机名,域名,比如www.baidu.com。
- port:端口号。当你访问一个网站的时候,浏览器默认使用 80 端口。
- path:查找路径。比如:www.jianshu.com/trending/now,后面的trending/now就是path。
- query-string:查询字符串,比如:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。
- anchor:锚点,后台一般不用管,前端用来做页面定位的。
传递参数
传递参数的语法是:/<参数名>/。然后在视图函数中,也要定义同名的参数。
1 |
参数的数据类型
- 如果没有指定具体的数据类型,那么默认就是使用
string数据类型。 int数据类型只能传递int类型。float数据类型只能传递float类型。path数据类型和string有点类似,都是可以接收任意的字符串,但是path可以接收路径,也就是说可以包含斜杠。uuid数据类型只能接收符合uuid的字符串。uuid是一个全宇宙都唯一的字符串,一般可以用来作为表的主键。any数据类型可以在一个url中指定多个路径。
1 |
|
接收用户传递的参数
- 第一种:使用
path的形式(将参数嵌入到路径中),就是上面讲的。 - 第二种:使用查询字符串的方式,就是通过
?key=value的形式传递的。
1 |
|
URL 转换器
url_for将视图函数名字后面的参数传递给url。
如果传递的参数之前在url中已经定义了,那么这个参数就会被当成path的形式给url。如果这个参数之前没有在url中定义,那么将变成查询字符串的形式放到url中。
1 | from flask import Flask,url_for,request |
url_for 优势
将来如果修改了
URL,但没有修改该 URL 对应的函数名,就不用到处去替换 URL 了
1 |
|
- url_for 会自动的处理那些特殊的字符,不需要手动去处理。
1 |
|
自定义 URL 转换器
URL 参数的数据类型通过routing.py中的Unicode/Float/Any/Path/Number Converter等类指定,使用了默认转换器
可以自定义类型 URL 转换器和运算符 URL 转换器
自定义方法
实现一个类,继承自
BaseConverter。在自定义的类中,重写
regex,也就是这个变量的正则表达式。将自定义的类,映射到
app.url_map.converters上。
1 | from flask import Flask,url_for |
URL 重定向
重定向在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
- 永久性重定向:
http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问。 - 暂时性重定向:
http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
flask中有一个函数叫做redirect,可以重定向到指定的页面。
1 | from flask import Flask,request,redirect,url_for |
视图函数的响应
- 可以返回字符串:flask 会创建 werkzeug、wrappers、Response 对象,状态码 200,MIME 类型
test/html,然后返回 Response 对象
1 | from flask import Response |
还可以通过 make_response 进行创建
1 | form flask import make_response |
可以返回元组:元组的形式是(Response,Status,header)
不一定三个都要写,写两个也是可以的,status 返回 200,header 为列表或字典。返回的元组,其实在底层也是包装成了一个Response对象。return 'list',200,{'NAME':'kevin'}
1 |
|
- 直接返回合法的响应对象
1 | resp = Response('list') |
- 以上条件不满足,则进行自定义响应
继承自Response类。
实现方法force_type(cls,response,environ=None)。
指定app.response_class为你自定义的Response对象。
如果视图函数返回的数据,不是字符串,也不是元组,也不是 Response 对象,那么就会将返回值传给force_type,然后再将force_type的返回值返回给前端。
1 | class myResponse(Response): |
1 | # 使用jsonify将返回的格式转换成json格式 |