Flask的路由系统

本质:带参数的装饰器传递函数后 执行 add_url_rule 方法将 函数 和 url 封装到一个 Rule对象将Rule对象 添加到 app.url_map(Map对象)

注意:装饰器要放在路由的上方 -- 注意装饰器的执行顺序

1 路由格式以及参数

@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST'])本质: app.add_url_rule(rule 路由, endpoint 别名, f 视图函数, **options 参数)

常用路由系统有以上五种,所有的路由系统都是基于一下对应关系来处理:

DEFAULT_CONVERTERS = {'default':          UnicodeConverter,'string':           UnicodeConverter,'any':              AnyConverter,'path':             PathConverter,'int':              IntegerConverter,'float':            FloatConverter,'uuid':             UUIDConverter,
}

app.route和app.add_url_rule参数详细:

rule,                     URL规则view_func,                视图函数名称   #CBV 使用  view_func=IndexView.as_view(name='...')defaults=None,           默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数endpoint=None,        名称,用于反向生成URL,即: url_for('名称')methods=None,         允许的请求方式,如:["GET","POST"]

strict_slashes=None, 对URL最后的 / 符号是否严格要求
如:

        @app.route('/index',strict_slashes=False),访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可@app.route('/index',strict_slashes=True)仅访问 http://www.xx.com/index 

redirect_to=None, 重定向到指定地址

                                如:@app.route('/index/<int:nid>', redirect_to='/home/<nid>')或def func(adapter, nid):return "/home/888"@app.route('/index/<int:nid>', redirect_to=func)

subdomain=None, 子域名访问

    公网上线时租域名                       aaa.com/net租用服务器 + 公网IP           213.213.21访问 域名 -->> (域名解析)ip测试时 修改hostshosts文件127.0.0.1:8000 www.aaa.com127.0.0.1:8000 www.admin.aaa.com127.0.0.1:8000 www.username.aaa.com使用子域名from flask import Flask, views, url_forapp = Flask(import_name=__name__)app.config['SERVER_NAME'] = 'www.aaa.com:5000'  # 配置主域名@app.route("/", subdomain="admin")              # 子域名   admin.aaa.comdef static_index():return "static.your-domain.tld"@app.route("/dynamic", subdomain="<username>")  # 传参--字符串  username.aaa.com/dynamicdef username_index(username):return username + ".your-domain.tld"if __name__ == '__main__':app.run()

2 url_for 与 endpoint

url反向生成

无参数app.route('/login',method=['GET','POST'],endpoint='login')视图return redirect(url_for('login'))模板<form action='{{url_for("login")}}'></form>有参数app.route('/index/<int:nid>',method=['GET','POST'],endpoint='index')视图return redirect(url_for('index',nid=111))模板<form action='{{url_for("index",nid=111)}}'></form>

3 让路由支持正则

from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter  # 导入基础转换类app = Flask(import_name=__name__)# 正则表达式类
class RegexConverter(BaseConverter):"""自定义URL匹配正则表达式"""def __init__(self, map, regex):super(RegexConverter, self).__init__(map)self.regex = regexdef to_python(self, value):"""路由匹配时,匹配成功后传递给视图函数中参数的值:param value: :return: """return int(value)def to_url(self, value):"""使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数:param value: :return: """val = super(RegexConverter, self).to_url(value)return valapp.url_map.converters['regex'] = RegexConverter # 添加到flask中@app.route('/index/<regex("\d+"):nid>')   # 使用
def index(nid):print(url_for('index', nid='888'))return 'Index'if __name__ == '__main__':app.run()

4 Flask 的FBV与CBV

不常使用

from flask import Flask,views,redirect,url_for  # 导入views 基础类app = Flask(__name__)# 定义装饰器
def auth_decorator(func):def inner(*args,**kwargs):print('装饰器')return func(*args,**kwargs)return innerCBV 添加 装饰器 和 指定 请求方法
class IndexView(views.MethodView):methods = ['POST','GET']      # 指定允许的 请求方法decorators = [auth_decorator] # 所有方法都加上 装饰器def get(self):return redirect(url_for('home'))def post(self):return 'POST'class HomeView(views.MethodView):def get(self):return 'Home'app.add_url_rule('/index',view_func=IndexView.as_view(name='index'))
app.add_url_rule('/home',view_func=HomeView.as_view(name='home'))# CBV 只能通过这种方式 # view_func = IndexView.as_view(name='index') # 指定 反向解析的nameif __name__ == '__main__':app.run()

转载于:https://www.cnblogs.com/big-handsome-guy/p/8539096.html

Flask 的路由系统 FBV 与 CBV相关推荐

  1. Flask中路由系统以及蓝图的使用

    一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...

  2. Flask入门(4):CBV和FBV

    目录 4.CBV和FBV 4.1 继承 views.View 4.2 继承 views.MethodView 4.CBV和FBV 前面的例子中,都是基于视图函数构建视图(FBV),和Django一样, ...

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

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

  4. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统1. 创建app2. 路由的分组3. 路由的分发- 正则表达式匹配b. django的orm(模型model)1. 创建模型的步骤2. orm基本的增删改查3. 正向查询和 ...

  5. django之视图系统 views.py--主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)...

    django之视图系统 views.py-->主要内容(FBV和CBV.dispath.request对象和request.FILES.JsonResponse) 一个视图函数(类),简称视图, ...

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

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

  7. day64 url用法以及django的路由系统

    此篇博客是以备后查的,用到的时候记得过来查找即可! 路由系统:就是我们的django项目创建的时候自带的那个urls.py 它本身里面是映射的对应关系,一个大的列表里面,一个个元祖,元祖里面是url或 ...

  8. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  9. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post ...

  10. python flask 路由_python框架之Flask(2)-路由和视图Session

    路由和视图 这一波主要是通过看源码加深对 Flask 中路由和视图的了解,可以先回顾一下装饰器的知识:[装饰器函数与进阶] 路由设置的两种方式 #示例代码 from flask importFlask ...

最新文章

  1. 你还在这样学习Python吗?真的不可以
  2. 2G---5G与未来天线技术
  3. python 类-python 类如何使用
  4. sql存储过程的创建
  5. Android Stdio 里的 SQLite数据库 刷新和保存
  6. Swagger-概述
  7. LiveVideoStack Meet回归北京站:未来会更卷吧?
  8. php读取csv指定行_PHP快速读取CSV大文件指定行
  9. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
  10. .Net转Java自学之路—基础巩固篇二十(Lambda)
  11. Java基础(七)——文件、IO流
  12. 编程的一些经历和感想
  13. Windows 7 God Mode
  14. s深度linux没有ll等命令的解决办法
  15. 网页特效——花间飞舞的蝴蝶
  16. python sorted排序原理_python的sorted排序详解
  17. 7 年 Python 的我,总结了这 90 条写 Python 程序的建议
  18. java实现日历打印
  19. 【渝粤教育】电大中专电商运营实操 (4)作业 题库
  20. Django 编写您的第一个Django应用

热门文章

  1. 水面反光如何拍摄_如何抓拍水的不同瞬间
  2. WINDOWS 服务端 SVN自动部署/一键批处理 SVN 更新项目
  3. Android 控件 之 菜单(Menu)
  4. 阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
  5. 对GUID的一点探讨
  6. 跨站脚本攻击(反射型xss)笔记(一)
  7. Linux篇---Grep和正则匹配
  8. 最小化安装CentOS-7-x86_64-Minimal-1511图文教程
  9. nginx root alias 文件路径配置
  10. Centos7系统中安装JDK、Tomcat、Mysql