框架学习目标:
- 如何编写视图
- 如何处理请求
- 如何构造响应
falsk简介
flask用Python语言基于Werkzeug工具箱编写的轻量极Web开发框架。
flask本身相当于一个内核,其他几乎 所有的功能都要用到扩展(邮箱扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAIchemy),都需要第三方的扩展来实现。可以用Flask扩展加入ORM,窗口体验证工具,文件上传,身份验证等。 其WSGI工具箱采用Werkzeug(路由模块),模板引擎使用Jinja2,这两个也是Flask框架的核心。
框架的对比
重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django
快速实现业务、不考虑技术选型,越简单直接越好–>Django
轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask,Tornado
自由、灵活、高度定制–>flask
flask程序编写
创建.py文件
# 导入Flasklei
from flask import Flask]
# flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'hell0 world'
if __name__ = '__main__':
app.run()
Flask对象初始化参数
- import_name
Flask程序所在的包(模块),传__name__就可以
其可以决定Flask在访问静态文件时查找的路径 - static_url_path
静态文件访问路径,可以不传,默认为:/+static_folder - static_folder
静态文件存储的文件夹,可以不传,默认为static - template_folder
模板文件存储文件夹,可以不传,默认为templates
配置加载的方式
1、 从配置对象中加载
app.config.from_object(配置对象)
继承-->优点 复用
敏感数据暴露 缺点
from flask import Flask
class DefaultConfig(object)
SECRET_KEY = '4564564564564'
app = Flask(__name__)
# 设置加载
app.config.from_object(DefaultConfig)
#定义视图
@app.route('/')
def index():
print(aoo.config['SECRET_KEY'])
return 'hello world'
if __name__ = '__main__'
app.run()
2、从配置文件中加载
app.config.from_pyfile('setting.py')
优点-->独立文件 保护敏感数据
缺点-->不能继承,路径固定 不灵活
from flask import Flask
app = Flask(__name__)
app.config.from_pyfile('setting')
# 定义视图
@app.route('/')
def index():
print(app.config['setting.py'])
return 'hello world'
if __name__ = '__main__'
app.run()
3、环境变量中加载(未学)
优点-->独立文件,保护敏感数据 文件路径不固定 灵活
缺点-->不方便,要设置环境变量
app.run参数
可以指定运行的主机IP地址,端口,是否开启调式模式
app.run(host = ‘0.0.0.0’, port=5000,debug = True)
说明
- 环境变量FLASK_APP说明flask的启动实例
- flask run -h 0.0.0.0 -p 8000 绑定地址 端口
- flask run --help获取帮助
- 生产模式与开发模式控制
通过FLASK_ENV环境变量指明
export FLASK_ENV=production 运行在生产模式,为知名则默认为此方式
export FLASK_ENV=development 运行在开发模式
查询路由信息
flask routes
Endpoint:代表视图函数的名字(跟视频的不一样),我这里应该是显示错了,在控制台输出的是index
Methods:请求方式
Rule:路径
在程序中获取
在应用中url_map属性中保存着整个Flask应用的路由映射信息,可以通过读取这个属性获取路由信息
print(app.url_map)
# 遍历路由信息
for rule in app.url_map.iter_rules():
print('name={} path ={}'.format(rule.endpoint,rule.rule))
指定请求方式
在Flask中,定义路由其默认的请求方式为(未具体了解):
- GET
- OPTIONS(自带) – 简化版的GET请求,用于询问服务器接口信息的,比如接口允许的请求方式 允许的请求源头域名。
- HEAD(自带)
利用methods参数可以指定一个接口的请求方式
@app.route("/itcast1",methods=["POST"])
def view_func_1():
return "Hello world 1"
@app.route("/itcast2",methods=["GET","POST"])
def view_func_2():
return "hello world 2"
蓝图
在Flask中,使用蓝图Blueprint来分模块组织管理。
蓝图实际可以理解为是一个存储一组视图方法的容器队像,具有如下特点:
- 一个应用可以具有多个Blueprint
- 可以将一个Blueprint注册到任何一个未使用的URL下如“/user”,"/goods"
- Blueprint可以单独具有自己的模块,静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数
- 在一个应用初始化时,就应该要注册需要使用的Blueprint
但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用。
使用蓝图的三步骤
1.创建一个蓝图对象
uwer_bp = Blueprint('user',__name__)
2.在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模板过滤气
@user_bp.route('/')
def user_profile():
return 'user_profile'
3.在应用对象上注册这个蓝图对象
app.register_blueprint(user_bp)
render_template
render_template:引入index.html,同时根据后面传入的参数,对html进行渲染
from flask import Flask, render_template
app = Flask(__name__)
# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
普通的表单验证显示
#wef_demo.py
from flask import Flask,render_template,request,falsh
app = Flask(__name__)
app.route('/',methods=['GET','POST'])
def index():
# request:请求对象 -->获取请求方式,数据
# 1.判断请求方式
if request.methods == 'POST'
# 获取请求对象
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 判断参数是否填写, 并且判断密码是否相同
if not all([usernaem,password,password2]):
print('参数不完整')
# flash是为了输出的信息在网页上显示
flash(u'参数不完整')
elif password != password2
print('密码不一致')
flash(u'密码不一致')
else:
return 'success'
return render_template('index_html')
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<label>用户名:</label><input type="text" name="username"><br>
<label>密码:</label><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</body>
</html>
Flask重定向
from flask import Flask,abort,redirect
app = Flask(__name__)
app.route('/site')
def site():
retyrn redirect("想要调用的网址")
if __name__ == '__main__':
app.run()