一.路由的基本定义

# 指定访问路径为 demo1

@app.route('/demo1')

def demo1():

return 'demo1'

二.常用路由设置方式

@app.route('/user/<username>')   #常用的   不加参数的时候默认是字符串形式的

@app.route('/post/<int:post_id>')  #常用的   #指定int,说明是整型的

@app.route('/post/<float:post_id>')

@app.route('/post/<path:path>')

@app.route('/login', methods=['GET', 'POST'])

三.路由可以设置传递参数, 2种方式

1.一种为路由传递参数[没有限定类型]

2.路由传递参数[限定数据类型]

以下为相应的例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz" from flask import Flask app = Flask(__name__) # 加载项目配置
# 配置类
class Config(object):
DEBUG = True app.config.from_object(Config) # 路由传递参数[没有限定类型]
@app.route('/user/<user_id>')
def user_info_1(user_id):
return 'hello info_1 %s' % user_id # 路由传递参数[限定数据类型],列子是用了int类型,可以选择bool,float都可以的
# user_id 必须是整数
@app.route('/user/<int:user_id>')
def user_info_2(user_id):
return 'hello info_2 %d' % user_id if __name__ == '__main__':
app.run(host='127.0.0.1', port=9000)
"""
测试说明:
测试1:
http://127.0.0.1:9000/user/qwer
这样的情况是访问了函数1的url,因为qwerb不为整数,所以路由到没有限定类型处
测试2:
http://127.0.0.1:9000/user/2
这样的情况下会选择有限定类型的路由
测试3:
注释限定的,让后使用如下url测试:
http://127.0.0.1:9000/user/2
这样会走无限定的路由
"""

四.路由之url_for()函数

1.给指定的函数构造URL

#例1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz" from flask import Flask, url_for
from flask import redirect app = Flask(__name__) @app.route('/index') # endpoint是别名
def home():
"""
url_for是个函数接受视图函数的名字(字符串形式)作为参数,返回视图函数对应的url
通过url_for home 来获取前端输入的url是什么
:return:
"""
v = url_for("home")
print(v)
return "index" # url_for() 使用endpoint ,通过反向机制构建URL路径 
@app.route('/index/<int:nid>', endpoint="aaa") # endpoint是别名
def zzz(nid):
"""
这边使用了别名,将zzz函数别名为aaa
所以url_for 对的是aaa
:param nid:
:return:
"""
v = url_for("aaa", nid=nid)
print(v)
return "index2" if __name__ == '__main__':
app.run(host='127.0.0.1', port=9000)

2.访问静态文件(CSS / JavaScript 等)

只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。

url_for('static', filename='style.css')

这个文件应该存储在文件系统上的 static/style.css

五.路由的正则匹配方式

1.自定义转换器实现

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

(1)导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录

(2)自定义转换器:自定义类继承于转换器基类

(3)添加转换器到默认的转换器字典中

(4)使用自定义转换器实现自定义匹配规则

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz" # 下面编写一个自定义路由转换器 from flask import Flask app = Flask(__name__) # 导入转换器基类
from werkzeug.routing import BaseConverter class MobileNumberConverter(BaseConverter):
"""
手机号码的自定义路由转换器
"""
regex = "\d{11}" # 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters['mobile'] = MobileNumberConverter # 使用转换器去实现自定义匹配规则
@app.route(r"/sms/<mobile:mobile_number>/") # mobile_number就是测试的电话号码
def sms(mobile_number):
"""
通过以下url访问:
http://127.0.0.1:9000/sms/13666666666/
:param mobile_number:
:return:
"""
print(mobile_number)
return "手机号通过,短信" # 例2
class RegexConverter(BaseConverter):
"""正在路由转换器""" def __init__(self, url_map, *args):
# super().__init__(url_map) # 或者这样写
# url_map 所有url组成的元组
super(RegexConverter, self).__init__(url_map) # 初始化分类
self.regex = args[0] # 是一个元组 app.url_map.converters['reg'] = RegexConverter # \w 表示大写字母小写字母下划线
@app.route(r"/register/<reg('\w{4,6}'):username>/")
def reg(username): # 这个函数名没有限制
"""
通过以下url访问:
http://127.0.0.1:9000/register/qwer/
:param username:
:return:
"""
print(username)
return "ok reg" if __name__ == "__main__":
app.run(host='0.0.0.0', port=9000)

2.系统自带转换器

在werkzeug.routing.py源文件中

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

以上类型都是系统自带的。

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

Flask 学习之 路由的更多相关文章

  1. Flask 学习(二)路由

    Flask  路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” from flask imp ...

  2. Flask 学习目录

    Flask 学习目录 Flask 的学习过程是一个了解如何从单个模块搭建一个 Web 框架的过程. Python.Flask 的安装和设置 简单的 Hello World 程序 使用 Jinjia2 ...

  3. Python Flask学习笔记之Hello World

    Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...

  4. Flask 学习(三)模板

    Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...

  5. Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)

    一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...

  6. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  7. 【Flask】Flask学习笔记(一) 应用基本结构

    初始化 使用前必须创建一个应用实例 from flask import Flask app = Flask(__name__) 路由和视图函数 请求流程 客户端(web浏览器)-->  web服 ...

  8. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  9. Flask学习-Wsgiref库

    一.前言 前面在Flask学习-Flask基础之WSGI中提到了WerkZeug,我们知道,WerkZeug是一个支持WSGI协议的Server,其实还有很多其他支持WSGI协议的Server.htt ...

随机推荐

  1. vue 中的路由为什么 采用 hash 路由模式,而不是href超链接模式(Hypertext,Reference)?

    1. vue中路由模式的种类有两种 1. 一种是 hash 模式. 2. 一种是 h5 的 history 模式. 2. hash 和 history 都是来自 bom 对象 bom 来自 windo ...

  2. python:文件、目录遍历器

    #!/usr/bin/python# -*- coding:utf-8 -*- import osimport json file = open('a.txt','w')for root,dirs,f ...

  3. 编码 - 调整 gitbash 文本字符集

    概述 gitbash 设置 文本字符集 背景 最近被 编码 的事情搞得乱七八糟 有点没头绪, 所以碰到 编码相关 的东西, 都想看上一看 环境 os win10.1903 git 2.20.1 1. ...

  4. Art Union

    A well-known art union called "Kalevich is Alive!" manufactures objects d'art (pictures). ...

  5. vs2015编译各种库

    1.编译libcurl https://www.jianshu.com/p/f82d3d18da93

  6. BeautifulSoup的基本使用

    一.将一段文档传入BeautifulSoup的构造方法,得到一个文档的对象: from bs4 import BeautifulSoup Soup = BeautifulSoup(html_doc) ...

  7. HDU 6740 kmp最小循环节

    题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...

  8. Codeforces Round #619 (Div. 2)C(构造,容斥)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; int main(){ ios::syn ...

  9. CentOS7网络配置:静态IP和DHCP

    1.打开并编辑网络配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost network-scripts]# vim ifcfg ...

  10. LED Magic Light - How Does The LED Light Change Color?

    The    LED Magic Light    states that the color-changing LED is not an LED in the package, but three ...