当前位置:   article > 正文

Python-Flask框架_python flask

python flask

Flask是一个使用Python编写的轻量级 Web 应用框架。其WSGI工具箱采用 Werkzeug ,模版引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

flask中文文档:Flask 中文网

flask官网:Welcome to Flask — Flask Documentation (3.0.x)        

目录

一、创建一个Flask项目

在项目文件中创建基本文件

在终端中下载flask模块

在app.py中编写基本flask架构

启动flask项目 

二、定义网页链接

基本代码

在根路由下显示Hello Word!文字界面

在/profile路径下显示“我是个人中心” 

 在url上传blog_id后显示在网页上

 三、渲染静态文件

 四、将数据传输给html

第一种:指定数据传到指定html

第二种:将数据从url中传给html

 五、过滤器

 六、控制代码块

七、Web表单 

 八、flash消息闪现

九、文件上传

十、Cookies相关操作

十一、重定向和错误

十二、响应 

十三、Python中的中文字符编码问题


一、创建一个Flask项目

在项目文件中创建基本文件

基本文件
文件名文件类型说明
static文件夹用于存储静态文件
templates文件夹用于存放html文件
app.pypython文件用于编写flask框架

在终端中下载flask模块

pip install flask

在app.py中编写基本flask架构

详细说明:

引入flask模块

 from flask import Flask

使用Flask创建一个对象为app(可以不为app,默认是app) 

其中 “__name__”代表当前app.py这个模块

app = Flask(__name__)

创建一个根路由

@对象名.route('路由地址')

定义一个对象,返回页面中显示的数据

注意:一个路由只能有一个方法

  1. @app.route('/')
  2. def hello_word():
  3.     return 'Hello World3232323!'

执行文件

debug:是否自动更新(监听)

host:设置host地址

port:设置端口号

  1. if __name__ == '__main__':
  2.     app.run(debug=True,host='0.0.0.0',port=8080)

启动flask项目 

在项目根目录下运行

python -m flask run

二、定义网页链接

基本代码

说明 

在根路由下显示Hello Word!文字界面

  1. @app.route('/')
  2. def hello_word():
  3.     return 'Hello World!'

在/profile路径下显示“我是个人中心” 

  1. # 定义URL
  2. @app.route('/profile')
  3. def profile():
  4.     return '我是个人中心'

 在url上传blog_id后显示在网页上

  1. @app.route('/blog/<int:blog_id>')
  2. def blog_detail(blog_id):
  3.     return f'您访问的博客是:{blog_id}'

例如我的url为 http://127.0.0.1:5000/blog/1234

在网页上就会显示后面的1234,将url上的值传到了网页上

用get方法传值传到页面上

  1. @app.route('/book/list')
  2. def book_list():
  3.     page = request.args.get("page",default=1,type=int)
  4.     return f"您的获取的是第{page}的图书列表"

这里使用了flask模块下的request模块,发送的是一个page的值,默认为1,类型为int型

第一个参数值的名称
第二个参数:default默认值
第三个参数:type值的类型

 总结:这些一个个不同的路由地址构建成了一个庞大的网页链接

 三、渲染静态文件

  • 创建一个名为 static 的文件夹就行了。 静态文件位于应用的 /static 中
url_for('static', filename='style.css')

 四、将数据传输给html

第一种:指定数据传到指定html

使用flask模块下的render_template模块给指定网页传输数据

定义一个User 类包含名称和邮箱地址

  1. @app.route('/')
  2. def hello_word():
  3.     user = User(username="知网",email="xx@qq.com")
  4.     person = {
  5.         'username':'张三',
  6.         'email':'qisjidq张三@qq.com'
  7.     }
  8.     return render_template("index.html",user=user,person = person)

定义一个字典persn,在render_template中赋值,将数据传输给前端

在前端使用{{数据名称}}获取:

第二种:将数据从url中传给html

在该路由的方法中传值,然后渲染到指定网页上

格式:<转换器类型:传递的值>

  1. @app.route('/blog/<int:blog_id>')
  2. def blog_detail(blog_id):
  3.     # 给前端传blog_id数据
  4.   return render_template("blog_detail.html",blog_id=blog_id,username="知网" )
转换器类型
string接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串

注意:这里的HTML模版都应放在templates文件夹下

 五、过滤器

向前端传输数据

  1. @app.route('/filtter')#过滤器
  2. def filtter_demo():
  3. user = User(username="知网xxxx",email="xx@qq.com")
  4. mytime = datetime.now()
  5. //向前端返回filtter.html页面,并传user,mytime 值
  6. return render_template('filtter.html',user= user,mytime = mytime)

 在html中使用过滤器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>过滤器使用demo</title>
  7. </head>
  8. <body>
  9. //{{user.username|length}}渲染返回user.username长度
  10. <div> {{user.username}}---{{user.username|length}}</div>
  11. <div>{{mytime|dformat}}</div>
  12. </body>
  13. </html>
flask常见的内置过滤器
过滤器名称作用对象描述
safe字符串禁用转义
capitalize字符串把变量值的首字母转写成大写,其余字母转小写
lower字符串把值转成小写
upper字符串把值转成大写
title字符串把值中的每个单词的首字母都转成大写
reverse字符串字符串反转
format字符串格式化输出
striptags字符串渲染之前把值中所有的HTML标签都删掉
truncate字符串字符串截断
first列表取第一个元素
last列表取最后一个元素
length列表获取列表长度
sum列表列表求和
sort列表列表排序

 六、控制代码块

  • if判断
  1. <!-- if判断 -->
  2. {% if age>18%}
  3. <div> 您已经满18岁,可以进入网吧</div>
  4. {%elif age==18%}
  5. <div>您刚满18岁,需要父母陪同才能进入网吧</div>
  6. {%else%}
  7. <div>您未满18岁不能进入网吧</div>
  8. {%endif%}
  • for循环 
  1. {% for book in books%}
  2. <div>图书名称:{{book.name}} 图书作者:{{book.author}}
  3. </div>
  4. {%endfor%}

七、Web表单 

  • 使用Flask-WTF扩展处理Web表单
WTForms支持的HTML标准字段
字段对象说明
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一组指定类型的字段
WTForms常用验证函数
验证函数说明
DataRequired确保字段中有数据
EqualTo比较两个字段的值,常用于比较两次密码输入
Length验证输入的字符串长度
NumberRange验证输入的值在数字范围内
URL验证URL
AnyOf验证输入值在可选列表中
NoneOf验证输入值不在可选列表中

注意:使用Flask-WTF需要配置参数SECRET_KEY,CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密钥生成加密令牌

  • 常规实现from表单

HTML模版 

  1. <form action="" method="post">
  2. <label>用户名:</label><input type="text" name="username" id=""><br>
  3. <label>密码:</label><input type="text" name="password" id=""><br>
  4. <label>确认密码:</label><input type="text" name="password2" id=""><br>
  5. <input type="submit" value="提交"><br>
  6. </form>

Python 

  1. # methods=['GET','POST']判断请求的方式
  2. @app.route('/',methods=['GET','POST'])
  3. def Index():
  4. # 如果是POST请求就返回success
  5. if request.method == 'POST':
  6. # 获取请求的参数
  7. username = request.form.get('username')
  8. password = request.form.get('password')
  9. password2 = request.form.get('password2')
  10. # 判断参数是否完整;
  11. if not all([username,password,password2]):
  12. print( '参数不完整')
  13. elif password != password2:
  14. print ('两次密码不一致')
  15. else:
  16. return 'success'
  17. return render_template("static.html")
  • 获取get请求参数

操作 URL(URL?key=value)中提交的参数可以使用args属性

searchword = request.args.get('key', '')

 八、flash消息闪现

  • 常用于from表单验证
  1. from flask import Flask,render_template,request,flash
  2. from datetime import datetime
  3. app = Flask(__name__)
  4. app.secret_key = 'WDEP'#设置加密的key
  5. @app.route('/',methods=['GET','POST'])
  6. def Index():
  7. if request.method == 'POST':
  8. username = request.form.get('username')
  9. password = request.form.get('password')
  10. password2 = request.form.get('password2')
  11. if not all([username,password,password2]):
  12. #设置返回闪存消息
  13. flash(u'参数不完整') #使用flash消息闪现必须给app设置加密key
  14. elif password != password2:
  15. flash(u'两次密码不一致') #在字符串里面添加u,表示字符串是unicode编码
  16. else:
  17. return 'success'
  18. return render_template("static.html")
  19. if __name__ == '__main__':
  20. app.run(debug=True)
  1. <form action="" method="post">
  2. <label>用户名:</label><input type="text" name="username" id=""><br>
  3. <label>密码:</label><input type="text" name="password" id=""><br>
  4. <label>确认密码:</label><input type="text" name="password2" id=""><br>
  5. <input type="submit" value="提交"><br>
  6. #获取并显示闪存消息
  7. {% for message in get_flashed_messages() %} {{ message }} {% endfor %}
  8. </form>

九、文件上传

十、Cookies相关操作

  • 读取Cookies
  1. from flask import request
  2. @app.route('/')
  3. def index():
  4. username = request.cookies.get('username')
  • 存储Cookies
  1. from flask import make_response
  2. @app.route('/')
  3. def index():
  4. resp = make_response(render_template(...))
  5. resp.set_cookie('username', 'the username')
  6. return resp

注意: cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用make_response()函数,然后再修改它

十一、重定向和错误

  • 使用redirect()函数可以重定向。使用abort()可以更早退出请求
  1. from flask import abort, redirect, url_for
  2. @app.route('/')
  3. def index():
  4. return redirect(url_for('login'))
  5. @app.route('/login')
  6. def login():
  7. abort(401)
  8. this_is_never_executed()

十二、响应 

  •  使用errorhandler()定制出错页面
  1. from flask import render_template
  2. @app.errorhandler(404)
  3. def page_not_found(error):
  4. return render_template('page_not_found.html'), 404

注意: render_template()后面的404,这表示页面的状态码是404

  • 使用make_response()包裹返回表达式
  1. @app.errorhandler(404)
  2. def not_found(error):
  3. resp = make_response(render_template('error.html'), 404)
  4. resp.headers['X-Something'] = 'A value'
  5. return resp
  • 使用JSON格式的API
  1. @app.route("/me")
  2. def me_api():
  3. user = get_current_user()
  4. #返回一个dict,那么它会被转换为一个JSON响应
  5. return {
  6. "username": user.username,
  7. "theme": user.theme,
  8. "image": url_for("user_image", filename=user.image),
  9. }
  10. #或使用jsonify()函数
  11. @app.route("/users")
  12. def users_api():
  13. users = get_all_users()
  14. return jsonify([user.to_json() for user in users])

十三、中文字符编码问题

  1. #单个解决(在字符前面+u)
  2. flash(u'解决问题')
  3. #
  4. # 全局一次性解决编码问题
  5. import sys
  6. reload(sys)
  7. sys.setdefaultencoding('utf8')

十四、Flask使用SQL数据库

  • 使用flask-sqlalchemy操作数据库
pip install flask-sqlalchemy
  • 如果使用Mysql则需要安装mysqldb
pip install flask-mysqldb

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号