Flask

简介

flask 是一个轻量级框架基于Python的web 框架,封装能力不如Django的完善,性能不及Tornado,唯一性价比高的就是拥有大量的第三方开源组件比(http://flask.pocoo.org/extensions/)其wsgi采用werkzeug,模板引起则采用jinja2,flask也被称为microframework

安装

pip install Flask - i 国内镜像源地址 i 代表image镜像意思

  • 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
  • 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple
  • 阿里云:https://mirrors.aliyun.com/pypi/simple

认识flask

python 复制代码
from flask import Flask

app = Flask(__name__)  # 创建一个实例

#该代码只是创建个Flask实例,把文件的根地址传递了过去,旨在加载后面会说的静态资源和模板
#该实例有很多属性和方法,用于配置和运行web应用,可以设置路由,配置环境变量,注册蓝图

@app.route('/')
def hello_world():
    return 'Hello World!'

# 这时,Flask会启动一个内置的开发服务器,并开始监听来自客户端的HTTP请求。
if __name__ == '__main__':
    app.run()

运行代码的命令为python 文件名

  • @app.route('/')装饰器将根URL(/)映射到index函数。
  • 当用户访问应用的根URL时,Flask会调用index函数,并将该函数的返回值发送给客户端。

不明白装饰器的可以专门学习一下装饰器很重要

这里面想讲解一下wsgi如何起作用的

  1. 路由注册 :当您使用 @app.route("/") 装饰器时,您实际上是在告诉 Flask 应用,当接收到根路径("/")的 HTTP 请求时,应该调用哪个视图函数。

  2. WSGI 服务器 :Flask 自带了一个简单的 WSGI 服务器,用于开发环境。当您调用 app.run() 时,Flask 会启动这个内置服务器。

  3. 请求处理:当客户端向 Flask 应用发送请求时,这个请求首先会被 WSGI 服务器接收。

  4. 请求分发:WSGI 服务器会将请求传递给 Flask 应用对象。Flask 应用对象会根据请求的 URL 来查找匹配的路由,并调用相应的视图函数。

  5. 视图函数响应:视图函数执行业务逻辑,并返回响应数据。

  6. 响应返回:Flask 应用对象将视图函数返回的数据封装成 HTTP 响应,然后通过 WSGI 服务器发送回客户端。

  • 协议适配:WSGI 是一种协议,它定义了 Web 服务器和 Web 应用程序之间通信的标准接口。通过遵循这个接口,Flask 应用可以与多种 WSGI 服务器兼容,例如 Gunicorn、uWSGI 等。

  • 请求处理:WSGI 服务器负责处理 HTTP 请求,并将它们转换为 Flask 应用可以理解的格式。然后,它会处理 Flask 应用的响应,并将其转换为 HTTP 响应发送给客户端。

  • 环境设置:WSGI 服务器为 Flask 应用提供了一个环境字典,其中包含了请求的所有信息,如请求方法、路径、查询字符串、表头等。

Flask的配置

python 复制代码
app = Flask(__name__)

上面的代码中,python内置变量__name__的值是字符串"__main__" 。Flask类将这个参数作为程序名称。当然这个是可以自定义的,比如app = Flask("my-app")

  1. 静态资源,模板,参考文档
python 复制代码
app = Flask("my-app", static_folder="path1", template_folder="path2")
复制代码
 mkdir HelloWorld
 mkdir HelloWorld/static
 mkdir HelloWorld/templates
 touch HelloWorld/server.py

路由系统

python 复制代码
# 1.动态参数(url传参)
# @app.routr('/user/<name>')

from flask import Flask

app=Flask(__name__)

@app.route('/<name>')  #设置url传参数 http://127.0.0.1:5000/zhanggen
def first_flask(name):  #视图必须有对应接收参数
    print(name)
    return 'Hello World'  #response


if __name__ == '__main__':
    app.run()
# 接收字符串类型参数

# 2.@app.route('/post/<int:age>')

#接收整型数字参数
app=Flask(__name__)
@app.route('/<int:age>/')  #设置url传参数 http://127.0.0.1:5000/18/
def first_flask(age):  #视图必须有对应接收参数
    print(age)
    return 'Hello World'  #response

if __name__ == '__main__':
    app.run()

# 接收整型数字参数

# 3. @app.route('/post/<float:salary/>')

#接收浮点型型数字参数
app=Flask(__name__)
@app.route('/<float:salary>/')  #设置url传参数http://127.0.0.1:5000/2345555.8889/
def first_flask(salary):  #视图必须有对应接收参数
    print(salary)
    return 'Hello World'  #response

if __name__ == '__main__':
    app.run()

# 接收浮点型数字参数

# 4.@app.route('/post/<path:path>')

# 接收URL链接类型参数
app=Flask(__name__)
@app.route('/<path:url>/')  #设置url传参数:http://127.0.0.1:5000/http://www.baiu.com/
def first_flask(url):  #视图必须有对应接收参数
    print(url)
    return 'Hello World'  #response

if __name__ == '__main__':
    app.run()

# 接收URL链接类型参数

指定允许的请求方法

python 复制代码
# @app.route("/login",methods=['Get','Post'])

# 指定允许的请求方法
app=Flask(__name__)
@app.route('/<path:url>/',methods=['get']) #只允许get请求
def first_flask(url):
    print(url)
    return 'Hello World'  #response

if __name__ == '__main__':
    app.run()

#指定允许的请求方法

通过别名反向生成url

python 复制代码
# 反向生成url

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/path:url', endpoint="name1")
def first_flask(url):
    print(url_for('name1',url=url)) #如果设置了url参数,url_for(别名,加参数)
    return 'Hello World'

if __name__ == '__main__':
    app.run()

通过app.add_url_rule()调用路由

python 复制代码
#方式2通过app.add_url_rule()方法的方式调用路由
app=Flask(__name__)

def first_flask():
    return 'Hello World' 

app.add_url_rule(rule='/index/',endpoint='name1',view_func=first_flask,methods=['GET'])
#app.add_url_rule(rule=访问的url,endpoint=路由别名,view_func=视图名称,methods=[允许访问的方法])
if __name__ == '__main__':
    app.run()

# app.add_url_rule()方法调用路由

扩展路由功能:正则匹配url

python 复制代码
from flask import Flask, views, url_for
            from werkzeug.routing import BaseConverter

            app = Flask(import_name=__name__)


            class RegexConverter(BaseConverter):
                """
                自定义URL匹配正则表达式
                """
                def __init__(self, map, regex):
                    super(RegexConverter, self).__init__(map)
                    self.regex = regex

                def to_python(self, value):
                    """
                    路由匹配时,匹配成功后传递给视图函数中参数的值
                    :param value: 
                    :return: 
                    """
                    return int(value)

                def to_url(self, value):
                    """
                    使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
                    :param value: 
                    :return: 
                    """
                    val = super(RegexConverter, self).to_url(value)
                    return val

            # 添加到flask中
            app.url_map.converters['regex'] = RegexConverter


            @app.route('/index/<regex("\d+"):nid>')
            def index(nid):
                print(url_for('index', nid='888'))
                return 'Index'


            if __name__ == '__main__':
                app.run()

自定义正则表达式匹配路由
相关推荐
ajsbxi1 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
颜淡慕潇1 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4031 小时前
DearPyGui学习
python·gui
向阳12182 小时前
Bert快速入门
人工智能·python·自然语言处理·bert
engchina2 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
兆。2 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea