• 【自学开发之旅】基于Flask的web开发(一)


    web开发项目设计:
    立项-需求分析-设计(原型图、数据库、api设计)-技术选型-写代码-测试-上线
    请添加图片描述
    web开发的本质上就是生成超文本。

    前端负责展示,后端负责逻辑处理:后逻辑请求(接收请求、响应请求)

    概念:
    Flask是一个由python语言编写开发而成的轻量级web开发框架,基于 Werkzeugjinjia2 这两个库

    特点:(和Django对比着讲)
    灵活、轻量、适合api开发、简单

    三行启动一个简单flask程序

    from flask import Flask
    #
    app = Flask(__name__)
    #内置小型服务器启动app应用,只适用在开发时候。线上生成环境使用专门的wsgi server
    app.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.导入Flask。
    2.实例化一个Flask对象,这个对象就是我们要启动的应用,通常使用__name__给flask对象实例化的时候一个import_name。app就是得到的核心对象,即启动的应用。在这里插入图片描述
    3.app.run()只能在开发环境中使用,不能在生产环境中使用。除非用WSGI server代替。WSGI(python web server gateway interface)web服务器网关接口在这里插入图片描述

    我们用python专注于HTML文档,不希望接触到TCP连接,HTTP原始请求和响应格式。
    python中有专门的web服务器 – gunicorn、uwsgi
    ps:nginx只负责静态页面的展示,不能互动的,带不起我们的python程序(app),(Java-tomcat)。

    WSGI 是为python语言定义的web服务器和web应用程序之间一种简单而通用的接口规范

    flask是响应html内容的,不用管连接,交给服务器。

    推荐使用gunicorn启动flask程序(如linux中)

    pip3 install flask
    pip3 install gunicorn
    
    [root@nfs ~]# cat flask_init_test.py 
    from flask import Flask
    app = Flask(__name__)
    [root@nfs ~]# gunicorn -b 0.0.0.0 flask_init_test:app
    [2023-08-31 20:42:53 +0800] [1821] [INFO] Starting gunicorn 21.2.0
    [2023-08-31 20:42:53 +0800] [1821] [INFO] Listening at: http://0.0.0.0:8000 (1821)
    [2023-08-31 20:42:53 +0800] [1821] [INFO] Using worker: sync
    [2023-08-31 20:42:53 +0800] [1824] [INFO] Booting worker with pid: 1824
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    路由页面(传参)示例:

    from flask import Flask
    app = Flask(__name__)
    
    #使用装饰器做
    @app.route("/")
    def index():
        return "hello world!"
    
    #不使用装饰器做:路由和函数绑定
    def secondindex():
        return "second index"
    app.add_url_rule("/index2", view_func=secondindex)
    
    #通过url传递参数:使用一对尖括号声明变量
    @app.route("/login2//")
    def login2(username, passwd):
        if username == "root" and passwd == "123456":
            return f"login success"
        else:
            return f"login false"
    
    @app.route("/stu/")
    def stu(age):
        if int(age) >=18:
            return "已经成年,可以上网"
        else:
            return "未成年不能上网噢"
    
    app.run()  #开发环境,内置web服务器
    
    • 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
    • 28
    • 29

    ps:出现重新启动flask程序,页面不刷新的问题
    解决方法:
    在终端下

    (venv) D:\sq-flask>netstat -aon|findstr 5000
      TCP    127.0.0.1:5000         0.0.0.0:0              LISTENING       16164
    
    (venv) D:\sq-flask>taskkill /t /f /pid 16164
    成功: 已终止 PID 16164 (属于 PID 1544 子进程)的进程。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    重新启动flask程序即可。

    开启debug模式:
    举例:
    app.run(debug=True, host=“0.0.0.0”, port=8000)

    Debug后的一些讲解flask路由管理原理
    在这里插入图片描述url_map:保存的是url和endpoint的映射关系
    Map([ static>,
    index>,
    secindex>,
    TIONS, HEAD, GET) -> login>,
    stu>])

    view_functions:保存的是endpoint和视图函数的映射关系
    {‘static’: init.. at 0x0000020BD2600790>, ‘index’: , ‘secindex’: , ‘login’: , ‘stu’: }
    请添加图片描述
    引入中间层:解耦,后续扩展

    面试题:讲讲flask的路由管理原理
    回答:1.首先flask的路由管理由两张表管理,一张url_map表,一张view_functions表,其中url_map中保存url和endpoint的映射关系,view_functions中保存endpoint和视图函数的映射关系。 2.接收到请求之后,先解析http头部,拿到请求的url路径在url_map表里找,如果没有没有找到,直接返回"404 NOT FOUND",如果找到对应的endpoint,则在view_functions表里找到对应的function,然后交给它处理返回。3.endpoint在整个生命周期是全局唯一的。

    http(超文本传输协议):
    1991年,0.9版本,命令GET
    1996年,1.0版本,引入POST和HEAD等命令
    1997年,1.1版本,引入持久连接(背景:http是无状态协议即这次请求和下次请求是完全独立的)
    2015年,2.0版本(二进制分帧实现低延迟和高吞吐量;多路复用;)

    HTTP/2.0主要有以下特点:
    二进制协议:HTTP/2.0协议将所有信息分割为二进制帧,协议头和数据体都是二进制协议。这种二进制协议的解析相对于文本协议更加高效,且能够减少错误。
    多工(Multiplexing):HTTP/2.0允许在一个TCP连接中同时发送多个请求或回应,无需按照顺序一一对应,这样可以避免“队头堵塞”。
    数据流:HTTP/2.0的数据包不是顺序发送的,同一个连接中可以连续发送不同的请求包,每个请求包都有唯一的ID。如果数据流发送一半需要取消,只需要给服务器发送一个RST_STREAM帧即可。
    首部压缩:HTTP/2.0使用了首部压缩技术,使得报头更加紧凑,传输更快,这有助于改善移动网络环境下的性能。
    流量控制:HTTP/2.0提供了流量控制机制,基于HTTP链接的每一跳进行,而非端到端的控制。流量控制基于窗口更新帧进行,接收方可以广播自己准备接收的数据量,以及对整个链接要接收的数据量进行控制。
    多路复用:HTTP/2.0允许浏览器在同一时间针对同一域名下的请求有一定数量的限制,这可以减少连接的建立和关闭次数,提高效率。

    http标头:
    HTTP头部包含了许多重要的信息,以下是一些常见的HTTP头部信息及其含义:
    Host:指定请求的URL的主机名和端口号。
    User-Agent:指定发送请求的客户端应用程序的名称和版本。
    Accept:指定客户端能够接收的MIME类型和排序规则。
    Accept-Language:指定客户端能够接收的自然语言和排序规则。
    Accept-Encoding:指定客户端能够接收的压缩方法。
    Content-Type:指定请求或响应的MIME类型和内容参数。
    Content-Length:指定请求或响应的数据长度。
    Content-Encoding:指定请求或响应的数据压缩方法。
    If-Match:用于条件请求,指定资源的匹配条件。
    If-None-Match:用于条件请求,指定资源的非匹配条件。
    If-Modified-Since:用于条件请求,指定资源的修改时间。
    If-Unmodified-Since:用于条件请求,指定资源的未修改时间。
    Range:用于范围请求,指定请求的资源的范围。
    ETag:用于条件请求,指定资源的唯一标识符。
    Last-Modified:用于条件请求,指定资源的最后修改时间。
    这些头部信息提供了关于请求和响应的重要信息,使得客户端和服务器能够进行高效的通信和资源共享。

    http方法:
    增POST、删DELETE、改PUT、查GET、HEAD获得头部信息、OPTIONS查询接口支持什么方法。(不强迫但最好遵守规范)

    接受客户端请求:
    1.客户端所有请求都封装在一个对象中(request对象
    2.客户端请求过来的数据包中 – 携带的数据、http包头

    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route("/login")
    def login():
        print(request.args)
        return "login html"
    
    app.run(debug=True, host="0.0.0.0", port=9000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    3.request常用属性:
    args 接收传递过来的url携带的参数
    服务端获取:
    在这里插入图片描述
    print(request.args.get(“username”)) —jd
    print(request.args.get(“passwd”)) —123456

  • 相关阅读:
    Postgresql使用Plpgsql编译SELECT INTO细节
    Vue3响应式源码实现
    RDS:在 Windows Server 2016/2019 中的 RDS/RemoteApp 性能问题
    数字化转型大潮下,企业如何做好绩效管理?
    机器学习中基本符号表示和常用术语
    数据结构-单链表-力扣题
    动态组件、keep-alive、异步组件
    Google Earth Engine(GEE)——如何创建一个合适的list用来作为时间遍历
    Java 基于 SpringBoot 的简历招聘系统
    【操作系统】8/35进程间通信
  • 原文地址:https://blog.csdn.net/Stephen_Daa/article/details/132589903