• Flask基础学习笔记


    环境的搭建

    检查Python环境

    方法一:终端命令行下输入 Python
    方法二:终端命令行输入 python -V
    注意:Python版本最好是当前最新版本(最低不能低于3.7)

    python
    python -V
    
    • 1
    • 2

    在这里插入图片描述

    创建虚拟环境

    1. 创建项目文件
    2. 进入项目文件
    3. 创建虚拟环境
    $ mkdir myproject
    $ cd myproject
    $ python3 -m venv venv
    
    • 1
    • 2
    • 3

    注意: 创建完虚拟环境后项目文件下回多出venv文件夹
    在这里插入图片描述

    激活虚拟环境

    在终端命令行窗口中执行

    . venv/bin/activate
    #或者使用一下代码激活虚拟环境
    source venv/bin/activate
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    安装Flask

    pip install Flask
    
    • 1

    pip freeze 检查安装版本号

    一个简单的实例

    1. 创建Python文件
    2. 导入Flask类
    3. 创建一个该Flask类的实例
    4. 用装饰器route告诉Flask触发URL
    5. 运行flask
      注意:这里Python文件名如果是app.py或者wsgi.py可以不用设置FLASK_APP环境变量
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        return "

    Hello

    "
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    $ export FLASK_APP=hello
    $ flask run
    
    • 1
    • 2

    路由

    作用使用有意义的URL方便用户记忆

    
    from flask import Flask
    app=Flask(__name__)
    #路由index,跳转index路由页面
    @app.route('/index')
    def index():
        return '

    index

    '
    #路由home,跳转home路由页面 @app.route('/home') def home(): return '

    home

    '
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    路由变量规则

    1. 服务端接受刻画段传递参数
      客户端通过URL向服务器传递参数时通过这种形式传递.其中value_name是要传递的变量名
    
    from flask import Flask
    app=Flask(__name__)
    @app.route('/index/')
    def index(name):
        return '

    index,接受的值为{}

    '
    .format(name)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    2. 服务端要求客户端传递某一种数据类型参数
    客户端通过URL向服务器传递某一种类型参数其中value_type是变量数据类型value_name变量名称

     
    from flask import Flask
    app=Flask(__name__)
    @app.route('/index/')
    def index(name):
        return '

    index,接受的值为{}

    '
    .format(name)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    开启调试模式(debug)

    调试模式默认是禁用的

    1. 命令行启动debug
    (venv) $ export FLASK_APP=hello.py
    (venv) $ export FLASK_DEBUG=1
    (venv) $ flask run
    
    • 1
    • 2
    • 3
    1. app.run()方式启动debug

    app.run(debug=True)

    
    from flask import Flask
    app=Flask(__name__)
    @app.route('/index/')
    def index(name):
        return '

    index,接受的值为{}

    '
    .format(name) @app.route('/home/') def home(cname): return '

    home{}

    '
    .format(cname) if __name__=="__main__": app.run(debug=True)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    请求-响应循环

    1. 导入上下文包
    2. 激活上下文
    3. 请求上下文
    from manage import app
    #请求上下文包
    from flask import current_app
    #激活上下文
    app_ctx=app.context()
    #自动获取上下文
    app_ctx.push()
    #请求上下文
    current_app.name
    #关闭请求上下文
    app_ctx.pop()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    请求分派

    flask通过app.route装饰器或者app.add_url_rule()方法构建URL
    通过app.url_map查询flask创建路由情况,客户端对应请求方式, 视图函数

    flask 常用的请求对象

    属性方法说明
    form一个字典,存储请求提交的所有表单字段
    args“一个字典,存储通过 URL 查询字符串传递的所有参数”
    values“一个字典,form 和 args 的合集
    cookies“一个字典,存储请求的所有 cookie”
    headers“一个字典,存储请求的所有 HTTP 首部”
    files一个字典,存储请求上传的所有文件
    get_data()返回请求主体缓冲的数据
    get_json()返回一个 Python 字典,包含解析请求主体后得到的 JSON
    blueprint处理请求的 Flask 蓝本的名称
    endpoint处理请求的 Flask 端点的名称
    methodHTTP 请求方法,例如 GET 或 POST
    schemeURL 方案(http 或 https )
    is_secure()通过安全的连接(HTTPS)发送请求时返回 True

    请求钩子

    在请求开始之前或者之后代码会很有用,例如:我们要创建数据库链接或者发起用户的身份认证
    注册函数 作用是为了比避免在每视图函数中重复调用
    注册函数根据请求分配到视图函数
    4种请求钩子(注册函数)

    1. before_request—>>注册一个函数在每次请求之前
    2. before_first_request —>> 注册一个函数,在第一次请求之前
    3. after_request —>> 注册一个函数在,没有报错前提下,每次请求执行完毕后执行
    4. teardown_request —>> 注册一个函数,即使在报错情况下,请求完毕后也 执行

    响应

    在客户端发出请求后Flask调用视图函数后,返回内容叫做响应
    响应状态码 返回响应需要使用不同的状态码用来表示请求是否有效

    返回响应对象

    通过make_response()返回一个响应对象

    #引入包
    from flask import Flask,make_response
    app=Flask(__name__)
    #创造响应对象
    @app.route('/home')
    def home():
        response=make_response('

    this document Carries a cookie

    '
    ) return response
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    响应对象常见属性方法

    属性方法说明
    tatus_codeHTTP 数字状态码
    headers一个类似字典的对象,包含随响应发送的所有首部
    set_cookie()为响应添加一个 cookie
    delete_cookie()删除一个 cookie
    content_length响应主体的长度
    content_type响应主体的媒体类型
    set_data()使用字符串或字节值设定响应
    get_data()获取响应主体

    ##响应重定向
    作用 告诉浏览器一个新的URL,加载新的页面
    状态码 302

    from flask import Flask,redirect
    app=Flask(__name__)
    @app.route('/')
    def main():
        return redirect('http://www.baidu.com')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    abort()响应用于处理错误

    使用情况 如果需要做用户id认证判断是否为真实用户
    abort判断不是真实用户会从服务器端直接终止响应

    from flask import abort
    @app.route('/usr/')
    def usr(id):
        if str(id)!="hello":
            abort(401)
        return "

    输入id为{}

    "
    .format(id)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    模板

    给Flask实例传递一个关键字参数template_folder,指定具体的路径用来改变模板路径

    from flask import Flask 
    app=Flask(__name__,template_folder='./templates')
    
    • 1
    • 2

    基本使用

    1. 在templates文件中创建要渲染的html文件
    2. 导入render_template 包
    3. 在视图函数中返回render_template(‘path’)path返回给客户端html文件路径
    from flask import Flask,render_template
    app=Flask(__name__,template_folder='./templates')
    
    @app.route('/')
    def home():
      
        return render_template('main.html')
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    视图函数—>>html文件传递参数

    1. 通过变量的形式html_name=def_value
      html_name html中要渲染的参数
      def_value 视图函数中变量名
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
        <h1>{{name}}h1>
    body>
    html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        id='hello'
       
        return render_template('main.html',name=id)
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 通过字典的形式
      render_template(‘path’,**context)
      **context 其中context 是传递的字典变量名
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
        <h1>{{name}}h1>
        <h1>{{age}}h1>
        <h1>{{sex}}h1>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        context={
            'name':'zhangsan',
            'age':18,
            'sex':'男'
        }
        return render_template('main.html',**context)
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    模板过滤器

    语法:{{name|filt_name}}
    name变量名
    filt_name 过滤器名称

    过滤器名称说明
    safe渲染值时不转义
    capitalize把值的首字母转换成大写,其他字母转换成小写
    lower把值转换成小写形式
    upper把值转换成大写形式
    title把值中每个单词的首字母都转换成大写
    trim把值的首尾空格删掉
    striptags渲染之前把值中所有的 HTML 标签都删掉
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
        <h1>{{name|length}}h1>
        <h1>{{age}}h1>
        <h1>{{sex}}h1>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        context={
            'name':'zhangsan',
            'age':18,
            'sex':'男'
        }
        return render_template('main.html',**context)
    
    if __name__=='__main__':
        app.run(debug=True)
    在这里插入代码片
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    if判断语句

    模板
    {%if 判断语句%}
    代码块
    {%elif判断语句%}
    代码块
    {%else%}
    代码块
    {%endif%}

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
        {% if age > 10 %}
        <h1>大于10h1>
        {%elif age <10%}
        <h1>小于10h1>
        {%else%}
        <h1>既不小于10也不大于10h1>
        {%endif%}
        <h1>h1>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        context={
            'name':'zhangsan',
            'age':18,
        }
        return render_template('main.html',**context)
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    循环语句

    列表循环

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
       {%for i in PhoneNumber %}
       <ul>
           <li>电话号码:{{i}}li>
       ul>
       {%endfor%}
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        context={
            'name':'zhangsan',
            'age':18,
            'sex':'男',
            'PhoneNumber':[188888888888,13312341234,18999999999]
        }
        return render_template('main.html',**context)
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    字典循环

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
       {%for key,value in msg.items() %}
       <ul>
           <li>{{key}}---->>>>{{value}}li>
       ul>
       {%endfor%}
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    from multiprocessing import context
    from flask import Flask,render_template
    app=Flask(__name__)
    
    @app.route('/')
    def home():
        context={
            'name':'zhangsan',
            'age':18,
            'sex':'男',
            'PhoneNumber':[188888888888,13312341234,18999999999],
            'msg':{'学号':'0927','班级':'三年级二班',}
        }
        return render_template('main.html',**context)
    
    if __name__=='__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    宏定义

    模板继承

    1. 定义父模板(基础模板)
    2. 在基础模板中使用blockendbock指令定义内容区块
    3. 子模板(衍生模板)中使用extends继承基础模板
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title> {% block title %}{% endblock %} title>
    head>
    <body>
        <ul>
            <li>
                <a href="/">首页a>
            li>
            <li>
                <a href="/blog">博客a>
            li>
            <li>
                <a href="/msg">信息a>
            li>
        ul>
        {% block body %}{% endblock %}
        <footer style="background-color: rgba(29, 29, 59, 0.333);">我是底部footer>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    {% extends 'father.html' %}
    {% block title %}
    个人信息   
    {% endblock %}
    {% block body %}
    <h1>我的个人信息h1>
    {% endblock %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    模板引用

    1. 在基础模板写好HTMl代码
    2. 在衍生模板中使用{%include‘基础模板名称’%}
    
    <a href="/">首页a>
    <a href="/blog">博客a>
    <a href="/msg">个人信息a>
    
    • 1
    • 2
    • 3
    • 4
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title> {% block title %}{% endblock %} title>
    head>
    <body>
        {% include 'navigation.html'   %}
        {% block body %}{% endblock %}
        <footer style="background-color: rgba(29, 29, 59, 0.333);">我是底部footer>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Web 表单

    虚拟环境下安装依赖

    (venv) $ pip install flask-wtf
    
    • 1

    配置防盗秘钥

    SECRTE_KEY可以是任意字符串

    app = Flask(__name__)
    #配置秘钥
    app.config['SECRET_KEY']='这是一个防止CSRF秘钥'
    
    • 1
    • 2
    • 3

    定义表单类

    1. 创建表单类
    2. 表单渲染HTML—>>客户端
    3. 客户端提交表单---->>服务器
    4. 处理客户端提交表单---->>返回给客户端
    #引入flask_wtf中FlaskForm类
    from flask_wtf import FlaskForm
    #引入字段属性包如StringField是type=text
    from wtforms import StringField,SubmitField
    #引入校验器
    from wtforms.validators import DataRequired
    #创建子类继承FlaskForm父类
    class NameForm(FlaskForm):
        iname=StringField('What is you name?',validators=[DataRequired()])
        submit=SubmitField('提交')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    二实例化列表传给客户端

    @app.route('/',methods=['GET','POST'])
    def index():
        #实例化定义的form表单
        form=NameForm()
        name=None
        #验证表单是否被提交
        if form.validate_on_submit():
    
            name=form.iname.data
            form.iname.data=''
        return render_template('index.html',form=form,name=name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    逻辑漏洞——忘记密码、重置密码(案例分析、原理)
    阿里云/腾讯云国际站代理:阿里云服务器介绍
    【无标题】scp的使用
    关于一个图算法的应用
    【Android Framework系列】第15章 Fragment+ViewPager与Viewpager2相关原理
    RabbitMQ事务消息
    【SQL相关实操记录】
    Redis的数据结构之bitmap
    leetcode 13. Roman to Integer(罗马字母转数字)
    第十九章Java绘图
  • 原文地址:https://blog.csdn.net/weixin_45764245/article/details/126191307