Flask - 实用“操作指南”列表
你好,程序员们,
本文列出了一些实用的提示和功能,希望能帮助开发者更快地开发Flask项目。对于新手来说,Flask是一个轻量级的 WSGI Web 应用程序框架,旨在快速轻松地上手,并能够扩展到复杂的应用程序。
感谢阅读! - 内容由App Generator提供。
- ✨ 第 1 节# - 如何
code a simple App
在 Flask 中 - ✨ 第 2 部分# -
How to structure
你的项目 - ✨ 第 3 部分# - 如何
enable DEBUG
- ✨ 第 4 部分# - 如何
set up SQLAlchemy
- ✨ 第 5 节# - 如何
use the Flask CLI
- ✨ 第 6 节# - 如何
migrate a Database
- ✨ 第 7 节# - 如何定义和
use a form
- ✨ 第 8 节# - 如何
implement authentication
- ✨ 第 9 节#-如何阅读
POST data
- ✨ 第 10 节# - 如何
redirect in Flask
- ✨ 第 11 节# -
Logging
在 Flask 中 - ✨ 第 12 节# - 如何
return JSON
在 Flask 中 - ✨ 第 13 节# - 如何
enable CORS
app
✨ 第 14 节# -在项目中的任何位置访问对象- ✨ 第 15 节 # - 带有免费仪表板的精选索引
- 🔥 Flask Soft UI - Bootstrap 5 仪表板
- 🔥 Flask Pixel UI 套件- Bootstrap5 UI 套件
- 🔥 Datta Able Flask - 彩色 BS4 设计
- 🔥 Flask Bootstrap 5 Volt - Bootstrap 5 设计
- 🔥 Flask Dashboard Black - 深色主题仪表板
好的,让我们回到真正的内容 - 第一个非常基础,并解释了如何在不到 1 分钟的时间内编写一个最小的 Flask 应用程序(您需要快速打字并安装 Python3)。
✨ 1# - Flask,一个极简应用
打开终端并使用 PIP 安装 Flask:
$ pip install Flask
使用您喜欢的编辑器创建一个名为的文件hello.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return f'Hello from Flask!'
保存文件后,让我们启动应用程序:
$ env FLASK_APP=hello.py flask run
* Serving Flask app "hello"
* Running on http://127.0.0.1:5000/
通过在浏览器中访问该应用程序,我们应该看到“Hello from Flask”消息。
✨ 2# - 如何构建你的项目
Flask作为一个轻量级框架,在项目代码库结构方面具有极大的灵活性。本文推荐的配置已在 AppSeed 平台生成的许多 Flask Starter 中使用,但我们确信在 Github 或私人博客上也发布了许多其他优秀的配置。
< PROJECT ROOT >
|
|-- app/__init__.py
|-- app/
| |-- static/
| | |-- <css, JS, images> # CSS files, Javascripts files
| |
| |-- templates/
| | |
| | |-- includes/ # Page chunks, components
| | | |
| | | |-- navigation.html # Top bar
| | | |-- sidebar.html # Left sidebar
| | | |-- scripts.html # JS scripts common to all pages
| | | |-- footer.html # The common footer
| | |
| | |-- layouts/ # App Layouts (the master pages)
| | | |
| | | |-- base.html # Used by common pages like index, UI
| | | |-- base-fullscreen.html # Used by auth pages (login, register)
| | |
| | |-- accounts/ # Auth Pages (login, register)
| | | |
| | | |-- login.html # Use layout `base-fullscreen.html`
| | | |-- register.html # Use layout `base-fullscreen.html`
| | |
| | index.html # The default page
| | page-404.html # Error 404 page (page not found)
| | page-500.html # Error 500 page (server error)
| | *.html # All other pages provided by the UI Kit
|
|-- requirements.txt
|
|-- run.py
|
|-- ************************************************************************
相关文件:
run.py
- 用于启动应用程序的入口点requirements.txt
- 指定所有依赖项的文件(目前只有 Flask)app
- 我们将添加代码的应用程序文件夹app/__init__.py
- 需要此文件才能让我们将应用程序用作 Python 包app/static
- 此文件夹将包含设计资产:JS、CSS 和图像。templates
- 包含 Flask 用来生成漂亮页面的页面、布局和组件的目录
✨ 3# - 如何启用 DEBUG
在开发过程中,有时我们需要深入调查错误,例如检查变量值、冻结应用程序执行并检查上下文,或者在用户购物车中可视化筛选后的产品列表。我们可以通过两种方式实现:
- 使用日志并在各处注入 print() 语句
- 使用调试器并完全控制应用程序,而无需在所有控制器和帮助程序中编写非功能性代码。
Flask 内置了一个调试器,允许我们深入检查应用程序运行时的执行情况。Flask 通过扫描应用程序环境自动检测并启用调试器:
$ export FLASK_ENV=development
$ flask run
从 Python 代码运行时,应用程序对象接受调试变量作为参数:
app.run(debug=True)
此时,应用程序应该更多地以 DEBUG 模式运行。另一个有用的选项是使用调试器工具栏插件。
添加外部调试器工具栏
该插件提供有用的运行时信息,如 HTTP 标头、配置、渲染的模板和请求期间执行的 SqlAlchemy 查询。
启用这些功能非常简单。首先,我们需要安装插件(通过 PIP)。
$ pip install flask-debugtoolbar
下一步是在我们的 Flask 应用程序上使用该扩展:
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
# the toolbar is only enabled in debug mode:
app.debug = True
# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app) # <--- NEW
如果您的产品使用应用程序工厂模式来构建 Flask 应用程序,请使用以下代码片段:
...
# Initialize the Debug Toolbar
toolbar = DebugToolbarExtension() # <--- NEW
# Make sure the app has DEBUG enable
app = create_app()
# Inject the toolbar object in the Flask app object
toolbar.init_app(app) # <--- NEW
...
有关 Flask 调试的更多信息,请访问
✨ 4# - 如何设置 Flask-SQLAlchemy
Flask-SQLAlchemy 是流行的 SQLAlchemy Python 工具包的包装器,它使开发人员能够使用面向对象的方法管理数据库。
Flask-SqlAlchemy 所需的设置很少:
$ pip3 install flask_sqlalchemy
一旦安装了包,我们就可以在源代码中使用它:
from flask import Flask
# Import SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# Define the database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
# Inject SQLAlchemy magic
db = SQLAlchemy(app)
# Sample model handled by SqlAlchemy
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
为了在数据库中有效地创建用户表,我们需要使用 Flask CLI(参见下一节)
更多 SQLAlchemy 资源
- SQLAlchemy - 工具包页面
- Flask-SQLAlchemy - Flask 包装器文档
✨ 5# - 如何使用 Flask CLI
要使用 Flask CLI,FLASK_APP
环境变量应该指向应用程序引导脚本。一旦我们在工作环境中有了此变量,我们就可以启动 Flask 控制台并以不同的方式与我们的应用程序交互:
$ export FLASK_APP=app # adjust to match your entry point
$ flask shell
使用 CLI 我们可以创建上一节中定义的表:
$ flask shell
>>> from app import db #
>>> db.create_all() # All tables are created
使用 CLI 我们还可以选择和更新用户(或任何其他定义的表):
$ flask shell
>>> from app import User
>>> User.query.all()
[<User u'admin'>, <User u'guest'>]
如需更多资源,请访问:
✨ 6# - 如何迁移数据库
迁移意味着我们的数据库已经发生了变化:
- 添加了新表
- 现有表已更新为新列
- 现有列的类型已更改。例如,我们有一个存储 100 个字符的列,我们需要将其扩展为 500 个字符。
为了安全地更新数据库,我们需要“迁移”到新的结构。Flask Migrate插件可以帮我们免去这项繁琐的工作。
$ pip install Flask-Migrate
为了有效工作,Flask-Migrate 必须注入 Flask 对象:
...
app = Flask(__name__)
...
migrate = Migrate(app, db) # <- The magic line
如果我们第一次执行迁移,我们应该运行:
$ # This will create the migrations folder
$ flask db init
让我们用新字段更新用户模型: role
# Sample model handled by SqlAlchemy
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
# The new field
role = db.Column(db.Integer, primary_key=False)
要更新数据库,需要两个步骤:根据我们的更改生成 SQL 并将其应用于数据库。
生成 SQL
$ flask db migrate
更新数据库- 使用上一步生成的 SQL
$ flask db upgrade
此时,我们可以检查表格以直观地了解角色列的存在并在我们的代码中使用它。
资源
- Flask-Migrate - 官方模块文档
- Flask – 设置 Postgres、SQLAlchemy 和 Alembic - 关于这个热门话题的精彩教程
✨ 7# - 如何定义和使用表单
Flask 通过一个专用库 flask_wtf/ FlaskForm为我们提供了很多表单方面的帮助。使用这个包,我们可以轻松地定义、保护和验证表单。
以下是登录表单的定义:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
class LoginForm(FlaskForm):
username = StringField (u'Username' , validators=[DataRequired()])
password = PasswordField(u'Password' , validators=[DataRequired()])
如上所述,FlaskForm 带有重新定义的类型和验证器,用于密码、必填字段检查、电子邮件等。
使用它的视图(又名页面):
<form role="form" method="post" action="">
{{ form.username(placeholder="Username") }}
{{ form.password(placeholder="Password",type="password") }}
</form>
对于新手来说,下面介绍一种简化的 CSRF 机制:
- 服务器生成 CRSF 令牌
- 表单被创建并与令牌一起发送到客户端浏览器
- 用户填写并提交表单
- 服务器收到新的POST请求并检查CSRF token的真实性
- 如果令牌未通过验证,请求将被拒绝,并返回 403(未授权)状态
更多资源
- 在 Flask 中创建表单
- Flask 中的 CSRF 保护- 如何使用
✨ 8# - 如何在 Flask 中进行身份验证
Flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和记住用户会话的常见任务。
让我们重点介绍在实际应用程序中集成 Flask-Login 的代码。
更新你的 User 模型,使其继承UserMixin类。这是必要的,因为 Flask 要求用户模型至少实现一组处理程序:is_authenticated、is_active、get_id。为了省去这些麻烦,UserMixin类可以帮我们省去很多麻烦。
from app import db
from flask_login import UserMixin
# User model uses UserMixin as parent class
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
user = db.Column(db.String(64), unique = True)
email = db.Column(db.String(120), unique = True)
password = db.Column(db.String(500))
下一步是定义user_loader,它是Login-Manager用来识别当前已验证用户信息的方法:id、email 以及 User 类提供的所有其他字段。
...
# provide login manager with load_user callback
@lm.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
...
一旦我们在数据库中更新了用户表,我们就可以成功登录。
登录视图(又名登录页面):
...
<form method="post" action="" class="mt-4">
{{ form.hidden_tag() }}
{{ form.username(class="form-control") }}
{{ form.password(class="form-control", type="password") }}
<button type="submit" name="login">Sign in</button>
</form>
一旦用户填写用户名和密码,所有信息都会通过 POST 请求发送到服务器。
登录 - 控制器代码
# Authenticate user
@app.route('/login.html', methods=['GET', 'POST'])
def login():
# Declare the login form
form = LoginForm(request.form)
# The information returned to the user
msg = "Your cool!"
# Apply all validations defined in the form
if form.validate_on_submit():
# recover form information
username = request.form.get('username', '', type=str)
password = request.form.get('password', '', type=str)
# recover the user from database using username (unique information)
user = User.query.filter_by(user=username).first()
# If the user is found, validate the password
if user:
# BC = BCrypt library
if bc.check_password_hash(user.password, password):
# The user is now authenticated
login_user(user)
else:
msg = "Wrong password. Please try again."
else:
msg = "Unknown user"
return render_template( 'accounts/login.html', form=form, msg=msg )
控制器流程解释:
- 局部变量表单使用请求表单(由用户发送)进行初始化
- 如果表单有效(存在用户名和密码),代码将提取值
- 使用名称从数据库中选择用户
- 通过将数据库值与用户提供并由 BCrypt 库散列的值进行比较来检查密码。
- 如果一切顺利,则通过“login_user()”处理程序创建用户会话
- 错误情况会用消息标记,以告知用户出了什么问题。
Flask 身份验证资源:
- Flask-Login - 相关模块
- LoginManager类定义
✨ 9# - 如何读取 POST 数据
对于新手来说,POST 和 GET 是向服务器提交信息的不同方法。在 GET 请求期间,变量会附加到页面 URL 中:
GET/login.html?user=Biden&pass=MAGA2020
POST 请求使用请求体来捆绑用户提交的信息。
在这两种情况下,我们都可以通过请求对象轻松地使用 Flask 读取 POST 和 GET 参数。以下是一些可以参考并提取信息的请求对象列表:
- request.args:URL 查询字符串中的键/值对
- request.form:主体中的键/值对,来自 HTML 帖子表单
- request.json:解析后的 JSON 数据
真实样本- 用于处理注册流程
@app.route('/register.html', methods=['GET', 'POST'])
def register():
# declare the Registration Form
form = RegisterForm(request.form)
# request is GET - just display the form
if request.method == 'GET':
return render_template( 'accounts/register.html', form=form, msg=msg )
# Here we have a POST request
if form.validate_on_submit():
# READ information from a POST request
username = request.form.get('username', '', type=str)
password = request.form.get('password', '', type=str)
email = request.form.get('email' , '', type=str)
如上所述,复合request.form在请求主体中捆绑了键/值对来提供表单字段。
有关此主题的更多信息:
- Flask 请求 Args - 对象信息
- 获取 Flask 请求中收到的数据- 相关 StackOverflow 主题
✨ 10# - 如何在 Flask 中重定向
这很简单。Flask 暴露了一个“重定向”处理程序来让我们保持懒惰:
import os
from flask import Flask,redirect
app = Flask(__name__)
@app.route('/')
def not_me():
# redirect to another page
return redirect("/register")
# redirect to external page
return redirect("https://google.com")
# redirect with HTTP code
return redirect("https://google.com", code=301)
资源:
- Flask 重定向- 处理程序文档
- Flask 重定向示例- Full-Stack Python 提供的教程
✨ 11# - Flask 中的日志记录
Flask 使用原生的 Python 日志系统(无需配置)。要在请求期间记录消息,我们需要调用记录器接口并设置要在日志中显示的消息:
from flask import Flask
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)
@app.route('/')
def hello():
app.logger.info('Logging is up!')
return 'Hello World!'
if __name__ == '__main__':
app.run()
通过运行应用程序,我们应该在控制台中看到日志消息:
* Serving Flask app "app.py"
* Environment: development
INFO:werkzeug: * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
INFO:flask.app:Logging is up
INFO:werkzeug:127.0.0.1 - - [01/Jun/2019 17:03:09] "GET / HTTP/1.1" 200 -
当我们想要追踪生产中的运行时错误或在应用程序所有者的日志中保存其他相关事件时,日志可能会很有用。
上面的示例将日志推送到控制台,但我们可以轻松地将消息推送到文件:
from flask import Flask
import logging
app = Flask(__name__)
logging.basicConfig(filename='app.log', level=logging.DEBUG)
@app.route('/')
def hello():
app.logger.info('Logging is up!')
return 'Hello World!'
if __name__ == '__main__':
app.run()
第一次请求后,应该创建一个名为“app.log”的新文件,其中包含我们的日志消息作为内容。
Flask 日志资源
- Flask Logging - 官方模块文档
- Flask Logging - 快速入门- 一个很好的教程。
✨ 12# - 如何返回 JSON
Flask 通过jsonify接口原生支持 JSON 管理。我们来看看这个自描述的示例:
from flask import jsonify
@app.route('/_get_current_user')
def get_json():
return jsonify(
message="Hello",
from="from JSON"
)
浏览器中返回的输出应如下所示:
{
"message": "Hello",
"from": "from JSON"
}
一些有用的东西:让我们使用 JSON 格式返回一个注册用户:
from flask import jsonify
@app.route('/user_json')
def get_json():
user = User.query.filter_by(username='testme').first()
# Using the user object (without __dict__) will generate a runtime error
# TypeError: 'user' is not JSON serializable
return jsonify( user.__dict__ )
响应应包含用户表中定义的所有字段:
{
"id": "1",
"username": "testme",
"email":"test@google.com"
}
更多资源:
- Flask jsonify - 类文档
- 将类实例序列化为 JSON - 相关 StackOverflow 主题
✨ 13# - 如何在 Flask 中启用 CORS
当我们的 Flask 后端被解耦实体(如移动 UI 界面、推送或请求 Flask 后端提供的信息的外部系统)使用时,此功能很有用。
与往常一样,Flask 有一个用于此flask-cors 的模块。
$ Install the module via PIP
$ pip install -U flask-cors
我们来看看官方文档提供的示例:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello, cross-origin-world!"
我们还可以隔离特定路径(例如/api/*)的 CORS:
app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
@app.route("/api/v1/users")
def list_users():
return "user example"
CORS 资源
- Flask-CORS - 官方文档
- 什么是 CORS - Codecademy 提供的教程
✨ 14# - 访问app
对象
当我们使用多个文件编写 Flask 项目时,复杂性会增加,我们可能需要Flask app
在初始化期间访问项目构造的对象。我们可以通过访问current_app
Flask 本身提供的对象来轻松实现这一点。
from flask import Flask
from flask import current_app
from flask_cors import CORS
# This is the constructed bject
app = Flask(__name__)
current_app # here is the reference to "app" object
# we can do this in any file
✨ 15# - 开源示例
下面提到的所有项目都可以无需注册锁下载,并可用于无限制的业余爱好和商业项目。
🔥 Flask 软 UI
使用Flask Framework精心制作的免费仪表板,专为喜欢大胆元素和漂亮网站的用户而设计,Soft UI Dashboard 可以帮助您创建令人惊叹的网站和网络应用程序。
Flask Soft UI - 产品页面(包含 DEMO 和源代码)
🔥 Flask Pixel UI 套件
开源 Flask 入门套件,基于 Pixel Lite UI Kit 编写,包含基础模块、数据库、ORM 和部署脚本。Pixel Lite UI Kit 是一款响应式现代 Bootstrap 5 UI Kit,可帮助您构建富有创意的专业网站。Flask 代码库包含基础模块、数据库、ORM 和部署脚本。
Flask Pixel UI Kit - 产品页面(包含 DEMO 和源代码)
🔥达塔·艾布尔烧瓶
Datta Able Bootstrap Lite 是市面上所有精简/免费管理模板中最具风格化的 Bootstrap 4 Lite 管理模板。它拥有功能丰富的页面和组件,并完全以开发人员为中心。在开发 Datta Able 之前,我们的重点是性能和设计。
Datta Able Flask - 产品页面(包含 DEMO 和源代码)
🔥 Flask Bootstrap 5伏
Volt Dashboard 是一款免费开源的 Bootstrap 5 仪表板模板,包含 100 多个组件、11 个示例页面和 3 个使用 Vanilla JS 编写的插件。其中包含 100 多个免费的 Bootstrap 5 组件,包括按钮、警报、模态框、日期选择器等等。
Flask Bootstrap 5 Volt - 产品页面(包含 DEMO 和源代码)
🔥 Flask 仪表盘 黑色
Flask Black Dashboard是一款开源Flask Dashboard,由 AppSeed 基于现代深色主题 UI 生成。Black Dashboard是一款美观的 Bootstrap 4 管理仪表板,拥有大量可轻松组合的组件,外观惊艳。
Flask Dashboard Black - 产品页面(包含 DEMO 和源代码)
文章来源:https://dev.to/sm0ke/flask-a-list-of-useful-how-to-s-42m7感谢阅读!如需更多资源,请访问: