Flask 中的MTV架构之Views
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的更多相关文章
- Flask 中的MTV架构之Models
Flask 中的MTV架构之Models 1.Models(数据模型) 1.1 flask-sqlalchemy(数据库) 说明:提供了大多数关系型数据库的支持,而且提供了ORM # 安装: pi ...
- Flask中的MTV架构之Templates
Flask 中的MTV架构之Templates 关注公众号"轻松学编程"了解更多. 1.Templates(模板引擎) 1.1 说明 模板文件就是按照特定规则书写的一个负责展示 ...
- python框架Django中的MTV架构
MTV架构 关注公众号"轻松学编程"了解更多. 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...
- django上课笔记6-MVC,MTV架构-中间件-初识Form组件
一.MVC,MTV架构 models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC models(数据库,模型) templates(htm ...
- [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)
一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- flask框架----整合Flask中的目录结构
一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...
随机推荐
- 关于Python中以字母r,或字母u 开头的字符串
(1)以r或R开头的Python中的字符串表示(非转义的)原始字符串 python里面的字符,如果开头处有个r,比如: (r'^time/plus/\d{1,2}/$', hours_ahead) ...
- 编写一个Open Live Writer的VSCode代码插件
起因 又是一年多没有更新过博客了,最近用Arduino做了一点有意思的东西,准备写一篇博客.打开尘封许久的博客园,发现因为Windows Live Writer停止更新,博客园推荐的客户端变为了Ope ...
- Hyper-V Server + Windows Admin Center
2020年的十一黄金周是双节,偶然间得知再出现双节可能要几十年之后了,很可惜我并没有出去游玩的打算.所以假期没什么事,就来研究下Hyper Server + Windows Admin Center. ...
- xxe 新手学习记录
在做某题时遇到了xxe漏洞,学习+记录 这里因为环境暂时关了,现在复现不了,所以在网络上又找到了一些xxe题目环境 这里有 PikaChu靶场里的xxe环境,这个环境可以在BUUCTF里开,但是这里我 ...
- HanLP的分词统计
HanLP的分词效果鄙人研究了HanLP,他的分词效果确实还可以,而且速度也比较快,10的数据是9000毫秒 @SneakyThrows@Overridepublic LinkedHashMap< ...
- python数据清洗
盖帽法 分箱法 简单随机抽和分层抽
- spring boot:解决cors跨域问题的两种方法(spring boot 2.3.2)
一,什么是CORS? 1,CORS(跨域资源共享)(CORS,Cross-origin resource sharing), 它是一个 W3C 标准中浏览器技术的规范, 它允许浏览器向非同一个域的服务 ...
- centos8上配置openssh的安全
一,openssh服务版本号的查看 1,查看当前sshd的版本号 : [root@yjweb ~]# sshd --help unknown option -- - OpenSSH_7.8p1, Op ...
- HTML编辑器(1)
前言 现在网上有很多这样的HTML编辑器,这种编辑器无疑给人带来了很多方便,所以自己也想尝试制作一款这样的HTML编辑器,既然要制作,那就肯定是先把UI搭起来,再慢慢完善功能 设计思路 我的思路就是将 ...
- 如何使用性能分析工具定位SQL执行慢的原因?
但实际上 SQL 执行起来可能还是很慢,那么到底从哪里定位 SQL 查询慢的问题呢?是索引设计的问题?服务器参数配置的问题?还是需要增加缓存的问题呢?性能分析来入手分析,定位导致 SQL 执行慢的原因 ...