实验5、Flask设计模式和Web服务体验
1. 实验内容
Flask appbuilder包括基本的表单验证,内置管理模块。本节主要学习Flask appbuilder的后台管理模块使用和对Flask设计模式拓展作简要介绍
2. 实验要点
- 掌握安装和配置Flask环境
- 尝试编写Flask版"Hello World"
3.实验环境
- Centos 7.9
4. 工作目录
本实验的工作目录为: /experiment
Flask 设计模式
Flusk
Flusk是一个可用于创建包括SQLAlchemy,Docker和Nginx的大型Flask应用程序的例子。它具有漂亮的逻辑分离,可将后端,域,视图和模型创建到各自的层中。
它很好地使用了Flask蓝图,并遵循Factory设计模式。在Flusk中创建扩展很容易,并且使用Docker可以更轻松地将应用程序容器化。在这里查看其源代码。
Cookiecutter Flask
Cookiecutter Flask是一个烧瓶模板,具有诸如资产捆绑和Webpack压缩之类的功能。它具有用于用户注册/身份验证的入门模板,并基于Bootstrap 4构建。
Cookiecutter是创建Python软件包项目的命令行实用程序。这意味着,如果您使用此模板,则也可以将Flask应用程序发布为PyPI。该项目正在积极开发中,在此链接。
Flask Full
Flask full是又一个功能强大的样板,它利用了Celery,MongoEngine,Signals,Shell命令,WebSocket和eventlet。它与Swagger API文档和Sphinx文档很好地集成在一起,它可以从这里下载。
Flasky
对于创建轻量级应用程序,您可能需要考虑Flasky。Flasky的源代码可在此处获得。该存储库是由Miguel Grinberg创建的,他在Web开发方面拥有超过25年的经验。
他创建了Flasky来为他的名为Flask Web Development的书中讨论的概念提供代码示例。
无论选择哪种框架或模板,所有这些都具有一些标准功能,并以各自的方式进行讨论。我们在这里列出其中一些功能并进行讨论,并在本系列教程的示例应用程序中使用Flask-Appbuilder来实现这些功能。
本教程讨论了一些更常见的模式,您可以在当今几乎所有的Web应用程序中找到这些模式,并且很高兴将其包含在Web开发人员的工具包中。
Flask登录示例
离线创建用户
启动MongoDB服务
mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork
让我们通过使用flask fab create-user
命令创建一个用户。使用此命令后,您将获得命令行提示以提供用户帐户的详细信息。提供类似于以下所示的详细信息,即可创建您的用户。
请注意,在命令输出的末尾,sqla.manager打印确认消息以供用户创建。
现在访问该应用程序,并使用您刚才输入的详细信息登录。如果您在生产数据库上创建了用户,则将这些详细信息传递给您为其创建此帐户的人。
导航到IP:8080/login
,您将看到如下所示的登录表单。
一旦user1登录,用户即可看到欢迎消息。
Flask admin
如果您阅读了该Flask教程系列中的其他教程,那么您会发现我们已经利用了Flask-Appbuilder附带的内置安全性。我们使用add_view_no_menu添加的视图不受保护。但是,我们基于DataModels添加的视图将自动受到Admin用户的保护。
另外,我们可以使用Flask-Admin,它通常会达到类似的结果。也是Flask-Admin,让我们以面向对象的方式定义视图。前端上的网页表示我们明确添加到界面的视图类上的方法。
在本教程中,我们不使用Flask-Admin。取而代之的是,我们采取了更快地获得相同结果的途径,并跳过了了解有关登录,身份验证,角色和权限的安全性的必要性。当我们使用Flask-Appbuilder时,这是可能的。
Flask-Appbuilder和Flask-Admin都有其优缺点。对于Flask-Admin,我们必须知道没有现有的安全性假设,并且您可以基于安全性模型创建应用程序。要了解有关Flask-Admin的更多信息,请访问此处 并查看适当的示例。
Flask文件上传
近来几乎所有的Web应用程序都具有存储和提供文件的要求。它们的典型模式是将文件保存在服务器上的某个路径上,并提供一些信息以对存储的文件进行操作并保存在应用程序模型和视图中。
我们将研究一个类似的例子。让我们用其他功能修改我们的Song模型。
修改models.py
文件
from flask import Markup, url_for
from flask_appbuilder.models.mixins import FileColumn
from flask_appbuilder.filemanager import get_file_original_name
from flask_appbuilder import Model
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
class Song(Model):
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
rating = Column(Integer)
album_id = Column(Integer, ForeignKey('album.id'))
song_file = Column(FileColumn, nullable=False)
album = relationship("Album")
def __str__(self):
return self.title
def download(self):
return Markup(
'<a href="' +
url_for("SongsView.download", filename=str(self.song_file)) +
'">Download</a>'
)
def file_name(self):
return get_file_original_name(str(self.song_file))
我们通过添加类型为FileColumn的新列来修改了先前创建的Song模型。此外,我们添加了另外两列,这些列将添加到SongsView中以显示“文件名”和一个链接,以下载上载的文件。
Flask url_for方法已与标记一起使用,以将下载显示为链接。同样,我们使用了Flask-Appbuilder中的get_file_original_name方法,因为通过将文件名与UUID串联在一起来存储文件名,以避免相同文件名之间的冲突。
修改views.py
class SongsView(ModelView):
datamodel = SQLAInterface(Song)
label_columns = {"file_name" : "File Name", "download": "Download"}
list_columns = ["title", "file_name", "download"]
show_columns = ["title", "file_name", "download"]
在SongsView类中,我们提到了需要显示的新标签,并且我们只想列出指定列表中提到的列。
在这里您需要记住,我们已经通过在模型中添加一列来修改数据库模型。数据库中的对应表没有此新列。因此,从上一教程开始,我们就在处理SQLite数据库时,将删除app.db文件。
或者,我们也可以使用flask db migration
命令对版本文件进行必要的更改,然后使用flask db upgrade
更新表。但是,我们引入的更改很小,我们可以重新创建应用程序数据库和用户。
我们建议在生产中,只要对应用程序的数据库架构进行任何更改,都应考虑使用Flask-Migrate命令。
使用以下命令删除数据库文件并创建用户
rm app.db
flask fab create-db
flask fab create-admin
现在,使用管理员凭据登录到应用程序,您将看到修改后的SongsView,如下图所示。
请注意config.py
中的以下值。上载的文件将存储在服务器上的该路径上。对于本教程,它将被上载到我们正在开发此示例应用程序的机器上。
检查上传路径,如config.py中所述。文件与UUID一起存储,如下所示。
Flask HTTPS
就开发而言,我们可能会继续运行不使用HTTPS的Flask应用程序。从安全角度来看,HTTPS确保合法客户端和服务器之间进行通信。
这种加密的通信要求使用带有一对公钥和私钥的CA签名证书在客户端和服务器之间建立信任。请在这里阅读更多
在本教程中,我们将让您知道在开发过程中使用HTTP开发基于Flask的网站的方法。
在开发过程中包括HTTPS的最快和最简单的方法是使用adhoc ssl_context
,如下面在run.py
中所述。但是,请在环境中使用pip安装pyopenssl。
app.run(host ='0.0.0.0',port = 8080,debug = True,ssl_context ='adhoc')
添加ssl_context后,当您导航到https://IP:8080
时,将收到警告,怀疑对此通信中使用的证书的有效性。此外,导航到http://IP:8080
将不再起作用。
因此,这种方法有点麻烦,并且要求您在重新启动开发服务器时始终接受此请求。
另外,要使用https功能进行开发,我们可以将路径传递到证书,然后将Python Tuple中的密钥输入到run方法中的ssl_context参数。但是,要采用这种方法,您将必须使用以下命令生成自签名证书和密钥。
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
我们使用了所有默认值。现在停止开发服务器,并通过路径证书和密钥路径,如下所示。
app.run(host ='0.0.0.0',port = 8080,debug = True,ssl_context =('mycert.pem','mykey.pem'))
此方法也类似于以前使用Adhoc ssl_context的方法。但是,在这种情况下,细节将保留更长的时间。我们提到了365天。您可以指定所需的到期日。此外,如果您在团队中进行开发,则可以与其他团队成员共享这些文件。
在生产环境中,证书由CA颁发,Miguel Grinberg在此处讨论一些用例。我们建议您在该页面上阅读更多详细信息。
实验总结
在本教程中,我们讨论了Web开发人员在开发与Flask登录,Flask管理,Flask文件上传和Flask HTTPS相关的功能时遵循的一些模式。我们提供了代码示例,读者也可以尝试。
在我们的下一个教程中,我们将介绍扩展Flask的概念,并了解如何创建基于REST API的功能。此外,我们将讨论如何在Flask中使用Twitter API。
实验5、Flask设计模式和Web服务体验的更多相关文章
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- 踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服务部署
一.简介 作为算法开发人员,在算法模块完成后,拟部署Web服务以对外提供服务,从而将算法模型落地应用.本文针对首次基于Flask + uWSGI + Tensorflow + Nginx部署Web服务 ...
- Python+Flask+MysqL的web建设技术过程
一.前言(个人学期总结) 个人总结一下这学期对于Python+Flask+MysqL的web建设技术过程的学习体会,Flask小辣椒框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运 ...
- Web服务中延时对QoE(体验质量)的影响
S. Egger等人在论文<WAITING TIMES IN QUALITY OF EXPERIENCE FOR WEB BASED SERVICES>中,研究了Web服务中延时对主观感受 ...
- [转帖]龙芯服务器部署WEB服务的体验和详细步骤
龙芯服务器部署WEB服务的体验和详细步骤 2019年01月02日 18:40:34 weixin_40065369 阅读数 1733 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权 ...
- 服务设计模式一:Web服务概述
目录 1. Web服务是什么 2.为什么要使用Web服务 3.Web服务考虑的因素和替代方案 4.SOA是什么 Web服务是什么? 所谓服务,通俗的理解就是别人帮你做一些事情,比如说,腰酸背痛了,找个 ...
- Web服务端软件的服务品质概要
软件品质概述 提供同样功能.产品和服务的服务者中, 竞争力来自功能的多样化和服务品质的差异化, 无论是个体.企业还是国家. 这里的服务指功能.产品的实现程度和处理能力,以及研发/客服提供的技术支持程度 ...
- Azure机器学习入门(四)模型发布为Web服务
接Azure机器学习(三)创建Azure机器学习实验,下一步便是真正地将Azure机器学习的预测模型发布为Web服务.要启用Web服务发布任务,首先点击底端导航栏的运行即"Run" ...
- Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)
一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...
随机推荐
- 每天一道面试题LeetCode 206 -- 反转链表
LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...
- 【CSS】CSS3从入门到深入(复习查漏向
CSS3从入门到深入(复习查漏向 pre_section CSS:层叠样式表,决定网页表现 网页为多层结构,CSS为每一层设置样式,最后显示最上一层 CSS语句 = 选择器 + 声明块 形式 内联样式 ...
- hdu - 1716 排列2 (使用set对全排列结果去重)
题意很简单,只是有几个细节要注意,首先就是一次只是输入四个数字.输出结果要从小到大(进行全排列之前要进行排序).题目要求千位数相同的在一行,中间使用空格隔开(第二次在输出的时候判断上一次记录的千位数是 ...
- JAVA中Abstract到底有什么用?都用在哪些方面比较合适?
功能向上聚合 Abstract作为抽象类和抽象方法,第一种情况是在聚合子类的通用性上起到作用,往往出现在重构过程中自然而然形成的一种层次结构-希望将多个子类的通用方法和逻辑提取到父层的抽象类. 这种重 ...
- MindSpore保存与加载模型
技术背景 近几年在机器学习和传统搜索算法的结合中,逐渐发展出了一种Search To Optimization的思维,旨在通过构造一个特定的机器学习模型,来替代传统算法中的搜索过程,进而加速经典图论等 ...
- Charles的功能(web)
# 验证是否可以获取web端的https接口 1. 打开Charles 2.打开游览器输入数据 3. 查看Charles 4.从上图所看,能获取htpps的包数据,即可对web端进行抓包 4.char ...
- (转)解决c#自带的HttpClient(Http.GetFromJsonAsync Http.GetStringAsync等)返回中文乱码问题
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var aa = await Http.GetByteArrayAsync ...
- pytest用法---学习篇1
一.pytest运行规则: pytest可以收集所有以test_*.py文件,Test开头的类,和以test_开头的函数和方法,都能识别成测试用例. 当然也可以改变这个的识别规则 二.常用参数 -k ...
- [Python] 安装 & 常用命令
安装 http://www.xue51.com/soft/2301.html 常用命令 #查看pip版本$ pip --version#安装pip$ sudo apt install python3- ...
- Linux_日志管理理论概述
一.日志系统 1.kernel -->物理终端(/dev/console) --> /var/log/dmesg(系统启动时信息(包括错误信息)记录到该文件) 或者:# dmesg 或 # ...