#从flask这个包中导入Flask这个类
#Flask这个类是项目的核心,以后很多操作都是基于这个类的对象
#注册url、注册蓝图等都是基于这个类的对象
from flask import Flask #创建一个Flask对象,传递__name__参数进去
#__name__参数的作用:
#1.可以规定模板和静态文件的查找路劲
#2.以后一些Flask插件,比如Flask-migrate、Flask-SQLAlchemy如果报错了,
#那么Flask可以通过这个参数找到具体的报错位置
app = Flask(__name__) #@app.route:是一个装饰器
#@app。route(“/”)就是将url中的/映射到hello_world这个视图函数上面
#以后你访问我这个网站的/目录的时候,会执行hello_world这个函数,然后将这个
#返回值返回给浏览器
@app.route('/')
def hello_world():
return 'Hello World' if __name__ == '__main__':
#app.run():Flask中的一个测试应用服务
# while True: run相当于
# listen()
# input()
app.run()

看下 route(‘/’)的源码

先看下一般我们使用装饰器怎么用

无参装饰器

User = None

def decorater(func):
def wapper(*args,**kwargs):
if User:
return func(*args,**kwargs)
else:
#就执行相应逻辑
pass
return wapper

有参装饰器

def func(fun,*args,**kwargs):
def decorater(f):
def wapper(*args, **kwargs):
if User:
return func(*args, **kwargs)
else:
# 就执行相应逻辑
pass
return wapper
return decorater ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-_
下面看下flask里面是怎么处理的
def route(self, rule, **options):
"""A decorator that is used to register a view function for a
given URL rule. This does the same thing as :meth:`add_url_rule`
but is intended for decorator usage:: @app.route('/')
def index():
return 'Hello World' For more information refer to :ref:`url-route-registrations`. :param rule: the URL rule as string
:param endpoint: the endpoint for the registered URL rule. Flask
itself assumes the name of the view function as
endpoint
:param options: the options to be forwarded to the underlying
:class:`~werkzeug.routing.Rule` object. A change
to Werkzeug is handling of method options. methods
is a list of methods this rule should be limited
to (``GET``, ``POST`` etc.). By default a rule
just listens for ``GET`` (and implicitly ``HEAD``).
Starting with Flask 0.6, ``OPTIONS`` is implicitly
added and handled by the standard request handling.
"""
def decorator(f): #f就是那个注册函数但是这里没有执行
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options) #而是将注册url传入进了 add_url_rule()这个函数,路由规则和注册函数进行绑定
return f
return decorator
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
看下 add_url_rule
@setupmethod
def add_url_rule(self, rule, endpoint=None, view_func=None,
provide_automatic_options=None, **options):
"""Connects a URL rule. Works exactly like the :meth:`route`
decorator. If a view_func is provided it will be registered with the
endpoint. Basically this example:: @app.route('/')
def index():
pass Is equivalent to the following:: def index():
pass
app.add_url_rule('/', 'index', index) If the view_func is not provided you will need to connect the endpoint
to a view function like so:: app.view_functions['index'] = index Internally :meth:`route` invokes :meth:`add_url_rule` so if you want
to customize the behavior via subclassing you only need to change
this method. For more information refer to :ref:`url-route-registrations`. .. versionchanged:: 0.2
`view_func` parameter added. .. versionchanged:: 0.6
``OPTIONS`` is added automatically as method. :param rule: the URL rule as string
:param endpoint: the endpoint for the registered URL rule. Flask
itself assumes the name of the view function as
endpoint
:param view_func: the function to call when serving a request to the
provided endpoint
:param provide_automatic_options: controls whether the ``OPTIONS``
method should be added automatically. This can also be controlled
by setting the ``view_func.provide_automatic_options = False``
before adding the rule.
:param options: the options to be forwarded to the underlying
:class:`~werkzeug.routing.Rule` object. A change
to Werkzeug is handling of method options. methods
is a list of methods this rule should be limited
to (``GET``, ``POST`` etc.). By default a rule
just listens for ``GET`` (and implicitly ``HEAD``).
Starting with Flask 0.6, ``OPTIONS`` is implicitly
added and handled by the standard request handling.
"""
if endpoint is None:
endpoint = _endpoint_from_view_func(view_func)#这个是注册函数的名字
options['endpoint'] = endpoint #将字典的形式 将函数名字 绑定到 options这个字典上 键值对:
methods = options.pop('methods', None) #这里用了字典的pop方法,pop()这个方法有三个参数一个是self就是字典zij,
第二参数就是关键字,第三个就是没有找到这个关键字的默认参数
# if the methods are not given and the view_func object knows its
# methods we can use that instead. If neither exists, we go with
# a tuple of only ``GET`` as default.
  

如果没有给出方法,并且view_func对象知道它的方法

方法,我们可以用它来代替。如果两者都不存在,我们就一起去

只有' GET '作为defaul的元组

    if methods is None:
methods = getattr(view_func, 'methods', None) or ('GET',)#这个用自省中动态的获取里面的方法,methods有值就是直接获取,没有就是None,None就不执行,执行
后面的默认参数元祖
if isinstance(methods, string_types):#这里methods是(‘GET’,)
raise TypeError('Allowed methods have to be iterables of strings, '
'for example: @app.route(..., methods=["POST"])')
methods = set(item.upper() for item in methods) # Methods that should always be added
required_methods = set(getattr(view_func, 'required_methods', ())) # starting with Flask 0.8 the view_func object can disable and
# force-enable the automatic options handling.
if provide_automatic_options is None:
provide_automatic_options = getattr(view_func,
'provide_automatic_options', None) if provide_automatic_options is None:
if 'OPTIONS' not in methods:
provide_automatic_options = True
required_methods.add('OPTIONS')
else:
provide_automatic_options = False # Add the required methods now.
methods |= required_methods rule = self.url_rule_class(rule, methods=methods, **options)
rule.provide_automatic_options = provide_automatic_options self.url_map.add(rule)
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)
self.view_functions[endpoint] = view_func

flask第一级的更多相关文章

  1. openshift云计算平台diy模式安装Python2.7+Flask

    主要翻译了链接1)的教程,加上一些个人研究,步骤如下: 1) 在openshift.redhat.com申请账号,安装git for windows,然后安装gem install rhc,这些比较容 ...

  2. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

  3. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  4. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  5. Python基于Flask框架配置依赖包信息的项目迁移部署小技巧

    一般在本机上完成基于Flask框架的代码编写后,如果有接口或者数据操作方面需求需要把代码部署到指定服务器上. 一般情况下,使用Flask框架开发者大多数都是选择Python虚拟环境来运行项目,不同的虚 ...

  6. 一篇博客带你入门Flask

    一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...

  7. flask(三)之Flask-SQLAlchemy

    01-介绍 Flask-SQLAlchemy是一个Flask扩展,简化了在Flask应用中使用SQLAlchemy的操作.SQLAlchemy提供了高层ORM,也提供了使用数据库原生SQL的低层功能. ...

  8. Flask初识

    一.Flask初识 1.Flask介绍 Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug服务 ,模板引擎则使用 Jinja2 .Flask ...

  9. 第三篇 Flask 中的 request

    第三篇 Flask 中的 request   每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前 ...

随机推荐

  1. head&tail命令

    1.tail tail命令用途是按照要求将指定的文件的最后部分输出到标准设备, 一般是终端,通俗来讲,就是把某个档案文件的最后几行显示到终端上, 如果该档案有更新,tail会自动刷新,确保你看到最新的 ...

  2. jquery enabled选择器 语法

    jquery enabled选择器 语法 作用::enabled 选择器选取所有启用的表单元素.大理石平台精度等级 语法:$(":enabled") jquery enabled选 ...

  3. VS Code 最好用的 Markdown 插件

    对经常使用 Markdown 写东西的工程师来说找到称手好用的 Markdown 编辑器非常重要. 目前为止 VS Code 最好用的插件是 Markdown Preview Enhanced . 各 ...

  4. Thread的setDaemon(true)方法的作用

    定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开.优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务.设置:通过setDaemon(true)来设置线程为“守护线 ...

  5. DIY Arduino 方向盘

    之前的项目中使用Arduino做UE4的输入设备时候需要用到UE4Duino这个插件,以字符串的形式从Arduino中组装信息并发送到串口,使用UE4Duino进行解析,过程比较麻烦. 最近发现的一个 ...

  6. SQL中模糊查询的模式匹配

    SQL模糊查询的语法为: “Select column FROM table Where column LIKE 'pattern'”. SQL提供了四种匹配模式: 1. % 表示任意0个或多个字符. ...

  7. orcal 根据打分时间计算打分情况

    create or replace function F_GET_TEST(in_ny in date,in_project_id in number ) return number is sRetu ...

  8. 【转】C++ typedef typename 作用

    转:https://blog.csdn.net/zhangxiao93/article/details/50569924 and GOOD: https://blog.csdn.net/vanturm ...

  9. Nature/Science 论文阅读笔记

    Nature/Science 论文阅读笔记 Unsupervised word embeddings capture latent knowledge from materials science l ...

  10. VS 2017 VC++项目出现 LNK1104 无法打开文件"libcmtd.lib" 的解决方法

    今天用VS 2017编译一个以前的VC++动态库项目,出现了一个链接器问题: LNK1104 无法打开文件"libcmtd.lib" . 操作系统版本为:Windows 10 18 ...