flask学习记录


flask程序的基本结构

1.终端启动flask服务

cmd下
set FLASK_APP=XXX.py
set FLASK_ENV=development(调试模式)

powershell下
$env:FLASK_APP="test.py"
$env:FLASK_ENV="development"

启动任意地址访问
flask run --host=0.0.0.0

2.初始化

所有flask程序都必须创建一个程序实例,web服务器使用一种web服务器网关接口(Web Server Gateway Interface,WSGI)协议,把接收到客户端的所有请求都转交给这个对象处理,程序实例是Flask类的对象

#创建flask实例
from flask import Flask
app=Flask(__name__)

Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字

参数使用__name__的原因是这个参数可以决定程序的根目录,以便后续资源定和寻找

3. 路由和视图函数

  1. 路由和视图函数

    因为在flask中,客户端把请求发送到web服务器,web服务器把请求发送到flask程序实例中,因此程序实例需要知道每个url请求了什么样的内容(代码),所以需要保存url到python函数的映射关系,而处理url和函数之间关系的程序称为==路由==

    在flask中,最简便的定义路由的方法是通过程序实例提供的app.route修饰器,,把修饰的函数注册为路由

    #将index()函数注册为Flask程序实例根地址,
    @app.route('/')
    def index():
        return '<h1>Hello World</h1>'

    index()函数即为==视图函数==,视图函数返回的可以是包含HTML的简单字符串,也可以是复杂的表单

  2. 让url中包含可变成分

    flask中可以在route修饰器中使用句法即可实现可变url

    @app.route('/hello/<test>')
    def b(test):
        return f'1---{test}'

    使用<>来获取动态内容,任何能匹配静态部分的url都会映射到这个路由上。通过在视图函数添加参数,可以让flask将动态部分作为参数传入函数

    路由中的动态部分默认使用字符串,但可以认为指定数据类型

    @app.route('/hello/<int:test>')   #(缺省值)接受字符串
    @app.route('/hello/<int:test>')   #接受正整数
    @app.route('/hello/<float:test>') #接受正浮点数
    @app.route('/hello/<path:test>')  #接受路径数据(可以包含斜线)
    @app.route('/hello/<uuid:test>')  #接收UUID(通用唯一识别码)字符串
  3. 启动flask服务器

    实例程序使用run()启动Flask集成的开发web服务器

    if __name__=='__main__':
        app.run(debug=True)
    #判断name的目的是防止被别的模块调用运行,比如父级脚本启动不同的服务器,使用这个可以避免被父级启动

    服务启动后,会进入轮询,等待并处理请求。设置debug=True开启调试模式(激活调试器和重载程序),还可以添加host参数,当host=0.0.0.0时,表示接受任意主机访问

4. 请求响应循环

  1. 程序和请求上下文

    flask收到请求时,需要对请求通过视图函数进行处理,请求对象封装了客户端发送的http请求,将请求对象作为参数传入视图函数中,从而访问请求对象。但为了避免大量参数传入视图函数中,==flask使用上下文临时把某些对象变为全局可访问==

    flask使用上下文让特定的变量在一个线程中全局可访问,但不会干扰其他线程

    flask中有两种上下文

    变量名 上下文 说明
    current_app 程序上下文 一个被激活的程序的实例
    g 程序上下文 保存一次请求的东西,在下一次请求发起后失效
    request 请求上下文 封装http请求中的内容
    session 请求上下文 保存客户端身份认证相关的东西

    上下文可以理解为一种环境,通过环境来完成下一步工作,类似于语文中的阅读理解,从上下文中获取想要的信息

  2. 请求调度

    使用app.route装饰器或app.add_url_rule()生成映射

    补充:https://www.cnblogs.com/eric-nirnava/p/endpoint.html#:~:text=endpoint%20%E2%80%93%20the%20endpoint%20for%20the%20registered%20URL,to%20be%20forwarded%20to%20the%20underlying%20Rule%20object.

    https://www.cnblogs.com/594504110python/p/10131950.html

    app.url_map()查看当前所有路由和函数映射

    其中/static是flaks添加的特殊路由,用来访问静态文件

  3. 请求钩子

    通过装饰器实现,具体可参考如下文章https://www.jianshu.com/p/971e80c0c8f1

  4. 响应

    可以将返回状态码作为return的第二个参数
    return "Nothing",404
  5. 重定向

    return redirect('https://xxx.com')
  6. 错误处理

    return abort(状态码)

模板

1. 补充:

在url中包含可变参数,尖括号中的内容为可变参数

@app.route("/test/<userId>")
def test(userId):
    return "this is %s" % userId

2. 引入模板

模板文件统一放在项目中的templates目录下

from flask import render_templa

@app.route("/<name>")
def test(name):
    return render_template('test.html',name=name)

模板内容举例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title{{name}}</title>
</head>
<body>
<h1>this is {{name}}</h1>
</body>
</html>
  1. 过滤器

    可以在模板内通过过滤器来改变变量

    常见过滤器

    safe 渲染时不转义
    capitalize 首字母大写,其他小写
    lower 值转换为小写
    upper 转换为大写
    title 每个单词首字母大写
    trim 去掉首尾空格
    striptags 渲染之前删除所以HTML标签
  2. 控制结构

    1. if语句

      {% if xxx%}
      {% else %}
      {% endif %}
    2. for循环

      {% for i in xxx %}
      {% endfor %}
    3. 可以理解为在html中的函数

      #test.html
      {%macro test(name)%}
      {{name}}
      {%endmacro%}
      
      {%for i in x%}
      {{test(i)}}
      {%endfor%}

      外部文件导入使用:保存在单独的文件中,使用的时候,在当前文件内引入

      {% import 'test.html' as macros%}
      {%for i in x%}
      {{macros.test(i)}}
      {%endfor%}
    4. 重复使用

      {%include 'test.html'%}

3. flask-bootstrap

flask-bootstrap是twiter开发的一款开源网站框架,通过pip安装后,可以在html文件中使用

{% extends "bootstrap/base.html" %}
extends实现了模板继承

让程序拓展成一个具有基本页面结构的基模板,基模板中定义了可以在衍生模板中重新定义的块,通过block 和 endblock添加到基模板中

由于很都块是flask-bootstrap自用的,所以直接重定义可能出现一些问题,所以一般在修改的地方,先使用{{super()}}加载原有模板内容

4. 链接

url_for()

第一个参数是路由对应的视图函数名,如果路由包含可变部分,则第二个参数将动态部分作为关键字传入,如
url_for('user',name='john',_external=False)

文章作者: 一线天
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 一线天 !
  目录