Python-Flask框架

时间:2025-01-20 09:34:43

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>
flask常见的内置过滤器
过滤器名称 作用对象 描述
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表单
WTForms支持的HTML标准字段
字段对象 说明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文件字段
DateField 文本字段,值为文本格式
DateTimeField 文本字段,值为文本格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为
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模版 

<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