Flask诞生于2010年,是用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。
文章目录
一、Flask简介
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。
它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。
另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。
(一)flask的运作模式
Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上。
(二)flask的核心组件
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其
WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。
可以说Flask框架的核心就是Werkzeug和Jinja2。
(三)flask的扩展包
包名 | 用途 |
---|---|
Flask-SQLalchemy | 操作数据库 |
Flask-migrate | 管理迁移数据库 |
Flask-Mail | 邮件 |
Flask-WTF | 表单 |
Flask-script | 插入脚本 |
Flask-Login | 认证用户状态 |
Flask-RESTful | 开发REST API的工具 |
Flask-Bootstrap | 集成前端Twitter Bootstrap框架 |
Flask-Moment | 本地化日期和时间 |
二、使用flask
(一)安装flask
pip install flask
(二)第一个案例
创建一个flask项目,然后创建app.py文件。
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello Flask'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
启动项目,在浏览器访问,此时页面上就会有Hello Flask。
(三)步骤解析
1、初始化参数
# 创建flask的应用对象;
# __name__ flask以这个模块所在的目录为总目录,默认这个目录中static为静态目录,templates为模板目录
app = Flask(__name__,
static_url_path='/static', # 访问静态资源的url前缀,默认为static
static_folder='static', # 静态文件的目录,默认为static
template_folder='templates', # 模板文件的目录,默认为templates
)
2、配置参数
# 配置参数的使用方式(开启调试模式)
# 1.使用配置文件
app.config.from_pyfile("config.cfg") # 在项目下创建一个config.cfg文件,然后在里面写DEBUG=True
# 2.使用对象配置参数
class Config(object):
DEBUG = True
app.config.from_object(Config)
# 3.直接操作config的字典对象
app.config["DEBUG"] = True
3、app.run的参数
# 启动Flask程序
# app.run() # 默认127.0.0.1
# app.run(host="192.168.1.1", port=5000) # 使用电脑ip
app.run(host="0.0.0.0", port=5000, debug=True) # 配置host和port。设置0.0.0.0时都可以访问;可以在这里设置调试模式
三、重要的概念
(一)路由
使用 route() 装饰器来把函数绑定到 URL:
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
(二)使用变量
通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用<converter:variable_name>
,可以 选择性的加上一个转换器,为变量指定规则。
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % escape(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return 'Subpath %s' % escape(subpath)
其中转换器类型包括:
(三)URL 构建
url_for() 函数用于构建指定函数的 URL。它把函数名称作为第一个 参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。未知变量 将添加到 URL 中作为查询参数。
from flask import Flask, escape, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return '{}\'s profile'.format(escape(username))
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
(四)HTTP 方法
Web 应用使用不同的 HTTP 方法处理 URL 。当你使用 Flask 时,应当熟悉 HTTP 方法。 缺省情况下,一个路由只回应 GET 请求。 可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法::
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()
(五)静态文件
动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。理想情况下你的 服务器已经配置好了为你的提供静态文件的服务。但是在开发过程中, Flask 也能做好 这项工作。只要在你的包或模块旁边创建一个名为 static 的文件夹就行了。 静态文件位于应用的 /static
中。
使用特定的 ‘static’ 端点就可以生成相应的 URL。
url_for('static', filename='mystyle.css')
(六)渲染模板
使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
Flask 会在 templates
文件夹内寻找模板。
模板示例如下:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
四、操作请求数据
(一)获取请求对象
from flask import request
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template('login.html', error=error)
(二)文件上传
用 Flask 处理文件上传很容易,只要确保不要忘记在你的 HTML 表单中设置 enctype="multipart/form-data"
属性就可以了。否则浏览器将不会传送你的文件。
已上传的文件被储存在内存或文件系统的临时位置。你可以通过请求对象 files 属性来访问上传的文件。每个上传的文件都储存在这个 字典型属性中。这个属性基本和标准 Python file 对象一样,另外多出一个 用于把上传文件保存到服务器的文件系统中的 save() 方法。下例展示其如何运作:
from flask import request
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/' + secure_filename(f.filename))
(三)Cookies
要访问 cookies ,可以使用 cookies 属性。可以使用响应 对象 的 set_cookie 方法来设置 cookies 。请求对象的 cookies 属性是一个包含了客户端传输的所有 cookies 的字典。在 Flask 中,如果使用 会话 ,那么就不要直接使用 cookies ,因为 会话 比较安全一些。
读取 cookies:
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
保存 cookies:
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
(四)重定向
使用 redirect() 函数可以重定向。
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
(五)会话
session 的对象,允许你在不同请求 之间储存信息。这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它。
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return 'You are not logged in'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))
(六)消息闪现
Flask 通过闪现系统来提供了一个易用的反馈方式。闪现系统的基本工作原理是在请求结束时 记录一个消息。
flash() 用于闪现一个消息。在模板中,使用 get_flashed_messages() 来操作消息。
五、消息闪现案例
通过设计简单的帐号密码登录实现flash消息闪现的功能。当登录成功,就显示“登录成功”,否则显示“用户名或密码错误”
(一)先创建app.py文件
from flask import Flask,render_template,request,flash
app = Flask(__name__)
app.config["SECRET_KEY"] = 'dsdlfsdflsdfsdfdsf'
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if request.form['username'] != 'admin' or \
request.form['password'] != '1':
flash('用户名或密码错误')
else:
flash('登录成功')
# return redirect(url_for('index'))
return render_template('index.html')
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)
(二)创建模板文件(index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form method="post">
<dl>
<dt>用户名:
<dd><input type="text" name="username" value="{{request.form.username }}">
<dt>密码:
<dd><input type="password" name="password">
</dl>
<p><input type="submit" value="登录">
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>
(三)启动服务
当输入帐号为:admin且密码为1的时候,则显示登录成功,否则失败。
好的,至此,关于flask的基础知识已经初步介绍完毕,下一章节我将继续介绍flask与数据库的操作的博文,敬请期待。感谢各位的关注!
参考网站:https://dormousehole.readthedocs.io/en/latest/