Flask教程(创建一个名为Flaskr的博客应用)

本文翻译至Tutorial



本教材将会指导你创建一个名为Flaskr的博客应用。用户可以注册、登陆、创建帖子,并且可以修改或删除他们的帖子。你可以在其他计算机上打包和安装此应用。

在这里插入图片描述

本文假设你已经很熟悉Python了。Python官方教程文档是最好的学习或复习方式。

Blueprint(蓝图)和视图

Blueprints and Views

视图函数是用于响应应用程序请求的代码。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’。

模板

Templates

默认情况下模板文件需要存放在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其他数据是什么。

MAINIFEST.in

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值