一、开发环境与准备
在使用 Flask 进行Web开发前,首先需要安装 Python 环境。 Python 是非常容易学习的一门编程语言,大量的资料和社区可以支持开发过程中的问题解决。
安装 Flask 可以使用 pip 安装:
pip install Flask
Flask 还需要安装其他插件(extensions)来增强它的功能。例如,Jinja2 用于模板引擎;Werkzeug 用于 HTTP 请求。
pip install Jinja2
pip install Werkzeug
二、路由与视图函数
Flask 的路由系统是其最重要的特性之一,路由系统负责让 Web应用响应 HTTP 请求。Flask 使用路由装饰器指定了一个视图函数来处理请求。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run()
这里定义了一个 simple 的路由,用于处理根路径 (“/”) 的请求,这个函数将返回一个字符串响应(”Hello World!”)。现在你可以访问 http://localhost:5000/ 来查看结果了!
三、模板引擎和模板
模板引擎可以极大地提高 Python web 应用的灵活性。 Flask 默认使用 Jinja2 这个流行的模板引擎。模板是一个带有扩展名的文件,其中包含静态文本和特定的动态部分,这些动态部分被称作变量,在使用时需要渲染这些变量。
在 Flask 应用中,可以使用 render_template
函数加载模板文件。下面是一个简单的例子:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='Homepage')
if __name__ == '__main__':
app.run()
这个例子定义了一个路由,当访问根路径时,将渲染 index.html 模板。在这个模板中,{{ title }}
是一个变量,可以在渲染时提供它的值。
四、表单
实际 Web 应用很少不涉及任何用户交互,其中表单是最常用、最基本的一种交互方式。在 Flask 中,表单的处理由 WTForms 提供支持。
WTForms 是一个灵活且易于使用的表单处理库,可以处理大多数 Web 应用程序需要的表单处理需求。 Flask-WTF 提供了一个集成到 Flask 应用程序中的 WTForms 扩展。
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
class NameForm(FlaskForm):
name = StringField('What is your name?', validators=[DataRequired()])
submit = SubmitField('Submit')
来看看这个例子。我们新建了一个 NameForm 类,继承与 FlaskForm 类。 StringField 对象表示一个文本字段,SubmitField 对象表示提交按钮。validators 参数是可选的,用于验证输入。
在实际视图函数中处理表单需要用到一些套路,代码如下:
from flask import Flask, render_template, session, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'
class NameForm(FlaskForm):
name = StringField('What is your name?', validators=[DataRequired()])
submit = SubmitField('Submit')
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))
if __name__ == '__main__':
app.run()
这个例子定义了一个新的路由,当它被访问时,它会展示一个表单并处理它。 validate_on_submit
方法处理 POST 请求。参数和例子代码的名称相符。如果表单验证通过,将会把 form.name.data 保存到 Flask 的 session 中。最后重定向回根页面(这听起来平庸却是一种常见的技巧,可以保证在刷新页面时,POST 请求不会被重复提交)。
五、数据库
Flask 为不同的数据库(如 MySQL、PostgreSQL 或 SQLite)提供了数据库驱动程序的支持。可以根据需要选择适当的扩展来连接到所需的数据库。
例如:使用 SQLAlchmey(一个 Python 全栈数据工具链)操作 SQLite 数据库的示例代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=False, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"\<User {self.username}\>"
@app.route('/')
def index():
db.create_all()
user = User(username='John', email='john@example.com')
db.session.add(user)
db.session.commit()
return 'Hello, World! The first user is added'
if __name__ == '__main__':
app.run()
在这个示例中,定义了一个 User 模型,在其中指定了表中各列的详细信息。这个模型继承自 SQLAlchemy 的 Model 类,要指定主键,只需要设置 primary_key=True
。我们的数据库地址:sqlite:///database.db,然后程序会自动创建表,并插入一条数据。
六、Docker 化
Docker 是一个应用程序容器引擎,用于轻松的开发、部署和运行虚拟化应用程序。它可以轻松的管理应用程序的依赖性和各种环境。让我们看看如何使用 Docker 部署 Flask 应用程序。
首先,在项目根目录下,创建一个 Dockerfile
文件:
FROM python:3.8-alpine
WORKDIR /app
COPY . .
RUN apk add --no-cache gcc musl-dev linux-headers
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python", "app.py"]
这个 Dockerfile 安装了 Python 3.8 的 Alpine Linux 版本(一个基于轻量级的 Linux 系统),然后在 /app 目录下复制工程文件。接下来,安装我们的依赖和将程序运行时所需要的依赖包打进一个单独的 tar 包里,以便在任何地方安装这些包。最后,将 5000 端口暴露并指定程序入口点。
最后,使用以下命令可以成功启动 Docker 镜像:
docker build -t flask .
docker run -d -p 5000:5000 flask
运行后访问 http://127.0.0.1:5000 即可。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/242348.html