简介
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
from flask import Flaskapp = 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的配置
app = Flask(__name__)
上面的代码中,python内置变量
__name__
的值是字符串"__main__"
。Flask类将这个参数作为程序名称。当然这个是可以自定义的,比如app = Flask("my-app")
。2. 静态资源,模板,参考文档
app = Flask("my-app", static_folder="path1", template_folder="path2")
mkdir HelloWorldmkdir HelloWorld/staticmkdir HelloWorld/templatestouch HelloWorld/server.py
路由系统
# 1.动态参数(url传参)
# @app.routr('/user/<name>')from flask import Flaskapp=Flask(__name__)@app.route('/<name>') #设置url传参数 http://127.0.0.1:5000/zhanggen
def first_flask(name): #视图必须有对应接收参数print(name)return 'Hello World' #responseif __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' #responseif __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' #responseif __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' #responseif __name__ == '__main__':app.run()# 接收URL链接类型参数
指定允许的请求方法
# @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' #responseif __name__ == '__main__':app.run()#指定允许的请求方法
通过别名反向生成url
# 反向生成urlfrom flask import Flask, url_forapp = 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()调用路由
#方式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
from flask import Flask, views, url_forfrom werkzeug.routing import BaseConverterapp = Flask(import_name=__name__)class RegexConverter(BaseConverter):"""自定义URL匹配正则表达式"""def __init__(self, map, regex):super(RegexConverter, self).__init__(map)self.regex = regexdef 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()自定义正则表达式匹配路由