参考链接:https://www.cnblogs.com/xiaoyuanqujing/articles/11715484.html#_label5
一.路由使用
1.# 最简单使用 @app.route('路由地址') # 示例 from flask import Flask app=Flask(__name__) @app.route('/') def index(): return "ok" if __name__ == '__main__': app.run()
2.#其他使用方式 @app.route('地址<类型:参数名>',methods=['请求方式1','请求方式2',..],endpoint='别名') app.add_url_rule('地址<类型:参数名>',view_func=函数名,endpoint="别名",methods=['请求方式1','请求方式2',..]) # 示例 # @app.route('/login',methods=['POST',"GET"],endpoint="sb") def login(nid): print(type(nid),nid) return "ojbk_login" #1.rule --->就是路由 #2.enpoint,取别名,如果没有就用当前函数名,不能重复
#3.defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'} 为函数提供参数
示例:
@app.route('/',defaults = {"name":18})
def hello_world(name):
print(name)
return 'Hello World!'
#4.methods=["POST","GET"] #5.view_func 就我们endpoint,指向的函数,也就请求该路由的时候,要响应函数 app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])
二 .路由带参和转换器(类似于django有名分组)
1.第一种方式:(默认参数为字符串类型)
# 第一种传参方式 @app.route('地址<参数名>')
def 函数名(参数名):
pass # 示例 @app.route('/student_list/<student_id>/') def student_list(student_id): return '学生{}号的信息'.format(student_id)
2.第二种方式:加过滤条件(转换器)
# 过滤条件 @app.route('路由地址<数据类型:参数名>')
def 函数名(参数名):
pass # 示例 @app.route('/student_list/<int:student_id>/') def article_detail(student_id): return '学生{}号的信息'.format(student_id)
2.1.注意有以下几种转换器(过滤太监)
1.主要有这几种类型过滤: string: 默认的数据类型,接收没有任何斜杠" /"的字符串 int: 整型 float: 浮点型 path: 和string类型相似,但是接受斜杠,如:可以接受参数/aa/bb/cc/多条放在一起 uuid: 只接受uuid格式的字符串字符串,
any:接收任意类型 ✔提示:uuid为全宇宙唯一的串 2.函数的参数一定要带有参数名
默认转换器
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
2.3.自定义正则转换器
flask路由不支持正则匹配所以要自定义,但是正则用的很少如需要使用正则可以直接使用"any”转换器
1.代码逻辑思路:
#1导入模块:from werkzeug.routing import BaseConverter #2.自定义类继承BaseConverter,然后实现__inti__, def to_python(self, value):to_url(self, value)方法 #3.添加自定义类: app.url_map.converters['任意名'] = 自定义类名 #4.路由使用:@app.route('/index/<regex1("正则表达式"):nid>'),regex1='谁便,regex1("正则表达式") 注意: #1.to_python:接收到regex1("正则表达式")匹配出来的结果,处理后返回给是函数,一定要return #2.to_url:接收到反向解析的的参数,处理后return的结果才是我们拼接到我们路由上
2.2.具体代码示例:此示例只能匹配整型
from flask import Flask,url_for app = Flask(__name__) # 1.导入正则模块 from werkzeug.routing import BaseConverter # 2.自定义继承BaseConverter class RegexConverter(BaseConverter): """ 自定义URL匹配正则表达式 """ def __init__(self, map, regex): super(RegexConverter, self).__init__(map) self.regex = regex def to_python(self, value): """ 1.value :路由匹配时,正则表达式匹配到的值 2.也可在此写别的逻辑处理value并返回 3.return返回值:会被视图函数接收 """ print(value) return int(value) def to_url(self, value): """ 1.value:,url_fo反向解析时,传递的动态参数值 2.return返回值:生成URL中的参数 """ print(value) val = super(RegexConverter, self).to_url(value) return val # 3.添加自定义类:app.url_map.converters['任意名'] = 自定义类 app.url_map.converters['regex'] = RegexConverter # 4.使用:@app.route('/index/<任意名("正则表达式"):nid>') @app.route('/index/<regex("d+"):nid>') def index(nid): print(nid) print(url_for('index', nid='888')) return 'Index' if __name__ == '__main__': app.run()
三.路由的严格模式
链接:https://www.cnblogs.com/xiaoyuanqujing/articles/11644016.html#_label0
1.路由严格模式设置
1.是否严格模式:对URL最后的 / 符号是否严格要求 strict_slashes = None ''' @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 ''' 2.#重定向到指定地址 redirect_to = 路由地址, ''' @app.route('/index/<int:nid>', redirect_to='/home/<nid>') '''
四 .路由反向解析
作用:url_for利用函数的别名获取对用的路由地址
1.获取没有传参的路由:url_for(别名)
from flask import Flask,url_for
app = Flask(__name__)
def login(name): print(name,type(name)) return name app.add_url_rule('/login/',methods=['POST','GET'],view_func=login,endpoint='sb') def index(): real_url=url_for('sb') return real_url app.add_url_rule('/index/',view_func=index,methods=['POST',"GET"]) if __name__ == '__main__': app.run()
2.获取传参的路由:url_for(别名,别名=值)
如果想获取动态路由,必须以关键字实参的形式为动态的path部分赋值,注意动态的path部分必须被赋值, @app.route('/demo2/') def demo2(): student_url = url_for('student', id=5, name='mark') # id 就是动态path的key 必须赋值name 将作为查询字符串传入 print(student_url) # /student/5/?name=mark return student_url
@app.route('/student/<int:id>/') def student(id): return 'student {}'.format(id)
五.CBV
from flask import Flask, views, request, url_for from functools import wraps def login_verify(func): @wraps(func) def wrapper(*args, **kwargs): user_name = request.args.get('user') password = request.args.get('password') if user_name == 'mark' and password == '123': return func(*args,**kwargs) else: return '请登录' return wrapper class CBVTest(views.MethodView): methods = ['GET','POST'] # 指定可以接收的方法有什么,也可以这行代码不写 decorators = [login_verify,] # 指定自定义的装饰器 def get(self): print(url_for('cbvtest')) return 'cbv_get' def post(self): return 'cbv_post' app.add_url_rule('/cbvtest',view_func=CBVTest.as_view(name='cbvtest'),endpoint='end_demo')