对,你没有看错,上图就代表Flask。那么Flask为何方神物?
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
相对于同类框架,Flask框架显得更为灵活,轻便,安全且极容易上手!
一,上手之前先配置环境变量
Windows用户直接在dos窗口或pycharm下面的Terminal中输入如下命令即可:
pip install flask
二,一个例子说明Flask ‘轻’ 在何处?
注:建议新建一个python项目
from flask import Flask
app = Flask(__name__) # 创建一个Flask对象
@app.route('/study') # 使用 route() 装饰器来告诉 Flask 触发函数的 URL
def study():
return "<h1>Hello Word!</h1>"
app.run() # 启动服务
pycharm中直接右键run运行即可
注:从上图运行结果可知Flask的默认端口为5000, 而Django的默认端口为8000, Tornado的默认端口为8888;
寥寥六行代码,即可跑起来,你敢说它不‘轻’?
三,简单地上手一个用户管理系统
其实,假如你对Django框架有所了解,再学习Flask便会显得十分从容。
1,实现简单地用户登录
from flask import Flask, request, render_template
app = Flask(__name__) # 创建一个Flask对象
@app.route('/login', methods=['GET', 'POST', ]) # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
if request.method == "GET": # 如果发送的是GET请求
return render_template('login.html') # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
else:
user = request.form.get('username') # request.form.get()表示通过post方式获取值
pwd = request.form.get('password')
if user == 'hpl' and pwd == '123456':
return "<h1>恭喜您登录成功!</h1>"
else:
return render_template('login.html', error='用户名或密码错误!')
app.run(debug=True) # 启动服务 debug=True 表示启动debug调式
在根目录下创建一个名为templates的文件夹,用户放置模板(和Django中类似);并在下面创建一个login.html文件,其中的内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎来到登陆页面</title>
</head>
<body>
<h1>登录</h1>
<form action="" method="post">
<p>
<label for="">用户名:</label>
<input type="text" name="username">
</p>
<p>
<label for="">密码:</label>
<input type="password" name="password">
<span style="color:red;">{{ error }}</span>
</p>
<button>提交</button>
</form>
</body>
</html>
run一下,结果为:
当用户名或密码错误时:
当用户名和密码正确时:
2,将用户的登录信息放入session中
from flask import Flask, request, render_template, session
app = Flask(__name__) # 创建一个Flask对象
app.secret_key = 'jkdfgd' # 相当于加盐(里面的内容随便写)
@app.route('/login', methods=['GET', 'POST', ]) # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
if request.method == "GET": # 如果发送的是GET请求
return render_template('login.html') # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
else:
user = request.form.get('username') # request.form.get()表示通过post方式获取值
pwd = request.form.get('password')
# 将用户信息放入session
session['user_information'] = user
if user == 'hpl' and pwd == '123456':
return "<h1>恭喜您登录成功!</h1>"
else:
return render_template('login.html', error='用户名或密码错误!')
app.run(debug=True) # 启动服务 debug=True 表示启动debug调式
再次登录后,如下图
3,显示用户基本信息和详情信息
from flask import Flask, request, render_template, session, redirect
USER_DICT = {
'1': {'name': '光头强', 'age': 30, 'sex': '男', 'address': '团结屯'},
'2': {'name': '大马猴', 'age': 25, 'sex': '男', 'address': '未知'},
'3': {'name': '二狗子', 'age': 26, 'sex': '男', 'address': '未知'},
'4': {'name': '李老板', 'age': 42, 'sex': '男', 'address': '大都市'},
'5': {'name': '翠花', 'age': 18, 'sex': '女', 'address': '森林'},
}
app = Flask(__name__) # 创建一个Flask对象
app.secret_key = 'jkdfgd' # 相当于加盐(里面的内容随便写)
@app.route('/login', methods=['GET', 'POST', ]) # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
if request.method == "GET": # 如果发送的是GET请求
return render_template('login.html') # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
else:
user = request.form.get('username') # request.form.get()表示通过post方式获取值
pwd = request.form.get('password')
# 将用户信息放入session
session['user_information'] = user
if user == 'hpl' and pwd == '123456':
return redirect('/index') # 重定向(和Django中类似)
else:
return render_template('login.html', error='用户名或密码错误!')
@app.route('/index', methods=['GET', ], endpoint='index') # 同Django中的name,用于反向解析
def index():
user_info = session.get('user_information')
if not user_info:
return redirect('/login')
return render_template('index.html', user_dict=USER_DICT)
@app.route('/detail', methods=['GET', ], endpoint='detail')
def detail():
user_info = session.get('user_information')
if not user_info:
return redirect('/login')
user_id = request.args.get('user_id')
info = USER_DICT.get(user_id)
return render_template('detail.html', info=info)
app.run(debug=True) # 启动服务 debug=True 表示启动debug调式
在templates文件夹下创建index.html文件和detail.html文件
index.html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息</title>
</head>
<body>
<h2>用户信息</h2>
<table border="1px" cellspacing="0" cellpadding="5px">
<thead>
<tr>
<th>姓名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for k,v in user_dict.items() %}
<tr>
<td>{{ v.name }}</td>
<td><a href="/detail?user_id={{ k }}">查看详情</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
detail.html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>信息详情展示页</title>
</head>
<body>
<h1>详情信息</h1>
<table border="1px" cellpadding="5px" cellspacing="0">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>住址</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ info.name }}</td>
<td>{{ info.age }}</td>
<td>{{ info.sex }}</td>
<td>{{ info.address }}</td>
</tr>
</tbody>
</table>
</body>
</html>
结果为
4,退出登录
from flask import Flask, request, render_template, session, redirect
USER_DICT = {
'1': {'name': '光头强', 'age': 30, 'sex': '男', 'address': '团结屯'},
'2': {'name': '大马猴', 'age': 25, 'sex': '男', 'address': '未知'},
'3': {'name': '二狗子', 'age': 26, 'sex': '男', 'address': '未知'},
'4': {'name': '李老板', 'age': 42, 'sex': '男', 'address': '大都市'},
'5': {'name': '翠花', 'age': 18, 'sex': '女', 'address': '森林'},
}
app = Flask(__name__) # 创建一个Flask对象
app.secret_key = 'jkdfgd' # 相当于加盐(里面的内容随便写)
@app.route('/login', methods=['GET', 'POST', ]) # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
if request.method == "GET": # 如果发送的是GET请求
return render_template('login.html') # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
else:
user = request.form.get('username') # request.form.get()表示通过post方式获取值
pwd = request.form.get('password')
# 将用户信息放入session
session['user_information'] = user
if user == 'hpl' and pwd == '123456':
return redirect('/index')
else:
return render_template('login.html', error='用户名或密码错误!')
@app.route('/index', methods=['GET', ], endpoint='index')
def index():
user_info = session.get('user_information')
if not user_info:
return redirect('/login')
return render_template('index.html', user_dict=USER_DICT)
@app.route('/detail', methods=['GET', ], endpoint='detail')
def detail():
user_info = session.get('user_information')
if not user_info:
return redirect('/login')
user_id = request.args.get('user_id')
info = USER_DICT.get(user_id)
return render_template('detail.html', info=info)
@app.route('/logout', methods=['GET', ])
def logout():
del session['user_information'] # 删除session即可退出登录
return redirect('/login')
app.run(debug=True) # 启动服务 debug=True 表示启动debug调式
更多详细内容,见Flask开发文档:https://dormousehole.readthedocs.io/en/latest/