引言

本文重点介绍,Flask路由分发及访问静态资源。

路由分发

app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的视图函数(View Function) 进行处理。视图函数名字可以与 url 不同。route 装饰器内部会调用add_url_route() 方法实现路由注册。

"""
Author: hui
Desc: { Flask 路由分发 }
"""
from flask import Flask, url_for, redirect"""
# 创建flask的应用对象
# __name__表示当前的模块名字
"""
app = Flask(__name__)@app.route("/hello")
def welcome():return "hello flask"@app.route("/index")
def index():return "index page"if __name__ == "__main__":app.run()

给路由指定访问方式

通过 methods 限定访问方式, 接受参数形式为列表

# post
@app.route("/post_only", methods=["POST"])
def post_only():return "post only page"# get
@app.route("/get_only", methods=["GET"])
def get_only():return "get only page"# post or get
@app.route("/test", methods=["GET", "POST"])
def test():return "post | get  page"

多个路由绑定同一视图函数

@app.route("/hi1")
@app.route("/hi2")
def hi():return "hi page"

访问这两个/hi1/hi2路径显示的效果都是 hi page

url_for()和redirect()

使用 url_for() 的函数,可以通过 视图函数的名字 找到视图对应的 url 路径

redirect() 函数则是 url 重定向,会再次发送一个新的请求。

flask 库中导入这两个函数,一般这两个函数会一起使用。

from flask import Flask, url_for, redirectapp = Flask(__name__)# app.route装饰器的作用是将路由映射到视图函数
@app.route("/hello")
def welcome():return "hello flask"@app.route("/")
def index():return "index page" @app.route("/login")
def login():# url = "/hello"# 使用url_for的函数,通过视图函数的名字找到视图对应的url路径url = url_for("welcome")print(url)return redirect(url)@app.route("/register")
def register():url = "/"# url = url_for("index")return redirect(url)if __name__ == "__main__":app.run()
url_for('welcome') 等同于 /hello
url_for('index') 等同于 /

在测试功能前,首先在浏览器中,右击鼠标选择检查或 F12 打开浏览器调试工具。进入 NetWork 选项。

然后在网址栏上分别输入 http://127.0.0.1:5000/loginhttp://127.0.0.1:5000/register

这里就展示访问 /login 的效果,可以发现直接跳转到了 /hello 。这就是 重定向,发送了两次请求。

然后再看看 PyCharm 运行 Flask 程序的信息。

127.0.0.1 - - [25/Apr/2021 15:09:34] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2021 15:18:25] "GET /login HTTP/1.1" 302 -
/hello
127.0.0.1 - - [25/Apr/2021 15:18:25] "GET /hello HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2021 15:29:05] "GET /register HTTP/1.1" 302 -
127.0.0.1 - - [25/Apr/2021 15:29:05] "GET / HTTP/1.1" 200 -

切记url_for() 接收的是 视图函数的名称,返回的是对应的 url 路径,切勿把 url 路径传进去。

查看全部路由信息

通过 app.url_map 可以查看所有路由信息

"""
Author: hui
Desc: { Flask 路由分发及静态资源访问 }
"""
from flask import Flask, url_for, redirectapp = Flask(__name__)# app.route装饰器的作用是将路由映射到视图函数
@app.route("/hello")
def welcome():return "hello flask"@app.route("/")
def index():# 通过url_map可以查看整个flask中的路由信息print(app.url_map)return "index page"# 其他视图函数省略...if __name__ == "__main__":app.run()

访问首页打印如下结果

Map([<Rule '/post_only' (OPTIONS, POST) -> post_only>,<Rule '/get_only' (OPTIONS, HEAD, GET) -> get_only>,<Rule '/register' (OPTIONS, HEAD, GET) -> register>,<Rule '/hello' (OPTIONS, HEAD, GET) -> welcome>,<Rule '/login' (OPTIONS, HEAD, GET) -> login>,<Rule '/test' (OPTIONS, HEAD, POST, GET) -> test>,<Rule '/hi2' (OPTIONS, HEAD, GET) -> hi>,<Rule '/hi1' (OPTIONS, HEAD, GET) -> hi>,<Rule '/' (OPTIONS, HEAD, GET) -> index>])

路由转换器

有时我们需要将同一类URL映射到同一个视图函数处理

比如:使用同一个视图函数 来显示不同用户的个人信息。

Flask内置转换器

字符串转换器

"""
@Author: Hui
@Desc: { flask框架的转换器练习 }
"""
from flask import Flaskapp = Flask(__name__)# str转换器 不加转换器类型, 默认是普通字符串规则(除了/的字符)
@app.route('/user/<username>')
def user_str(username):response = 'hello {}'.format(username)return responseif __name__ == '__main__':app.run()

注意:视图函数里接受的参数必须和 route 捕获尖括号 <> 里的参数一致。

整型转换器

# int转换器
@app.route('/user/<int:user_id>')
def user_int(user_id):response = 'hello {}'.format(user_id)return response

路径转换器

# path转换器
@app.route('/user/<path:user>')
def user_path(user):response = 'hello {}'.format(user)return response

自定义转换器

自定义一个匹配正则 url 的转换器

首先导入 werkzeug.routingBaseConverter

from werkzeug.routing import BaseConverter

然后自定义类继承 BaseConverter

from flask import Flask, url_for, redirect
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义正则转换器
class RegexConverter(BaseConverter):"""url正则匹配转换器"""def __init__(self, url_map, regex):super().__init__(url_map)self.regex = regexapp.url_map.converters['re'] = RegexConverter# 匹配手机号码的正则
MobileRegex = "'0?(13|14|15|17|18)[0-9]{9}'"# 使用自定义的转换器
@app.route(f"/call/<re({MobileRegex}):tel>")
def call_tel(tel):response = 'tel: {}'.format(tel)return responseif __name__ == "__main__":app.run()

重写to_python()、to_url()方法

to_python() 用于处理转换器提取出来的参数,可以进行修改。

to_url() 使用 url_for() 时调用,其结果将作为 url_for的返回值

# 自定义正则转换器
class RegexConverter(BaseConverter):"""url正则匹配转换器"""def __init__(self, url_map, regex):super().__init__(url_map)self.regex = regexdef to_python(self, value):print("to_python() called...")print(f"value, {value}")# value是在路径进行正则表达式匹配的时候提取的参数# 留了一步处理提取出来参数# 这里返回值是最终解析的结果return 'tel update 110'# return valuedef to_url(self, value):"""使用 url_for() 时调用"""# 可以改变 url_for() 处理的结果print("to_url() called...")print(f"value, {value}")return "15811111111"# return valueapp.url_map.converters['re'] = RegexConverter# 匹配手机号码的正则
MobileRegex = "'0?(13|14|15|17|18)[0-9]{9}'"# 使用自定义的转换器
@app.route(f"/call/<re({MobileRegex}):tel>")
def call_tel(tel):response = 'tel: {}'.format(tel)return response@app.route("/call")
def call():url = url_for('call_tel', tel='13577881658')print(f'url -> {url}')return redirect(url)

一般都无需重写,使用父类的就行。等有需求时在使用。

源代码

源代码已上传到 Gitee HuiDBK/FlaskBasic - 码云 - 开源中国 (gitee.com),欢迎大家来访。

✍ 码字不易,请多多关照。

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

Flask路由分发及转换器相关推荐

  1. python3 flask 路由

    原文链接: python3 flask 路由 上一篇: Python3 requests 添加 cookie 下一篇: python 运行 linux 命令 from flask import Fla ...

  2. flask -- 路由与视图函数

    原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...

  3. Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)

    阅读目录 一.路由层:(Django的路由系统) 二.伪静态网页和虚拟环境: 三.FBV与CBV.JsonResponse.文件上传 一.路由层:(Django的路由系统) URL配置(Django项 ...

  4. django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...

    https://www.zhihu.com/video/1249117508688711680 每日测验 """ 今日考题 1.列举你知道的orm数据的增删改查方法 2. ...

  5. Django05-2:路由分发/命名空间/伪静态/虚拟环境/django版本区别

    路由分发 补充:每一个应用可以有独立的templates模板文件夹,static静态文件加,urls.py 总路由 #方法一from app01 import urls as app01_urls f ...

  6. djang urls.py 无名有名分组,反向解析,路由分发,名称空间,伪静态,虚拟环境,django版本...

    路由层 路由匹配:APPEND_SLASH = False , 取消自动补全 , settings.py 中添加字段即可 若url尾部为书写/ , django内部会自动补全 urls.py 中 对应 ...

  7. Flask 路由、请求、会话

    准备 每日一问: flask里面加载配置的方法有几种 5种 from_mappig from_object from_json from_envval from_pyfile @app.route() ...

  8. 深入理解Flask路由(2)- werkzeug 路由系统

    本系列共三篇文章: 深入理解Flask路由的实现机制 深入理解Flask路由(2)- werkzeug 路由系统 深入理解Flask路由 (3) - 动态 url 及转换器 上一篇我们说到:Flask ...

  9. Django 路由分发

    Django 路由分发 当一个url请求过来之后 1.先到项目主目录下的urls内. 2.由这个url做处理分发给其他app内的urls. 一级路由:主目录urls内引入include from dj ...

最新文章

  1. 计算机搞定44年几何难题,原来这2个人25年前猜对了
  2. AngularJS学习篇(十)
  3. java 64进制转10进制_java进制转换
  4. JavaScript之childNodes属性、nodeType属性学习
  5. c语言5v电源电路工作原理,稳压电源电路图详解_5v稳压电源电路原理图
  6. 用excel打开文本内容
  7. Oracle笔记:用户、权限及exp/imp数据
  8. 【全军覆没】麻省理工把中国学生拉入黑名单,斯坦福取消中国大陆面试! 这是怎么了?...
  9. 春节假期前5天全国快递处理量达3.65亿件 同比增长224%
  10. TCP/IP:SCTP报文格式
  11. 基于cxf框架javaweb服务说明
  12. Linux调优/优化
  13. nvidia driver 驱动重装教程
  14. 学习笔记之Python的六种内置对象
  15. python圣诞节快乐_圣诞节快乐,利用Python给自己的微信头像添加一个圣诞帽
  16. 操作系统实验二:银行家算法
  17. thinkphp6 websocket-room的加入房间+离开房间+房间消息发送
  18. 北洋网络口打印机设置
  19. 关于子网划分、子网聚合(超网)的研究
  20. 乐视云盘停止视频上传 清查色情盗版信息

热门文章

  1. android unity页面关闭报错,Unity3d报错解决方案
  2. 灰度共生矩阵-python
  3. Discuz如何开发移动端访客功能
  4. sql查询连续3天有交易记录的客户
  5. CNN是如何进行图像特征提取的
  6. 智障的wordpress更换主题之旅
  7. CSS【进阶】线性径向渐变background-image:linear-gradient();background-image:radial-gradient();
  8. 便捷效率处理CAD转PDF方法你知道吗?
  9. 陳三甲网络笔记:赚钱这件事,你别搞复杂了,简单点
  10. 成都艾司博讯电商:拼多多店铺类目选错如何退店?