Flask 学习之 路由
一.路由的基本定义
# 指定访问路径为 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 学习之 路由的更多相关文章
- Flask 学习(二)路由
Flask 路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” from flask imp ...
- Flask 学习目录
Flask 学习目录 Flask 的学习过程是一个了解如何从单个模块搭建一个 Web 框架的过程. Python.Flask 的安装和设置 简单的 Hello World 程序 使用 Jinjia2 ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- Flask 学习(三)模板
Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...
- Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)
一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...
- [ZHUAN]Flask学习记录之Flask-SQLAlchemy
From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...
- 【Flask】Flask学习笔记(一) 应用基本结构
初始化 使用前必须创建一个应用实例 from flask import Flask app = Flask(__name__) 路由和视图函数 请求流程 客户端(web浏览器)--> web服 ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Flask学习-Wsgiref库
一.前言 前面在Flask学习-Flask基础之WSGI中提到了WerkZeug,我们知道,WerkZeug是一个支持WSGI协议的Server,其实还有很多其他支持WSGI协议的Server.htt ...
随机推荐
- vue 中的路由为什么 采用 hash 路由模式,而不是href超链接模式(Hypertext,Reference)?
1. vue中路由模式的种类有两种 1. 一种是 hash 模式. 2. 一种是 h5 的 history 模式. 2. hash 和 history 都是来自 bom 对象 bom 来自 windo ...
- python:文件、目录遍历器
#!/usr/bin/python# -*- coding:utf-8 -*- import osimport json file = open('a.txt','w')for root,dirs,f ...
- 编码 - 调整 gitbash 文本字符集
概述 gitbash 设置 文本字符集 背景 最近被 编码 的事情搞得乱七八糟 有点没头绪, 所以碰到 编码相关 的东西, 都想看上一看 环境 os win10.1903 git 2.20.1 1. ...
- Art Union
A well-known art union called "Kalevich is Alive!" manufactures objects d'art (pictures). ...
- vs2015编译各种库
1.编译libcurl https://www.jianshu.com/p/f82d3d18da93
- BeautifulSoup的基本使用
一.将一段文档传入BeautifulSoup的构造方法,得到一个文档的对象: from bs4 import BeautifulSoup Soup = BeautifulSoup(html_doc) ...
- HDU 6740 kmp最小循环节
题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...
- Codeforces Round #619 (Div. 2)C(构造,容斥)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; int main(){ ios::syn ...
- CentOS7网络配置:静态IP和DHCP
1.打开并编辑网络配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost network-scripts]# vim ifcfg ...
- 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 ...