Flask:路由系统;CBV的代码案例

参考链接: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')

 

原文地址:https://www.cnblogs.com/tfzz/p/11838692.html