• Flask详解


    一, HTTP从请求到响应的过程

    1- 域名解析。
    一个域名(www.baidu.com)对应这一个IP地址。 使用DNS域名解析其对应的IP
    2- TCP三次握手
    (1) 客户端向指定服务器发送报文(报文分两段: 请求连接服务器数据+验证信息),客户端进入同步发送状态(SYN_Send)
    (2) 服务器接收到报文后, 处理客户端验证信息后也向客户端发送报文(报文同样分两段, 请求连接客户端数据+处理后的验证信息),此时服务器进入同步接收状态(SYN_RECV)
    (3) 客户端接收到服务器的报文后校验正确,发送确认包给服务器。 此时服务器和客户端均转为为确认连接状态(ESTABLISHED)。
    …三次握手成功
    3- TCP连接建立后, 客户端开始发起HTTP请求。
    4- 服务器收到HTTP请求后,返回响应(json, html页面 或者 字符串)。
    5- 浏览器解析html页面, 并获取html中的资源(图片或者一些js请求)。
    6- 浏览器渲染html, 之后呈现给客户
    7- TCP断开

    在这里插入图片描述

    NOTE: http的特点有简单快速, 其连接为短连接或者叫做无连接。是由客户端向服务器发送请求,服务器返回响应后就断开连接。
    
    • 1

    二,响应状态码

    状态码详情查看以下链接
    状态码详解

    三, Flask框架介绍

    1- Flask框架是一个基于python的微型框架。
    2- Flask依赖两个外部库:

    	(1)Jinja2 模板引擎{% %}. 模板:静态html+模板语言{%%}
    	(2)Werzeug WSGI工具集
    
    • 1
    • 2

    3- Flask是一个基于MVC设计模式的Web后端框架

    		M 指 Model 数据模型
    		V 指 View 界面
    		C 指 Controller 控制器
    
    • 1
    • 2
    • 3

    四, 第一个Flask项目

    1- 创建虚拟环境。 进入cmd输入

    mkviertualenv flask_env
    
    • 1

    2- 在虚拟环境中安装flask

    pip install flask
    
    • 1

    3- 创建helloFlask.py文件, 并写入以下代码:

    from flask import Flask
    
    
    # 创建一个Flask对象
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        """
        视图函数
        :return:
        """
        return "hello flask"
    
    
    if __name__ == '__main__':
        # 启动Flask应用
        """
            host: 主机(ip), 如果'0'或者'0.0.0.0'。 则其他机器可以使用IP能访问。
            port: 端口,   不要与其他端口冲突。
            debug:  调试, 如果状态为True,页面异常后修复可以自动刷新
        """
        app.run(host="0.0.0.0", port=6666, debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    具体如下
    在这里插入图片描述

    4-run的说明
    run中有3个参数

    五, Flask拆分

    0- 目的

    当需要开发一个Flask项目时, 功能不会太少,所以一个正常的flask项目是需要足够的规范来避免项目维护困难
    
    • 1

    1- 拆分目录
    在这里插入图片描述

    2- 各个文件的功能

    1- static:存放css活着js文件

    h3 {color: red}
    
    • 1

    2- template: 存放html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Flask</title>
        <link rel="stylesheet" href="../static/index.css">
    </head>
    <body>
        <h1>博客首页</h1>
        <br>
        <h3>欢迎登录</h3>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3- init.py: 创建app对象并串联各个部分

    from flask import Flask
    from App.views import blue
    
    
    def create_app():
        app = Flask(__name__)
    
        # 注册蓝图
        app.register_blueprint(blueprint=blue)
    
        return app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4- views.py: Flask的启动项

    from flask import Blueprint
    from flask import render_template
    
    
    blue = Blueprint('user', __name__)
    
    
    @blue.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    @blue.route('/index/')
    def index():
        return render_template('index.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    5- manage.py: Flask的启动项

    from App import create_app
    
    
    app = create_app()
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    六, 路由的参数

    1- 路由路径参数大致分为 str, int, float, path, uuid, any
    这些类型限制了路由的传参格式,也是对路由的一种管控

    from flask import Blueprint
    from flask import render_template
    
    
    blue = Blueprint('user', __name__)
    
    
    @blue.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    @blue.route('/index/')
    def index():
        return render_template('index.html')
    
    
    # 传入 str, int, float, path, uuid
    @blue.route('/book//')
    def book(bookname):
        return f"获取到的书籍名称为: {bookname}"
    
    
    # 传入几个选项
    @blue.route('/animal//')
    def animal(animal):
        return f"抓到了: {animal}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2-路有中的请求参数
    请求参数有很多, 最常用的为以下四种 GET, POST, DELETE, PUT

    # GET, POST, DELETE, PUT
    @blue.route('/blogpost/', method=['GET', 'POST'])
    def blog_post(blog_name):  # put application's code here
        return f"文章内容: {blog_name}"
    
    • 1
    • 2
    • 3
    • 4

    七, Request请求

    1- Flask中内置了request包, 使用以下代码进行导入

     from flask import request
    
    • 1

    2- Request的属性和方法

    url: 完整的请求地址
    base_url: 去掉GET参数的URL
    host_url: 只有主机和端口号的URL
    path: 路由中的路径
    method: 请求方法
    remote_addr: 请求的客户端地址
    args: GET请求参数
    form: POST请求参数
    files: 文件上传
    headers: 请求头
    cookies: 请求中的cookie

    八, Response响应

    Flask中的4种响应方式

    1- 直接返回字符串, 可以返回文本内容

    return 'Hello World!'
    
    • 1

    2- render_template渲染模板

    return render_template('index.html')
    
    • 1

    3- 通过make_response(data, code)返回

    res = make_response('

    红楼梦

    '
    ) return res
    • 1
    • 2

    4- 返回Response对象

    html = render_template('index.html')
    res = Response(html)
    return res
    
    • 1
    • 2
    • 3

    重定向

    url = 'https://www.baidu.com'
    # return redirect(url)
    return redirect('/price/')
    
    • 1
    • 2
    • 3

    定制异常页面

    @blue.route('/abort/')
    def make_abort():
        abort(502)
        return "error"
    
    
    @blue.errorhandler(502)
    def error_handler(e):
        print("e", e)
        return "捕获到了异常"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    九, Flask中使用Cookie

    1- cookie是一种会话保持技术
    2- 数据全部存储在客户端本地
    3- 存储使用的键值对结构进行存储

    1)设置cookie

    response.set_cookie(key, value)
    
    • 1

    2)获取cookie

    request.cookie.get(key)
    
    • 1

    2)删除cookie

    response.delete_cookie()
    
    • 1

    具体使用见详情
    https://editor.csdn.net/md/?articleId=127818418

    十, Template页面展示

    Template是使用Jinja2的模板引擎

    1- 结构标签

    block操作–挖坑

    
    {% block xxx %}
    {% endblock %}
    
    • 1
    • 2
    • 3

    extends操作–继承

    继承指定的模板
    {% extends xxx %}
    保留块中的内容
    {% super() %}
    
    • 1
    • 2
    • 3
    • 4

    include操作–包含

    {% include xxx %}
    
    • 1

    marco操作–宏操作

    {% from xxx import xxx %}
    {% marco hello(name) %}
    	{{name}}
    {% endmarco %}
    
    • 1
    • 2
    • 3
    • 4

    2- 语法

    1- for循环的使用和参数:
    loop.first
    loop.last
    loop.index
    loop.revindex

    {% for item in items %}
    	AA
    {% else %}
    	BB
    {% endfor %}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2- 过滤器
    capitalize
    lower
    upper
    title
    trim
    safe
    reverse
    first
    last
    sum
    ,…

    对一些变量进行简单的过滤操作
    {{ val | lower}}
    
    • 1
    • 2

    十一, Model数据库操作

    详情见以下链接

  • 相关阅读:
    IDEA的Facets添加web后没有反应
    Pikachu靶场-SQL注入-搜索型注入过关步骤
    大数据导论考察论文
    「2024」预备研究生mem-分析推理强化:多对多画表格(下)
    Spring Framework 学习笔记2:注解开发
    FPGA与单片机有什么区别?
    QT中的JSON存储时无序问题的思考与解决
    css_css3新特性
    Windows下Core Audio APIs的使用简介
    【UV打印机】电气之光电传感器
  • 原文地址:https://blog.csdn.net/CSDN_Xying/article/details/127759719