Flask - 路由系统

本文深入探讨了Flask框架的路由系统,包括基本使用、add_url_rule的装饰器本质分析、CBV(Class-Based Views)的两种实现方式以及如何基于BaseConverter实现正则规则。详细介绍了rule、view_func、endpoint等关键参数,并提供了错误处理和实例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、基本使用

1-1 默认转换器

二、add_url_rule - 装饰器本质分析及使用

2-1 route装饰器 源码分析

2-1-1 add_url_rule使用效果测试

2-2 基于add_url_rule的CBV使用方式

2-2-1 方式一、继承view.View类

2-2-2 方式二、继承 views.MethodView 类 - 常用方式

2-3  app.add_url_rule参数

 三、 路由的正则支持 - 基于BaseConverter实现正则规则


一、基本使用

@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')

1-1 默认转换器

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

二、add_url_rule - 装饰器本质分析及使用

2-1 route装饰器 源码分析

route的装饰器本质是 add_url_rule 函数的使用

@app.route("/login", methods=['GET',"POST"],endpoint='loginname') 
def login():
    return '登录'

# 效果同上装饰器的使用
app.add_url_rule('/login', 'loginname', login, methods=['GET',"POST"])
'''
def add_url_rule(self, rule, endpoint=None, view_func=None,
                     provide_automatic_options=None, **options):
'''

2-1-1 add_url_rule使用效果测试

from flask import Flask, request, render_template, redirect, session, url_for

app = Flask(__name__)
app.debug = True
app.secret_key = 'test'
# 模拟数据库内信息
USER_LIST = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}

from functools import wraps


def login_decorator(func, ):
    # @wraps(func)
    def wrapper(*args, **kwargs):
        if 'user' in session:
            res = func(*args, **kwargs)
            return res
        return redirect('/login')

    return wrapper


@app.route('/')
@login_decorator
def index():
    return 'ok'


# @app.route('/login', methods=['GET', 'POST'],endpoint=loginname)
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        # 取出表单提交的name数据
        name = request.form.get('name')
        pwd = request.form.get('pwd')
        if name == 'test' and pwd == '123':
            # 登录成功 写session
            session['user'] = name
            return 'login success'
        else:
            # django中传字典,这里传**字典
            # return render_template('login.html',**{'error':'用户名或密码错误'})
            return render_template('login.html', error='用户名或密码错误')


app.add_url_rule('/login', 'loginname', login, methods=['GET', 'POST'])

if __name__ == '__main__':
    app.run()

错误信息分析:单独使用add_url_rule时,必须手动指定endpoint参数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值