前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask(MVC/路由 三)

Flask(MVC/路由 三)

作者头像
zx钟
发布2020-06-19 11:03:17
5230
发布2020-06-19 11:03:17
举报
文章被收录于专栏:测试游记测试游记

MVC

M

model:数据相关逻辑

程序员编写程序应有的功能(实现算法等),DBA对数据库进行数据库管理和设计

V

view:返回的内容展示

界面设计人员进行图形界面设计

C

control:控制器,视图函数

负责转发请求,对请求进行处理

MVC

路由

route源码

代码语言:javascript
复制
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):
        endpoint = options.pop("endpoint", None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f

    return decorator

去除注释部分后可以看出route就是一个很简单的闭包

self.add_url_rule(rule, endpoint, f, **options)这里的self就是app

所以也可以直接通过app.add_url_rule('/',endpoint=xxx,view_func=xxx)来添加路由

  • 第一个参数:函数对应的url规则,满足条件和app.route()的第一个参数一样,必须以'/'开始
  • endpoint:站点,就是在使用url_for()进行反转的时候,这个里面传入的第一个参数就是这个endpoint对应的值。这个值也可以不指定,那么默认就会使用函数的名字作为endpoint的值
  • view_func:对应的函数,即这个url对应的是哪一个函数,注意,这里函数只需要写函数名字,不要加括号,加括号表示将函数的返回值传给了view_func参数了。程序就会直接报错。
  • methods:add_url_rule还可以传入一个methods参数,用来指定这个函数对应的访问规制,如post,get请求等,默认是get请求,并且只允许get请求。当我们需要改变请求方式的时候,我们就可以传入这个参数了。

多个路由同一个处理

代码语言:javascript
复制
@app.route('/hello')
@app.route('/')
def hello_world():
    return render_template('index.html')

使用其他装饰器

其他装饰器要放在@app.route()下面

一个简单的打印时间的装饰器

代码语言:javascript
复制
import time    
def log_time(func):
    def decorator(*args, **kwargs):
        print(time.time())
        return func(*args, **kwargs)

    return decorator
代码语言:javascript
复制
@app.route('/hello')
@app.route('/')
@log_time
def hello_world():
    return render_template('index.html')

重定向

  1. @app.route(redirect_to'/') 不会去执行视图函数
  2. 在视图函数中执行redirect()

设置默认值

  1. 通过defaults
代码语言:javascript
复制
@app.route('/cases/<id>',defaults={'id':3})
  1. 在视图参数中定义默认
代码语言:javascript
复制
@app.route('/cases/<id>')
def hello_world(id=3):
    return render_template('index.html')

视图函数的分离

随着项目的增大,视图函数需要单独放在一起,不在一个文件里了。

所以项目就变成了:

  • 启动文件
  • 视图函数
  • 数据处理
  • view
  • 其他的帮助函数

结构

main.py

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)
import urls

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

urls.py

代码语言:javascript
复制
from main import app
import views

app.add_url_rule('/', view_func=views.home)
app.add_url_rule('/cases', view_func=views.cases)

view.py

代码语言:javascript
复制
def home():
    return 'home'


def cases():
    return 'cases'
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MVC
    • M
      • V
        • C
        • 路由
          • 多个路由同一个处理
            • 使用其他装饰器
              • 重定向
                • 设置默认值
                • 视图函数的分离
                  • main.py
                    • urls.py
                      • view.py
                      相关产品与服务
                      数据库
                      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档