Flask(MVC/路由 三)
Posted 测试游记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask(MVC/路由 三)相关的知识,希望对你有一定的参考价值。
MVC
M
model:数据相关逻辑
程序员编写程序应有的功能(实现算法等),DBA对数据库进行数据库管理和设计
V
view:返回的内容展示
界面设计人员进行图形界面设计
C
control:控制器,视图函数
负责转发请求,对请求进行处理
路由
route
源码
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
请求。当我们需要改变请求方式的时候,我们就可以传入这个参数了。
多个路由同一个处理
@app.route('/hello')
@app.route('/')
def hello_world():
return render_template('index.html')
使用其他装饰器
其他装饰器要放在@app.route()下面
一个简单的打印时间的装饰器
import time
def log_time(func):
def decorator(*args, **kwargs):
print(time.time())
return func(*args, **kwargs)
return decorator
@app.route('/hello')
@app.route('/')
@log_time
def hello_world():
return render_template('index.html')
重定向
@app.route(redirect_to'/')
不会去执行视图函数在视图函数中执行
redirect()
设置默认值
通过
defaults
@app.route('/cases/<id>',defaults={'id':3})
在视图参数中定义默认
@app.route('/cases/<id>')
def hello_world(id=3):
return render_template('index.html')
视图函数的分离
随着项目的增大,视图函数需要单独放在一起,不在一个文件里了。
所以项目就变成了:
启动文件
视图函数
数据处理
view
其他的帮助函数
main.py
from flask import Flask
app = Flask(__name__)
import urls
if __name__ == '__main__':
app.run()
urls.py
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
def home():
return 'home'
def cases():
return 'cases'
以上是关于Flask(MVC/路由 三)的主要内容,如果未能解决你的问题,请参考以下文章