flask --- 路由与视图函数
1、概述
路由是Model View Controller架构的Web框架中的相当重要的一个概念。路由就是在迷茫中找出一条路的意思。在Flack框架中,路由表示为用户请求的URL找出其对应的处理函数的意思。
2、路由简单讲解
在Flask应用中,路由是指用户请求的URL与试图函数之间的映射。Flask框架根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数的执行结果返回WSGI服务器。
路由表在Flask应用中处于相当核心的位置。路由表的内容是由应用开发者填充的。
route装饰器:可以使用Flask应用实例的route装饰器将一个URL规则绑定到一个视图函数上。
例如,下面的实例将URL规则/test绑定到视图函数test()上:
@app.route('/test')
def test():return 'this is response'
Flask框架就会调用我们的test()函数,其返回结果就传递给WSGI服务器发送给访问者。
add_url_rule():另一种等价的写法是使用Flask应用实例的add_url_rule()方法。下面的示例注册了一个与前例相同的路由:
def test():return 'this is response'
app.add_url_rule('/test',view_func=test)
其实,route装饰器内部也是通过调用add_url_rule()方法实现的路由注册。 但是显然,使用装饰器使代码看起来更优雅一些。
实验代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-from flask import Flask
app = Flask(__name__)@app.route('/')
def index():return '''<ur><li><a href="/test">test</a></li><li><a href="/friend">friend</a></li></ur>'''@app.route('/test')
def test():return 'this is response'@app.route('/friend')
def friend():return '<h1>My Friend List</h1>'app.run(host = '0.0.0.0', port = '8080')
3、为路由指定HTTP方法
默认情况下,Flask路由仅支持HTTP的GET请求。可以使用methods关键字参数,在注册 路由时显式地声明视图方法支持的HTTP方法。
例如,下面的示例将URL规则/auth绑定到视图函数v_auth(),这个路由仅支持POST方法:
@app.route('/auth', methods = ['POST'])
def v_auth(): pass
3.1 指定多种HTTP方法支持
关键字参数methods的类型为list,因此可以同时指定多种HTTP方法。
下面的示例中,使URL规则/user同时支持POST方法和GET方法:
@app.route('/user', methods = ['POST', 'GET'])
def v_users():if request.method == 'GET':return ... # 返回用户列表else:return ... # 创建新用户
这个特性使Flask非常易于开发REST架构的后台服务,而不仅仅局限于传统的动态网页。
实验代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-from flask import Flask
app = Flask(__name__)@app.route('/')
def index():return '''<form action="/auth" method="POST"><input type="text" name="uid"><input type="password" name="pwd"><input type="submit" value="submit"></form>'''
@app.route('/auth',methods=['POST'])
def v_auth():return '<h1>在这里做验证工作</h1>' app.run(host = '0.0.0.0', port = '8080')
内容来自于:
https://blog.csdn.net/m0_37519490/article/details/80608365
并且博客中的内容比我将的内容更加多一点。
Flask路由系统
通常有3种定义路由函数的方法:
- 使用flask.Flask.route() 修饰器。
- 使用flask.Flask.add_url_rule()函数。
- 直接访问基于werkzeug路由系统的flask.Flask.url_map
Part1
让我们从最常用@app.route()修饰器开始。
def route(self, rule, **options):def decorator(f):endpoint = options.pop('endpoint', None)self.add_url_rule(rule, endpoint, f, **options)return freturn decorator
可以看到修饰器是对add_url_rule函数的包装,当我们写如下代码时:
@app.route('/index.html')def index():return "Hello World!"
实际上上面的代码转换成:
def index():return "Hello World!"
index = app.route('/index.html')(index)
也就是,rule = '/index.html', options = { }, 执行decorator(index) 时会执行self.add_url_rule(rule, endpoint, f, **options):
@setupmethoddef add_url_rule(self, rule, endpoint=None, view_func=None, **options):if endpoint is None:endpoint = _endpoint_from_view_func(view_func)options['endpoint'] = endpointmethods = options.pop('methods', None)if methods is None:# View Function Options (视图函数选项)methods = getattr(view_func, 'methods', None) or ('GET',)if isinstance(methods, string_types):raise TypeError('Allowed methods have to be iterables of strings, ''for example: @app.route(..., methods=["POST"])')methods = set(item.upper() for item in methods)# View Function Options (视图函数选项)required_methods = set(getattr(view_func, 'required_methods', ()))# View Function Options (视图函数选项)provide_automatic_options = getattr(view_func,'provide_automatic_options', None)# View Function Options (视图函数选项)if provide_automatic_options is None:if 'OPTIONS' not in methods:provide_automatic_options = Truerequired_methods.add('OPTIONS')else:provide_automatic_options = False# View Function Options (视图函数选项)methods |= required_methods# url_rule_class默认为Werkzeug的Rule类,rule = self.url_rule_class(rule, methods=methods, **options)rule.provide_automatic_options = provide_automatic_optionsself.url_map.add(rule)# view_func 不能重复定义 if view_func is not None:old_func = self.view_functions.get(endpoint)if old_func is not None and old_func != view_func:raise AssertionError('View function mapping is overwriting an ''existing endpoint function: %s' % endpoint)self.view_functions[endpoint] = view_func
如果endpoint参数为None,那么:
def _endpoint_from_view_func(view_func):"""Internal helper that returns the default endpoint for a givenfunction. This always is the function name."""assert view_func is not None, 'expected view func if endpoint ' \'is not provided.'return view_func.__name__
endpoint就设置为view_func.name视图函数的名字。然后将endpoint添加到options字典中,对于methods = options.pop('methods', None),当我们指定时,@app.route('/login', methods=['GET', 'POST']),methods = ['GET', 'POST'] 否则methods = None. 如果methods == None, 同时,view_func 没有methods属性,则methods默认设置为('GET', ). 当然,methods不能设置为字符串类型,‘POST’可以不区分大小写。
关于View Function Options的代码暂时忽略。
add_url_rule执行完毕后,我们获得了Flask.url_map, 以及填充了Flask.view_functions.
我们可以做实验看看url_map里面都有啥,详见示例代码
其余部分,Flask路由系统
喜欢不喜欢都点个赞呗。谢谢了
flask --- 路由与视图函数相关推荐
- flask -- 路由与视图函数
原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...
- Flask框架(1.flask概述,Windows配置 virtualenv虚拟环境步骤和路由以及视图函数的定义)
框架: 软件框架,指的是为了实现某个业界标准或者完成特别基本任务的软件组件规范,也指为了实现某个软件组建规范时,提供规范所要求之基础功能的软件产品. 框架的功能类似于基础设施,提 ...
- Django基础---Web框架、URL路由、视图函数、模板系统
文章目录 Django基础 Django基础---Web框架 MVC和MTV框架 MVC MTV Django下载与安装 基于Django实现一个简单的示例 get请求获取数据 post请求获取数据 ...
- Flask框架——路由:URL规则与视图函数
1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的处理函数之 ...
- Web后端学习笔记 Flask(4)视图函数
Flask中的视图函数以及视图类: 添加视图函数还可以通过下面的方式add_url_rule进行: app.add_url_rule(rule, endpoint, view_func): rul ...
- python3 flask 路由
原文链接: python3 flask 路由 上一篇: Python3 requests 添加 cookie 下一篇: python 运行 linux 命令 from flask import Fla ...
- Django路由与视图
路由层 一.路由匹配规则: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数 url(r'login', views.login), 如果按上面的形 ...
- 测试开发——flask视图函数与路由 实战重点
开头必须分享一个我的志玲姐姐,太可了!点击此处 flask视图函数与路由的关系 一.视图函数与路由 实战重点 1.1 一个视图函数可以绑定多个URL地址 1.2 视图装饰器应该放到最外层 1.3所实现 ...
- 用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 视图函数 在 views.py 文件中定义视图函数 定义右侧边栏的视图 ...
最新文章
- 新勒索软件DynA-Crypt不仅要加密你的文件,而且窃取并删除它们
- 2015 百度之星 1003 棋盘占领 dfs
- 【正一专栏】如果世界杯上没有了意大利
- Vue 过渡实现轮播图
- ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些
- JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)
- MySQL 高水位update_Oracle delete 高水位线处理问题
- start()和run()的区别
- 丁磊:阿里网易员工很多是夫妻
- Linux常用的基本命令10
- hive中创建表失败
- 事态升级是什么意思_为什么有的人越到关键时刻越容易掉链子?记住不要有“赌徒心理”...
- ios 解压下载数据包(zip)
- 拓端tecdat|R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
- 第一台计算机 采用工 作原理,第1讲计算机工作原理模版课件.ppt
- preg_match 参数获取两个_摄像相机标定到底是啥?标定完成得到的参数有什么用?...
- Eps总结(1)——Eps入门级基本操作:新建工程、加载数据、新建对象、输入输出对象、基本操作
- 上海海洋大学计算机专硕调剂,2019年上海海洋大学硕士研究生调剂政策和规则...
- 了解软件工程与计算机科学的联系与区别
- linux 查看mapper 路径,Linux系统/dev/mapper目录