Flask是一个使用Python编写的轻量级 Web 应用框架。其WSGI工具箱采用 Werkzeug ,模版引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
flask中文文档:Flask 中文网
flask官网:Welcome to Flask — Flask Documentation (3.)
目录
一、创建一个Flask项目
在项目文件中创建基本文件
在终端中下载flask模块
在中编写基本flask架构
启动flask项目
二、定义网页链接
基本代码
在根路由下显示Hello Word!文字界面
在/profile路径下显示“我是个人中心”
在url上传blog_id后显示在网页上
三、渲染静态文件
四、将数据传输给html
第一种:指定数据传到指定html
第二种:将数据从url中传给html
五、过滤器
六、控制代码块
七、Web表单
八、flash消息闪现
九、文件上传
十、Cookies相关操作
十一、重定向和错误
十二、响应
十三、Python中的中文字符编码问题
一、创建一个Flask项目
在项目文件中创建基本文件
文件名 | 文件类型 | 说明 |
---|---|---|
static | 文件夹 | 用于存储静态文件 |
templates | 文件夹 | 用于存放html文件 |
python文件 | 用于编写flask框架 |
在终端中下载flask模块
pip install flask
在中编写基本flask架构
详细说明:
引入flask模块
from flask import Flask
使用Flask创建一个对象为app(可以不为app,默认是app)
其中 “__name__”代表当前这个模块
app = Flask(__name__)
创建一个根路由
@对象名.route('路由地址')
定义一个对象,返回页面中显示的数据
注意:一个路由只能有一个方法
@('/')
def hello_word():
return 'Hello World3232323!'
执行文件
debug:是否自动更新(监听)
host:设置host地址
port:设置端口号
if __name__ == '__main__':
(debug=True,host='0.0.0.0',port=8080)
启动flask项目
在项目根目录下运行
python -m flask run
二、定义网页链接
基本代码
说明
在根路由下显示Hello Word!文字界面
@('/')
def hello_word():
return 'Hello World!'
在/profile路径下显示“我是个人中心”
# 定义URL
@('/profile')
def profile():
return '我是个人中心'
在url上传blog_id后显示在网页上
@('/blog/<int:blog_id>')
def blog_detail(blog_id):
return f'您访问的博客是:{blog_id}'
例如我的url为 http://127.0.0.1:5000/blog/1234
在网页上就会显示后面的1234,将url上的值传到了网页上
用get方法传值传到页面上
@('/book/list')
def book_list():
page = ("page",default=1,type=int)
return f"您的获取的是第{page}的图书列表"
这里使用了flask模块下的request模块,发送的是一个page的值,默认为1,类型为int型
第一个参数 | 值的名称 |
第二个参数:default | 默认值 |
第三个参数:type | 值的类型 |
总结:这些一个个不同的路由地址构建成了一个庞大的网页链接
三、渲染静态文件
- 创建一个名为
static
的文件夹就行了。 静态文件位于应用的/static
中
url_for('static', filename='')
四、将数据传输给html
第一种:指定数据传到指定html
使用flask模块下的render_template模块给指定网页传输数据
定义一个User 类包含名称和邮箱地址
@('/')
def hello_word():
user = User(username="知网",email="xx@")
person = {
'username':'张三',
'email':'qisjidq张三@'
}
return render_template("",user=user,person = person)
定义一个字典persn,在render_template中赋值,将数据传输给前端
在前端使用{{数据名称}}获取:
第二种:将数据从url中传给html
在该路由的方法中传值,然后渲染到指定网页上
格式:<转换器类型:传递的值>
@('/blog/<int:blog_id>')
def blog_detail(blog_id):
# 给前端传blog_id数据
return render_template("blog_detail.html",blog_id=blog_id,username="知网" )
string | 接受任何不包含斜杠的文本 |
int | 接受正整数 |
float | 接受正浮点数 |
path | 类似 string ,但可以包含斜杠 |
uuid | 接受 UUID 字符串 |
注意:这里的HTML模版都应放在templates文件夹下
五、过滤器
向前端传输数据
@('/filtter')#过滤器
def filtter_demo():
user = User(username="知网xxxx",email="xx@")
mytime = ()
//向前端返回页面,并传user,mytime 值
return render_template('',user= user,mytime = mytime)
在html中使用过滤器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>过滤器使用demo</title>
</head>
<body>
//{{|length}}渲染返回长度
<div> {{}}---{{|length}}</div>
<div>{{mytime|dformat}}</div>
</body>
</html>
过滤器名称 | 作用对象 | 描述 |
---|---|---|
safe | 字符串 | 禁用转义 |
capitalize | 字符串 | 把变量值的首字母转写成大写,其余字母转小写 |
lower | 字符串 | 把值转成小写 |
upper | 字符串 | 把值转成大写 |
title | 字符串 | 把值中的每个单词的首字母都转成大写 |
reverse | 字符串 | 字符串反转 |
format | 字符串 | 格式化输出 |
striptags | 字符串 | 渲染之前把值中所有的HTML标签都删掉 |
truncate | 字符串 | 字符串截断 |
first | 列表 | 取第一个元素 |
last | 列表 | 取最后一个元素 |
length | 列表 | 获取列表长度 |
sum | 列表 | 列表求和 |
sort | 列表 | 列表排序 |
六、控制代码块
- if判断
<!-- if判断 -->
{% if age>18%}
<div> 您已经满18岁,可以进入网吧</div>
{%elif age==18%}
<div>您刚满18岁,需要父母陪同才能进入网吧</div>
{%else%}
<div>您未满18岁不能进入网吧</div>
{%endif%}
- for循环
{% for book in books%}
<div>图书名称:{{}} 图书作者:{{}}
</div>
{%endfor%}
七、Web表单
- 使用Flask-WTF扩展处理Web表单
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文件字段 |
DateField | 文本字段,值为文本格式 |
DateTimeField | 文本字段,值为文本格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为 |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMutipleField | 下拉列表,可选择多值 |
FileField | 文件上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
验证函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入的字符串长度 |
NumberRange | 验证输入的值在数字范围内 |
URL | 验证URL |
AnyOf | 验证输入值在可选列表中 |
NoneOf | 验证输入值不在可选列表中 |
注意:使用Flask-WTF需要配置参数SECRET_KEY,CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密钥生成加密令牌
- 常规实现from表单
HTML模版
<form action="" method="post">
<label>用户名:</label><input type="text" name="username" id=""><br>
<label>密码:</label><input type="text" name="password" id=""><br>
<label>确认密码:</label><input type="text" name="password2" id=""><br>
<input type="submit" value="提交"><br>
</form>
Python
# methods=['GET','POST']判断请求的方式
@('/',methods=['GET','POST'])
def Index():
# 如果是POST请求就返回success
if == 'POST':
# 获取请求的参数
username = ('username')
password = ('password')
password2 = ('password2')
# 判断参数是否完整;
if not all([username,password,password2]):
print( '参数不完整')
elif password != password2:
print ('两次密码不一致')
else:
return 'success'
return render_template("")
- 获取get请求参数
操作 URL(URL?key=value)中提交的参数可以使用args属性
searchword = ('key', '')
八、flash消息闪现
- 常用于from表单验证
from flask import Flask,render_template,request,flash
from datetime import datetime
app = Flask(__name__)
app.secret_key = 'WDEP'#设置加密的key
@('/',methods=['GET','POST'])
def Index():
if == 'POST':
username = ('username')
password = ('password')
password2 = ('password2')
if not all([username,password,password2]):
#设置返回闪存消息
flash(u'参数不完整') #使用flash消息闪现必须给app设置加密key
elif password != password2:
flash(u'两次密码不一致') #在字符串里面添加u,表示字符串是unicode编码
else:
return 'success'
return render_template("")
if __name__ == '__main__':
(debug=True)
<form action="" method="post">
<label>用户名:</label><input type="text" name="username" id=""><br>
<label>密码:</label><input type="text" name="password" id=""><br>
<label>确认密码:</label><input type="text" name="password2" id=""><br>
<input type="submit" value="提交"><br>
#获取并显示闪存消息
{% for message in get_flashed_messages() %} {{ message }} {% endfor %}
</form>
九、文件上传
十、Cookies相关操作
- 读取Cookies
from flask import request
@('/')
def index():
username = ('username')
- 存储Cookies
from flask import make_response
@('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
注意: cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用make_response()函数,然后再修改它
十一、重定向和错误
- 使用redirect()函数可以重定向。使用abort()可以更早退出请求
from flask import abort, redirect, url_for
@('/')
def index():
return redirect(url_for('login'))
@('/login')
def login():
abort(401)
this_is_never_executed()
十二、响应
- 使用errorhandler()定制出错页面
from flask import render_template
@(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
注意: render_template()后面的404,这表示页面的状态码是404
- 使用make_response()包裹返回表达式
@(404)
def not_found(error):
resp = make_response(render_template(''), 404)
['X-Something'] = 'A value'
return resp
- 使用JSON格式的API
@("/me")
def me_api():
user = get_current_user()
#返回一个dict,那么它会被转换为一个JSON响应
return {
"username": ,
"theme": ,
"image": url_for("user_image", filename=),
}
#或使用jsonify()函数
@("/users")
def users_api():
users = get_all_users()
return jsonify([user.to_json() for user in users])
十三、中文字符编码问题
#单个解决(在字符前面+u)
flash(u'解决问题')
#
# 全局一次性解决编码问题
import sys
reload(sys)
('utf8')
十四、Flask使用SQL数据库
- 使用flask-sqlalchemy操作数据库
pip install flask-sqlalchemy
- 如果使用Mysql则需要安装mysqldb
pip install flask-mysqldb