一.路由的基本定义

# 指定访问路径为 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. JS调用函数的两种方式

    <script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...

  2. HCTF2018-admin[条件竞争]

    附上网上师傅的wp  学习链接: https://www.jianshu.com/p/f92311564ad0 按照师傅的wp复现一下: 源代码审计,去看路由里的login函数和change函数都在没 ...

  3. JS高级---案例:验证用户输入的是不是中文名字

    案例:验证用户输入的是不是中文名字 [\u4e00-\u9fa5] <!DOCTYPE html> <html lang="en"> <head> ...

  4. 腾讯云OCR图片文字识别

    一. OCR OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别 ...

  5. AcWing 1022. 宠物小精灵之收服 二维费用背包

    #include<iostream> using namespace std ; ; int f[N][N]; int V1,V2,n; int main() { cin>>V ...

  6. Codeforces Round #601 (Div. 2) E1 Send Boxes to Alice (Easy Version)

    #include <bits/stdc++.h> using namespace std; typedef long long ll; ; int a[N]; int n; bool pr ...

  7. logging日志模块_python

    一.logging模块 1.功能 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设 ...

  8. energy/heating data source

    HeatManDataLake 1. schema: hfors tables ambient_temperature_emd record the ambient temperature hourl ...

  9. MonoBehaviour单例的另外一种省事的写法

    using UnityEngine; public class CommSystem: SingletonGeneric<CommSystem> { public static strin ...

  10. goland 2019.1.1破解

    https://blog.csdn.net/hi_liuxiansheng/article/details/89078405