本文翻译至Tutorial
文章目录
本教材将会指导你创建一个名为Flaskr的博客应用。用户可以注册、登陆、创建帖子,并且可以修改或删除他们的帖子。你可以在其他计算机上打包和安装此应用。
本文假设你已经很熟悉Python了。Python官方教程文档是最好的学习或复习方式。
Blueprint(蓝图)和视图
视图函数是用于响应应用程序请求的代码。Flask使用模式将传入的URL与处理它的试图相匹配。试图返回Flask构造的一个传出响应的数据。Flask也可以重定向,并根据名称和参数生成试图的URL。
创建Blueprint
Blueprint是一个组织一组相关的视图和代码的方式。
端点和URL
url_for() 函数根据名称和参数生成视图的URL。与视图相关的名称也被称为 endpoint,在默认情况下,它同样是视图函数的名称。
例如,在教程中之前添加到app工程**hello()**视图有一个“hello”的名称,并且可以通过url_for(‘hello’)链接。如果它有一个参数,它可以使用url_for(‘hello’,who=‘World’)链接。
当使用blueprint,blueprint的名称被附加在函数名称之前,所以 login 函数的endpoint(视图函数的名称)是’auth.login’。
模板
默认情况下模板文件需要存放在flaskr包的templates文件夹内。
模板中包含静态数据以及为动态数据保留的占位符。模板被特定的数据渲染生成最终的文档。Flask使用Jinja模板库渲染模板。
在此app中,使用模板渲染将要显示在用户浏览器上的HTML。在Flask中,Jinja被配置成任何渲染在HTML模板中的数据都会自动转义。这意味着渲染用户输入是安全的;任何的用户键入的字符都会与HTML混在一起,例如“<”和“>”将会转义成在浏览器上同样效果的安全的值,而不会出现意料之外的现象。
# html 模板
<span>{{ username }}</span>
# 正常情况,username = ‘david’
<span>david</span>
# 非正常情况,username = '<br/>david',<br/>在html中是换行标签
# 若是下面的情况,将会破坏模板的结构,而且是不安全的
<span><br/>david</span>
# Jinja是安全的模板库,<br/>将会被转义成普通字符串,在浏览器上会看到<br/>david,而不是上面的情况
Jinja看起来和行为很像Python。特定的分隔符被用于从模板的静态数据中区分Jinja语法。任何在“{{”和“}}”之间的都是将会被输出到最终文档中的表达式。“{%”和“%}”表示一个控制流语句,类似“if”和“for”。和Python不同,语句块用开始和结束标签表示,而不是使用缩进,因为块内的静态文本可能会改变缩进。
The Base Layout 基本的布局排版
每一个在应用程序中的页面都会有相同的包含不同body的基础布局。每一个模板将会扩展和覆盖特定区域,而不是在每个模板中写整个HTML的结构。
模板文件位置推荐:
基本布局模板文件放在templates文件夹下。Blueprint的模板文件放在templates文件夹下与Blueprint同名的子文件夹内
静态文件
所有的静态文件默认位置为项目根目录的static文件夹。
# 获取静态文件的url
url_for('static',filename='style.css') # 获取静态文件style.css的url
制作项目安装包
制作可安装的项目。
创建一个发布文件并且在其他环境下安装,就像在你的项目环境下安装Flask。使得部署项目和安装其他库一样简单,你可以使用所有的Python标准工具管理所有事情。
制作安装项目的好处:
- 当前,Python和Flask知道如何使用flaskr包,只是因为是从项目目录运行。安装意味着你不管在哪里运行都可以导入它。
- 你可以像其他包一样管理你的项目依赖,pip install yourproject.whl 即可安装全部依赖。
- 测试工具将你的测试环境和开发环境隔离。
Describe the Project 项目描述文件
在setup.py 文件中描述项目及项目文件。
from setuptools import find_packages, setup
setup(
name='flaskr',
version='1.0.0',
packages=find_packages(),
include_package_data=True,
zip_safe=False,
install_requires=[
'flask',
],
)
packages 告诉Python项目文件的路径。find_packages()会自动查找路径,不需要你手动填写。若还要包含其他文件,例如static、templates文件夹下的文件,需要设置include_package_data属性为True。需要通过MAINIFEST.in文件告诉Python其他数据是什么。
include flaskr/schema.sql
graft flaskr/static
graft flaskr/templates
global-exclude *.pyc
上面的MANIFEST.in告诉Python拷贝static和templates文件夹下的所有文件,拷贝schema.sql文件,但是排除所有二进制文件*.pyc。
安装项目
使用pip安装项目。
pip install -e .
最后一个“.”不能少,这是告诉pip在当前路径查找setup.py文件。-e 是设置安装后的包为editable模式,修改本地代码后只需要re-install。不加 -e 是安装为development模式。
部署到生成环境
Deploy to Production 部署到生产环境
首先需要打包成发布文件。当前标准的Python发布文件是 wheel 格式的,文件扩展名为 .whl 。确保系统内已经安装了wheel库:
pip install wheel
生成发布文件:
python setup.py bdist_wheel
命令行进入到setup.py所在的文件夹执行此命令。setup.py已在上一节里说明,若有其他数据文件还需要有MANIFEST.in文件。生产的发布文件位置为当前目录下的dist/flaskr-1.0.0-py3-none-any.whl。
安装发布文件:
pip install flaskr-1.0.0-py3-none-any.whl
若在前一节安装了flaskr,可以通过执行命令卸载:
pip uninstall flaskr
查看已安装的程序:
pip list
配置密钥
程序默认的密钥SECRET_KEY=‘dev’,是不安全的,需要通过config.py文件设置程序的密钥。
python随机生成密钥:
python -c "import os,binascii; print(binascii.b2a_uu(os.urandom(16)))"
创建文件venv/var/flaskr-instance/config.py(下面创建的数据库也在这同一文件夹内),写入内容:
SECRET_KEY = b'0M?*JSI.]^S_<"O;RK3,TO'
运行已安装的flaskr程序(flask)
// windows cmd
// 设置为默认flask程序
set FLASK_APP=flaskr
set FLASK_ENV=development
// 通过执行flask命令初始化数据库(数据库位置为var/flaskr-instance)
flask init-db
// 运行flaskr程序
flask run
在生产服务器上运行flaskr
开发服务器(flask run)是为了开发的方便,但是设计不是特别高效,稳定和安全,不能用在生产环境中。而是使用WSGI服务器,例如Waitress。
安装Waitress:
pip install waitress
告诉Waitress需要运行的应用程序信息,不是像flask run那样使用FLASK_APP。而是告诉它导入并调用应用程序工厂以获取应用程序对象。
waitress-serve --call flaskr:create_app
默认地址为 http://0.0.0.0:8080。
参考:waitress-serve