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.py python文件 用于编写flask框架

在终端中下载flask模块

pip install flask

在app.py中编写基本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)

启动flask项目 

在项目根目录下运行

python -m flask run

二、定义网页链接

基本代码

说明 

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

@app.route('/')

def hello_word():

    return 'Hello World!'

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

# 定义URL

@app.route('/profile')

def profile():

    return '我是个人中心'

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

@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')

     四、将数据传输给html

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

    使用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中赋值,将数据传输给前端

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

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

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

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

    @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>
    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>图书名称:{{book.name}} 图书作者:{{book.author}}
    </div>
    {%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模版 

    <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")
  • 获取get请求参数
  • 操作 URL(URL?key=value)中提交的参数可以使用args属性

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

     八、flash消息闪现

  • 常用于from表单验证
  • 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>

    九、文件上传

    十、Cookies相关操作

  • 读取Cookies
  • from flask import request
    
    @app.route('/')
    def index():
        username = request.cookies.get('username')
  • 存储Cookies
  • 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()函数,然后再修改它

    十一、重定向和错误

  • 使用redirect()函数可以重定向。使用abort()可以更早退出请求
  • 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()

    十二、响应 

  •  使用errorhandler()定制出错页面
  • 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

  • 使用make_response()包裹返回表达式
  • @app.errorhandler(404)
    def not_found(error):
        resp = make_response(render_template('error.html'), 404)
        resp.headers['X-Something'] = 'A value'
        return resp
  • 使用JSON格式的API
  • @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')

    十四、Flask使用SQL数据库

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

    作者:WDEP

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python-Flask框架

    发表回复