Flask 中的MTV架构之Views

1、MVC与MTV
1.1 MVC

​ M:model,模型,数据模型

​ V:view,视图,负责数据展示

​ C:controller,控制器,负责业务逻辑的处理

1.2 MTV

​ M:model,模型,就是数据模型

​ T:templates,模板,负责数据展示

​ V:view function,视图函数,负责业务逻辑的处理

2、Views(请求与响应)
2.1 内置对象

​ 1、app
获得应用对象:app = Flask(name)
配置应用参数:app.config[‘UPLOAD_FOLDER’] = os.getcwd()
从配置类中加载配置:app.config.from_object(configClass)
通用配置类实例

# 通用配置
class Config:
# 秘钥
SECRET_KEY = os.environ.get('SECRET_KEY') or '123456' # 数据库操作
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False # 邮件发送
MAIL_SERVER = os.environ.get('MAIL_SERVER') or 'smtp.qq.com'
MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'xxx@qq.com'
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or '123456' # bootstrap使用本地库
BOOTSTRAP_SERVE_LOCAL = True # 上传文件
MAX_CONTENT_LENGTH = 8 * 1024 * 1024
UPLOADED_PHOTOS_DEST = os.path.join(base_dir, 'static/upload') # 初始化函数,完成特定环境的初始化
@staticmethod
def init_app(app):
pass

​ 获得应用上下文:app.app_context()
蓝图:app.register_blueprint(blueprint, url_prefix=url_prefix)
2、current_app
获得当前app实例:app = current_app._get_current_object()
获得app配置的值:current_app.config[‘SECRET_KEY’]
3、 g

​ 全局变量存储器

 # g对象是全局变量储存容器,其中可以随意存储任何变量,
#作用域覆盖所有的py文件和模板文件
g.name = '哈士奇'

​ 在Templates模板里就可以直接使用g.name

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</ttle>
</head>
<body> {# g对象是全局变量储存容器,其中可以随意存储任何变量,
作用域覆盖所有的py文件和模板文件#}
<h1>Hello {{ g.name }}!</h1>
</body>
</html>

​ 4、request

​ 请求对象,保存了客户端所有的HTTP的请求信息

​ 请求中的信息

   @app.route('/request/')
def req():
# 完整的请求URL
# return request.url # 基本路由地址,不包括get参数
# return request.base_url # 只有主机和端口号
# return request.host_url # 只包含装饰器中的路由地址
# return request.path # 请求方法类型
# return request.method # 客户端的IP
# return request.remote_addr # 获取GET参数
# return request.args['name'] # 获取请求头信息
return request.headers['User-Agent']

​ 其它
获得上传的文件:file = request.files.get(‘photo’)
获得GET请求参数:page = request.args.get(‘page’, 1, type=int)
5、session

​ 用户会话,用于保存需要’记住’的会话信息

​ 服务端存储技术

​ 设置秘钥

方法1(容易暴露密码):
设置秘钥,用于加密解密的字符串,不只是用于session
app.config['SECRET_KEY'] = '123456' 方法2(使用环境变量设置):
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or '123456'

​ 设置session

    @app.route('/set_session/')
def set_session():
session['user'] = 'xiaoqiao'
return 'session已设置'

​ 获取session

@app.route('/get_session/')
def get_session():
return session.get('user', None)
2.2 钩子函数

​ 第一次请求之前 :before_first_request
每次请求之前 :before_request
每次请求之后,前提是没有异常 :after_request
每次请求之后,即使有异常发生 :teardown_request
实例

@app.before_first_request
def beforeFirstRequest():
print('beforeFirstRequest')
@app.before_request
def beforeRequest():
print('beforeRequest', request)
@app.after_request
def afterRequest(resp):
print('afterRequest', resp)
return resp
@app.teardown_request
def tearDownRequest(resp):
print('tearDownRequest', resp)
return resp
2.3带参路由

​ 带参路由

@app.route('/welcome/<name>')
def welcome(name):
return 'Hello %s !' % name

​ 指定参数类型(默认string)

@app.route('/user/<int:uid>')
def show(uid):
return '%d 号,你好!' % uid

​ path类型(参数中的/不再作为分隔符)

@app.route('/path/<path:p>')
def path(p):
return p
1.路由末尾的'/'建议都加上,因为需要的时候浏览器会自动加上,
输入时加不加都行
2.若需要制定参数,将参数写在<>中,视图函数参数要与路由参数一致
3.若需要知道参数类型,如:int/float/path等,写在参数前,
用':'与参数隔开
4.不指定类型,参数默认是string,path其实也是字符串,只是'/'不再是分隔符
2.4 请求与响应

​ request
请求对象,保存了客户端所有的HTTP的请求信息

​ 请求中的信息

   @app.route('/request/')
def req():
# 完整的请求URL
# return request.url # 基本路由地址,不包括get参数
# return request.base_url # 只有主机和端口号
# return request.host_url # 只包含装饰器中的路由地址
# return request.path # 请求方法类型
# return request.method # 客户端的IP
# return request.remote_addr # 获取GET参数
# return request.args['name'] # 获取请求头信息
return request.headers['User-Agent']

​ 其它
获得上传的文件:file = request.files.get(‘photo’)
获得GET请求参数:page = request.args.get(‘page’, 1, type=int)
response
服务器给客户端的响应

   @app.route('/response/')
def response():
# 默认状态码200
# return 'OK' # 在响应的后面指定状态码
# return 'Page not found', 404 # 先构造一个响应(也可以指定状态码),然后返回
resp = make_response('这是通过函数构造的响应', 404) return resp
2.5重定向
  @app.route('/redirect/')
def old():
# return '旧的内容'
# 重定向,响应指定一个路由地址
#return redirect('/new/')
# 根据视图函数,反向的构造出来路由地址,传递的参数是视图函数名
# return url_for('req')
# 构造带参数的路由,直接写在后面即可
# return url_for('welcome', name='xiaoming')
return redirect(url_for('new')) @app.route('/new/')
def new():
return '新的内容'
2.6 终止和处理错误

​ 抛出错误并终止

    @app.route('/abort/')
def err():
abort(404)
return 'abort测试'

​ 处理错误

@app.errorhandler(404)
def page_not_found(e):
# 渲染指定模板
return render_template('errors/404.html')
2.7 会话控制

​ cookie

​ 客户端存储技术

​ 设置cookie

    @app.route('/set_cookie/')
def set_cookie():
resp = make_response('cookie已设置')
expires = time.time() + 10 # 设置cookie,可以指定过期时间
resp.set_cookie('name', 'xiaoming', expires=expires)
return resp

​ 获取cookie

    @app.route('/get_cookie/')
def get_cookie():
return request.cookies.get('name') or None
2.8 session

​ 设置秘钥

#方法1(容易暴露密码):
#设置秘钥,用于加密解密的字符串,不只是用于session
app.config['SECRET_KEY'] = '123456' 方法2(使用环境变量设置):
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or '123456'

​ 设置session

    @app.route('/set_session/')
def set_session():
session['user'] = 'xiaoqiao'
return 'session已设置'

​ 获取session

@app.route('/get_session/')
def get_session():
return session.get('user', None)
2.9 blueprint

a.什么是蓝图?

一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。

b.什么时候会用到蓝图?

使用蓝图的好处是将你的应用组织成不同的组件,比如把admin,user相关的视图方法分为两个组件,一个是admin组件,一个是user组件.这时我们可以创建两个蓝图实现这两个独立的组件。

c.定义蓝图

   from flask import Blueprint

   # 创建蓝图对象
user = Blueprint('user', __name__) # 添加路由(视图函数)
@user.route('/login/')
def login():
return '欢迎登录' @user.route('/register/')
def register():
return '欢迎注册'

​ d.注册蓝图

   # 在使用的地方进行注册
# 注册蓝图,未注册的蓝图处于休眠状态(无法使用),
#可以通过url_prefix指定前缀,
#当request.url是以/user开头的情况下才会
#通过注册的蓝图的视图方法处理请求并返回
from user import user
app.register_blueprint(user, url_prefix='/user')

【后记】:如果文章对您有帮助,打赏下呗。微信 1257309054,欢迎交流学习*_*
微信

支付宝

Flask 中的MTV架构之Views的更多相关文章

  1. Flask 中的MTV架构之Models

    Flask 中的MTV架构之Models 1.Models(数据模型) 1.1 flask-sqlalchemy(数据库) ​ 说明:提供了大多数关系型数据库的支持,而且提供了ORM # 安装: pi ...

  2. Flask中的MTV架构之Templates

    Flask 中的MTV架构之Templates 关注公众号"轻松学编程"了解更多. 1.Templates(模板引擎) 1.1 说明 ​ 模板文件就是按照特定规则书写的一个负责展示 ...

  3. python框架Django中的MTV架构

    MTV架构 关注公众号"轻松学编程"了解更多. ​ 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...

  4. django上课笔记6-MVC,MTV架构-中间件-初识Form组件

    一.MVC,MTV架构 models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC models(数据库,模型) templates(htm ...

  5. [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)

    一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...

  6. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  7. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  8. 设计模式笔记之二:Android开发中的MVP架构(转)

    写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...

  9. flask框架----整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

随机推荐

  1. Java知识系统回顾整理01基础05控制流程05 continue

    continue:继续下一次循环 一.continue 题目: 如果是双数,后面的代码不执行,直接进行下一次循环 要求效果: 答案: public class HelloWorld { public ...

  2. matlab中ceil朝正无穷大四舍五入

    来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...

  3. ORA-00017: session requested to set trace event 请求会话以设置跟踪事件

    ORA-00017: session requested to set trace event   ORA-00017: 请求会话以设置跟踪事件 Cause:       The current se ...

  4. devops-jenkins分布式构建

    1. devops-jenkins分布式构建 1) 点击系统管理 进入节点管理 2) 点击新建节点 3) 进行节点配置在node节点服务器配置,进行java的安装 [root@nginx-backup ...

  5. ansible-主机清单的配置

    1. ansible主机清单的配置 以下是ansible安装完成后的源文件 1 [root@test-1 ~]# cat /etc/ansible/hosts 2 # This is the defa ...

  6. 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的. 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排 ...

  7. antd pro 路由

    概要 antd pro 路由简介 路由, 菜单和面包屑 页面之间的路由 带参数的路由 总结 概要 路由配置是单页应用的核心之一, antd pro 将所有的路由配置集中在一个文件中, 可以更好的对应用 ...

  8. 8.Android-简单的登录案例编写

    本章来学习登录案例,由于还未学习自定义控件外观,所以ui界面先用最简单的,并保存登录账号密码到data/data/包名/files下 1.学习之前需要掌握的Context类(通过Context来往AP ...

  9. 在实际开发中Java中enum的用法

    在日常项目的开发中,往往会存在一些固定的值,而且"数据集"中的元素是有限的. 例如:st_code// 一些状态机制:01-激活  02-未激活  03 -注册..等等 还有一特性 ...

  10. 多测师讲解性能测试_面试题_001高级讲师肖sir

    什么叫做性能测试?1. 软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,所以一般来说性能测试介入的时机是在功能测试完成之后.另外,由定义中的及时性可知性能也是一种指标,可以 ...