简介
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
pythonfrom 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如何起作用的
路由注册 :当您使用
@app.route("/")
装饰器时,您实际上是在告诉 Flask 应用,当接收到根路径("/")的 HTTP 请求时,应该调用哪个视图函数。WSGI 服务器 :Flask 自带了一个简单的 WSGI 服务器,用于开发环境。当您调用
app.run()
时,Flask 会启动这个内置服务器。请求处理:当客户端向 Flask 应用发送请求时,这个请求首先会被 WSGI 服务器接收。
请求分发:WSGI 服务器会将请求传递给 Flask 应用对象。Flask 应用对象会根据请求的 URL 来查找匹配的路由,并调用相应的视图函数。
视图函数响应:视图函数执行业务逻辑,并返回响应数据。
响应返回:Flask 应用对象将视图函数返回的数据封装成 HTTP 响应,然后通过 WSGI 服务器发送回客户端。
协议适配:WSGI 是一种协议,它定义了 Web 服务器和 Web 应用程序之间通信的标准接口。通过遵循这个接口,Flask 应用可以与多种 WSGI 服务器兼容,例如 Gunicorn、uWSGI 等。
请求处理:WSGI 服务器负责处理 HTTP 请求,并将它们转换为 Flask 应用可以理解的格式。然后,它会处理 Flask 应用的响应,并将其转换为 HTTP 响应发送给客户端。
环境设置:WSGI 服务器为 Flask 应用提供了一个环境字典,其中包含了请求的所有信息,如请求方法、路径、查询字符串、表头等。
Flask的配置
pythonapp = Flask(__name__)
上面的代码中,python内置变量
__name__
的值是字符串"__main__"
。Flask类将这个参数作为程序名称。当然这个是可以自定义的,比如app = Flask("my-app")
。
- 静态资源,模板,参考文档
pythonapp = 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
pythonfrom 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() 自定义正则表达式匹配路由