框架简介
- Flask 框架是轻量级的python编程框架,遵循MVC架构,内部含由两个核心库(werkzeug库 + Jinja2库),可拓展性比较强,开发者可以根据自己的需求进行集成第三方库,自己设计代码框架
- 主要适合 分层比较少,逻辑较为简单的web项目
- Flask 框架为非阻塞框架,支持并发
Werkzeug库支持功能
- URL路由请求集成,一次性可以响应多个用户请求
- 支持cookie、和会话管理、通过身份缓存建立长连接,提供用户访问通道
- 支持交互式javascript调试,提升用户体验
- 处理HTTP基本事务,快速响应用户推送过来的请求
Jinja2库(安全)
- 支持自动HTML转移功能,控制外部黑客的脚本攻击
- 页面加载过程中会将源代码进行编译成python字节码
- 模板集成机制,为用户提供对应的模板
第三方库
- SQLAlchemy - 实现ORM数据库模型的python库
- Flask-WTForm - 简化HTML表单处理的python库
Flask目录结构
框架安装
pip install flask
Hello World程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hellow_word():
return 'hello world'
if __name__ == '__main__':
app.run()
配置文件导入
app = Flask(__name__) # 程序默认名称
app = Flask("myapp") # 自定义程序名称
app = Flask("myapp", static_folder="path1", template_folder="path2") # 指定静态文件路径(静态文件+模板) 手动指定
**# 向文件中导入配置项**
# 方式1:
import config
app.config.from_object(config) # 通过app.config.from_object()方法获取配置文件内容
# 方式2:
app.config.from_object("config")
# 方式3:
app.config.from_pyfile("config.py")
设置DEBUG模式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hellow_word():
return 'hello world'
if __name__ == '__main__':
# 方式1
app.run(debug = True)
# 方式2
app.debug = Ture
app.run()
# 方式3 - 通过配置文件设置
app.config.update(DEBUG=True)
app.run()
# 绑定IP和端口、默认绑定IP 127.0.0.1 端口:5000
app.run(host='0.0.0.0', port=8080, debug=True) # 自定义,真实环境时需要执行各个参数 来对端口进行监听
列出所有的URL参数
http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android # url
from flask import Flask,request
app = Flask(__name__)
@app.route('/<id>') # id 为路由参数
def hello_world(id): # 函数接收 id
return request.args.__str__() # 返回提取的参数
if __name__ = '__main__':
app.run(port = 5000)
# 浏览器返回
ImmutableMultiDict([('name', 'Loen'), ('age', ''), ('app', 'ios'), ('app', 'android')])
浏览器返回服务器数据
# 请求
http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android
print(request.full_path)
# 服务器打印值
/?name=Loen&age&app=ios&app=android
print(request.path)
# 服务器打印值
127.0.0.1 - - [11/May/2020 15:08:34] "GET /?name=Loen&age&app=ios&app=android HTTP/1.1" 200 -
获取参数的值(设置默认值)
# 获取info对应的值
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def hello_world():
return request.args.get("info") # 返回提取的参数
@app.route('/')
def hello_world():
return request.args.get("info",'welcome') # 获取info的值,如果没有,默认为welcome
if __name__ = '__main__':
app.run(port = 5000)
获取多个参数值
http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
r = request.args.getlist('app') # 返回一个list
return str(r)
if __name__ == '__main__':
app.run(port=5000, debug=True)
# 浏览器返回
['ios', 'android']
指定 HTTP 接收方法
@app.route('/register', methods=['GET', 'POST']) # 接收post方法
def register():
print(request.headers)
print(request.stream.read())
return 'welcome'
**# 模拟客户端**
import requests
user_info = {'name': 'Loen', 'password': 'loveyou'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)
print(r.text)
Post 获取参数
# post上传数据
b'name=Loen&password=loveyou' # post数据
from flask import Flask, request
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
print(request.headers)
# print(request.stream.read()) # 不要用,否则下面的form取不到数据
print(request.form)
# Flask 内置解析器 request.form
print(request.form['name'])
print(request.form.get('name'))
print(request.form.getlist('name'))
print(request.form.get('nickname', default='little apple'))
return 'welcome'
获取Post中列表数据
# post提交数据
name=Loen&age&app=ios&app=android
from flask import Flask, request
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
print(request.form.getlist('name'))
JSON数据处理
"""
request.json会自动将json数据转换成Python类型(字典或者列表)
"""
from flask import Flask, request
app = Flask("myapp")
@app.route('/add', methods=['POST'])
def add():
print(request.headers)
print(type(request.json))
print(request.json)
result = request.json['n1'] + request.json['n2']
return str(result)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
响应JSON数据
"""
响应JSON时,除了要把响应体改成JSON格式,响应头的Content-Type也要设置为application/json
"""
from flask import Flask, request, Response
import json
app = Flask("myapp")
@app.route('/add', methods=['POST'])
def add():
result = {'sum': request.json['n1'] + request.json['n2']}
return Response(json.dumps(result), Content-type='application/json')
# return jsonify(result) # 使用JSONIF 函数
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
**# 客户端**
import requests
json_data = {'n1': 5, 'n2': 3}
r = requests.post("http://127.0.0.1:5000/add", json=json_data)
print(r.headers)
print(r.text)
文件上传
# HTML表单中 设置 enctype ="multipart/form-data" 属性 浏览器通过此属性进行发送文件
from flask import Flask, request
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
# 文件上传目录
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
# 支持的文件格式
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'} # 集合类型
# 判断文件名是否是我们支持的格式
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
@app.route('/upload', methods=['POST'])
def upload():
upload_file = request.files['image']
if upload_file and allowed_file(upload_file.filename): # 上传前文件在客户端的文件名
filename = secure_filename(upload_file.filename)
# 将文件保存到 static/uploads 目录,文件名同上传时使用的文件名
upload_file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename))
return 'info is '+request.form.get('info', '')+'. success'
else:
return 'failed'
if __name__ == '__main__':
app.run(port=5000, debug=True)
URL -变量替代
@app.route('/user/<username>/friends')
def user_friends(username):
print(username)
print(type(username))
return 'In user_friends get username: ' + username
# 转化参数类型
@app.route('/page/<int:num>') # 转化参数类型 int
def page(num):
print(num)
print(type(num))
return 'hello world'
int # 接受整数
float # 同 int ,但是接受浮点数
path # 和默认的相似,但也接受斜线
重定向 url_for()
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route('/old')
def old():
print('this is old')
# url_for() : 根据方法的函数名 反向定位路由地址
return redirect(url_for('new'))
return redict (url_for("new"),id =2)
@app.route('/new')
def new():
print('this is new')
return 'this is new'
if __name__ == '__main__':
app.run(debug=True)
上下文(Context)
定义:
服务器端获得应用及请求的相关信息的对象。
会话上下文(Sessin Context):基于cookie对象,提供同一客户端在多次请求之间的共享信息方式。
from flask import Flask, session
from datetime import datetime
app = Flask(__name__)
app.secret_key = 'SET_ME_BEFORE_USE_SESSION'
@app.route('/write_session')
def writeSession():
session['key_time']= datetime.now().strftime('%Y-%m-%d %H:%M:%S') #将当前时间保存在Session中
return session['key_time'] #返回当前时间
@app.route('/read_session')
def readSession():
return session.get('key_time') #获得上次调用writeSession时写入的时间,并返回
if __name__ == '__main__':
app.run()
# new : 判断本次请求的Session是否是新建的
# modified : 判断本次请求是否修改过session键值 (session.modified)
应用全局对象(application Global):提供在一次请求的多个处理函数中共享信息方式。
请求上下文(Request Context):web管理器管理单词用户请求的环境对象,用于处理客户端向 web 服务器发送的数据