资讯专栏INFORMATION COLUMN

Flask注册视图函数

2bdenny / 2917人阅读

摘要:键是函数名,值是函数对象,函数名也用于生成。注册一个视图函数,用装饰器。获取储存视图函数字典中的函数对象视图函数类中的字典储存了注册的视图函数名和视图函数对象。输出视图函数视图函数名重复修改解决

那天莫名其妙出了个错。。就顺便看了看Flask路由

在flask存储路由函数是以函数名为键,函数对象为值

class Flask:
    def __init__(self, *args, **kwargs):
        #所有视图函数的注册将被放在字典。键是函数名,值是函数对象,函数名也用于生成URL。注册一个视图函数,用route装饰器。
        self.view_functions= {}

app.route装饰器注册视图函数

def route(self, rule, **options):
    #用来给给定的URL注册视图函数的装饰器,也可以用add_url_rule函数来注册。endpoint关键字参数默认是视图函数的名字
    def decorator(f):
            endpoint = options.pop("endpoint", None) #pop删除endpoint的值没有为None并返回它赋值给endpoint
            self.add_url_rule(rule, endpoint, f, **options) #调用add_url_rule函数
            return f
        return decorator

add_url_rule函数

def add_url_rule(self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options):
    if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func) #_endpoint_from_view_fun函数返回视图函数名view_fun.__name__
        options["endpoint"] = endpoint
    #......
    if view_func is not None:
            old_func = self.view_functions.get(endpoint)
            if old_func is not None and old_func != view_func:
                raise AssertionError("View function mapping is overwriting an "
                                     "existing endpoint function: %s" % endpoint) #old_func对象从储存视图函数的字典中取出,如果它不为空并且不等于视图函数那么就会报错视图函数覆盖当前端点函数,如果有同名函数可以通过修改endpoint值来避免这个错误。
            self.view_functions[endpoint] = view_func #函数名作为键,函数对象作为值存储到view_functions中。   

获取储存视图函数字典中的函数对象

from flask import Flask

app = FLask(__name__)

@app.route("/")
def index():
    return "

视图函数:{} /endpoint:{}

".format(app.view_functions.get("index","None").__name__, app.view_functions.keys()) #FLask类中的view_functions字典储存了注册的视图函数名和视图函数对象。函数名为endpoint默认就是视图函数的名字,get方法获得视图函数对象,__name__过的函数名。这个字典的键就是endponit的值。 输出: endpoint:dict_keys(["static", "index"])/视图函数:index

如果自定义endponit = "hello"

@app.route("/", endpoint="hello")
def index():
    return "

endpoint:{}/视图函数:{}

".format(app.view_functions.keys(), app.view_functions.get("hello","None").__name__) #字典键值就是endponit值改为自定义的值来获取试图函数对象。 输出: endpoint:dict_keys(["static", "hello"])/视图函数:index

视图函数名重复

@app.route("/s/")
def a():
    return "helloooo"

@app.route("/ss/")
def a():
    return "ahahaha" 
#AssertionError: View function mapping is overwriting an existing endpoint function: a

修改endpoint解决

@app.route("/s/", endpoint="h")
def a():
    return "helloooo"

@app.route("/ss/")
def a():
    return "ahahaha"


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43691.html

相关文章

  • Flask Web 开发实战笔记

    摘要:开发实战笔记安装和使用虚拟环境虚拟环境是解释器的一个私有副本,在这个环境中你可以安装私有的包,而且不会影响系统中安装的全局的解释器。处理和函数之间关系的程序称为路由。例如在请求开始时,我们需要创建数据库连接或认证发起请求的用户。 几天前和同事一起喝酒,大家谈到为什么开始读书这件事。这里所说的读书不是专业的书籍,而是一些闲书。结果发现原来我们开始读书的原因很功利。都是因为生活中遇到了困...

    罗志环 评论0 收藏0
  • [贰]Flask web开发:程序的基本结构

    摘要:本篇对应书本第二章程序的基本结构。初始化导入模块创建类的实例注对于开发者来说,传给应用程序构造函数的参数是比较容易弄混淆的。不同的请求方法发送到相同的上时,会使用不同的视图函数进行处理。 本系列笔记是我阅读Miguel Grinberg的《Flask Web Development》的笔记,标题与书本同步。希望通过记录技术笔记的方式促进自己对知识的理解。 本篇对应书本第二章:程序的基本...

    maxmin 评论0 收藏0
  • Flask Web Development —— 基本应用程序结构(下)

    摘要:有两类应用级和请求级。一个响应中非常重要的部分是状态码,默认设置来指示请求已经成功处理。重定向通常由响应状态码注明并且重定向的由头部的给出。因为这些变化,应用程序获得一组基本的命令行选项。运行显示可用信息在应用程序上下文的内部运行一个。 5、请求-响应循环 现在你已经玩过一个基本的Flask应用程序,你也许想要知道更多关于Flask如何施展魔力。下面章节描述了一些框架设计方面的特点。...

    caohaoyu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<