赞
踩
Flask是一个使用Python编写的轻量级 Web 应用框架。其WSGI工具箱采用 Werkzeug ,模版引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
flask中文文档:Flask 中文网
目录
文件名 | 文件类型 | 说明 |
---|---|---|
static | 文件夹 | 用于存储静态文件 |
templates | 文件夹 | 用于存放html文件 |
app.py | python文件 | 用于编写flask框架 |
pip install flask
详细说明:
引入flask模块
from flask import Flask
使用Flask创建一个对象为app(可以不为app,默认是app)
其中 “__name__”代表当前app.py这个模块
app = Flask(__name__)
创建一个根路由
@对象名.route('路由地址')
定义一个对象,返回页面中显示的数据
注意:一个路由只能有一个方法
- @app.route('/')
-
- def hello_word():
-
- return 'Hello World3232323!'
执行文件
debug:是否自动更新(监听)
host:设置host地址
port:设置端口号
- if __name__ == '__main__':
-
- app.run(debug=True,host='0.0.0.0',port=8080)
在项目根目录下运行
python -m flask run
说明
- @app.route('/')
-
- def hello_word():
-
- return 'Hello World!'
- # 定义URL
-
- @app.route('/profile')
-
- def profile():
-
- return '我是个人中心'
- @app.route('/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方法传值传到页面上
- @app.route('/book/list')
-
- def book_list():
-
- page = request.args.get("page",default=1,type=int)
-
- return f"您的获取的是第{page}的图书列表"
这里使用了flask模块下的request模块,发送的是一个page的值,默认为1,类型为int型
第一个参数 | 值的名称 |
第二个参数:default | 默认值 |
第三个参数:type | 值的类型 |
总结:这些一个个不同的路由地址构建成了一个庞大的网页链接
static
的文件夹就行了。 静态文件位于应用的 /static
中url_for('static', filename='style.css')
使用flask模块下的render_template模块给指定网页传输数据
定义一个User 类包含名称和邮箱地址
- @app.route('/')
-
- def hello_word():
-
- user = User(username="知网",email="xx@qq.com")
-
- person = {
-
- 'username':'张三',
-
- 'email':'qisjidq张三@qq.com'
-
- }
-
- return render_template("index.html",user=user,person = person)
定义一个字典persn,在render_template中赋值,将数据传输给前端
在前端使用{{数据名称}}获取:
在该路由的方法中传值,然后渲染到指定网页上
格式:<转换器类型:传递的值>
- @app.route('/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文件夹下
向前端传输数据
- @app.route('/filtter')#过滤器
- def filtter_demo():
- user = User(username="知网xxxx",email="xx@qq.com")
- mytime = datetime.now()
- //向前端返回filtter.html页面,并传user,mytime 值
- return render_template('filtter.html',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>
- //{{user.username|length}}渲染返回user.username长度
- <div> {{user.username}}---{{user.username|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 age>18%}
- <div> 您已经满18岁,可以进入网吧</div>
- {%elif age==18%}
- <div>您刚满18岁,需要父母陪同才能进入网吧</div>
- {%else%}
- <div>您未满18岁不能进入网吧</div>
- {%endif%}
- {% for book in books%}
- <div>图书名称:{{book.name}} 图书作者:{{book.author}}
- </div>
- {%endfor%}
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文件字段 |
DateField | 文本字段,值为datetime.date文本格式 |
DateTimeField | 文本字段,值为datetime.datetime文本格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
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激活的时候,该设置会根据设置的密钥生成加密令牌
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']判断请求的方式
- @app.route('/',methods=['GET','POST'])
- def Index():
- # 如果是POST请求就返回success
- if request.method == 'POST':
- # 获取请求的参数
- username = request.form.get('username')
- password = request.form.get('password')
- password2 = request.form.get('password2')
- # 判断参数是否完整;
- if not all([username,password,password2]):
- print( '参数不完整')
- elif password != password2:
- print ('两次密码不一致')
- else:
- return 'success'
- return render_template("static.html")
操作 URL(URL?key=value)中提交的参数可以使用args属性
searchword = request.args.get('key', '')
- from flask import Flask,render_template,request,flash
- from datetime import datetime
-
- app = Flask(__name__)
- app.secret_key = 'WDEP'#设置加密的key
- @app.route('/',methods=['GET','POST'])
- def Index():
- if request.method == 'POST':
- username = request.form.get('username')
- password = request.form.get('password')
- password2 = request.form.get('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("static.html")
-
- if __name__ == '__main__':
- app.run(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>
- from flask import request
-
- @app.route('/')
- def index():
- username = request.cookies.get('username')
- from flask import make_response
-
- @app.route('/')
- def index():
- resp = make_response(render_template(...))
- resp.set_cookie('username', 'the username')
- return resp
注意: cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用make_response()函数,然后再修改它
- from flask import abort, redirect, url_for
-
- @app.route('/')
- def index():
- return redirect(url_for('login'))
-
- @app.route('/login')
- def login():
- abort(401)
- this_is_never_executed()
- from flask import render_template
-
- @app.errorhandler(404)
- def page_not_found(error):
- return render_template('page_not_found.html'), 404
注意: render_template()后面的404,这表示页面的状态码是404
- @app.errorhandler(404)
- def not_found(error):
- resp = make_response(render_template('error.html'), 404)
- resp.headers['X-Something'] = 'A value'
- return resp
- @app.route("/me")
- def me_api():
- user = get_current_user()
- #返回一个dict,那么它会被转换为一个JSON响应
- return {
- "username": user.username,
- "theme": user.theme,
- "image": url_for("user_image", filename=user.image),
- }
-
-
- #或使用jsonify()函数
- @app.route("/users")
- def users_api():
- users = get_all_users()
- return jsonify([user.to_json() for user in users])
- #单个解决(在字符前面+u)
- flash(u'解决问题')
-
- #
- # 全局一次性解决编码问题
- import sys
- reload(sys)
- sys.setdefaultencoding('utf8')
pip install flask-sqlalchemy
pip install flask-mysqldb
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。