flask
每天的内容
- flask跑起来
- 模板引擎
- flask表单
- 文件上传邮件发送
- flask-sqlalchemy
一、web框架的简介
M 模型 负责数据的操作
V 视图 负责数据的展示
C 控制器 控制你的M的操作以及视图模板的渲染
在python中叫做MVT
M 模型 负责数据的操作
V 控制你的M的操作以及视图模板的渲染 业务逻辑的操作
T templates 模板 负责数据的展示
二、架构
BS browser-》server
CS client-》server
三、FLASK
概念: flask是一个非常小的web框架 被称为微型框架 只提供了一个强健的核心 其它的都是通过第三方扩展库来实现
组成:
- 调试 路由 WSGI
- 模板引擎 jinja2 (就是由flask核心人员开发的模板引擎)
使用:
安装 pip install flask
实例
from flask import Flask
app = Flask(__name__) #实例化flask
#路由地址 根据用户不同的url进行处理
@app.route('/')
def index():#处理当前请求的函数
return 'Hello Flask'
if __name__ == '__main__':
app.run() #运行当前的flask
四、视图函数
(1) 无参路由
#路由地址和视图函数名称 是否同名没有关系
#http://127.0.0.1:5000/test/
@app.route('/test/') #路由地址末尾的/建议加上
def test():
return '我是测试使用的视图函数'
(2) 带一个参数的路由
http://127.0.0.1:5000/page/10/
@app.route('/page/<pagenum>/') #参数的语法格式 /路由名称/<形参名>/
def page(pagenum):
return '当前的页码为{}'.format(pagenum)
(3) 带多个参数
#带多个参数
# http://127.0.0.1:5000/arg/10/zhansgan/
@app.route('/arg/<age>/<name>/')
def getarg(age,name):
return '我叫{} 我见年{}岁了'.format(name,age)
# http://127.0.0.1:5000/arg/zhansgan_10/
@app.route('/arg/<name>_<age>/')
def getarg(age,name):
return '我叫{} 我见年{}岁了'.format(name,age)
(4) 限制参数的类型
#参数类型
# @app.route('/argtype/<arg>/')
# @app.route('/argtype/<int:arg>/') #限定参数类型为int
# @app.route('/argtype/<float:arg>/') #限定参数类型为float
# @app.route('/argtype/<string:arg>/') #限定参数类型为string 默认就是字符串
@app.route('/argtype/<path:arg>/') #其实path就是string 但是path会将路由地址后面的所有的路由或者值都认为是一个值 /不在作为分隔符来使用
def argtype(arg):
print(type(arg))
print(arg)
return '获取参数类型的视图函数'
注意
- 路由地址末尾的/建议加上 因为如果输入的时候没有加默认的/浏览器会自动帮你加上
- 形参名字写在路由的<> 中间
- 参数默认类型都为string
五、视图函数的响应
(1) return 字符串进行响应
@app.route('/response/')
def res():
return '我是响应',404 #响应一个指定标准的状态码
(2) 通过make_response构造响应
导入:
from flask import make_response
@app.route('/make_response/')
def makeResponse():
res = make_response('我是响应的内容')
# res = make_response('我是响应的内容',404)
return res
六、重定向 redirect
作用: 从一个地址跳向另外一个地址
导入
from flask import redirect
实例
@app.route('/')
def index():#处理当前请求的函数
return 'Hello Flask'
#重定向
@app.route('/redirect/')
def redirect_index():
return redirect('/') #参数为路由地址
return redirect('/argtype/redirect_index/') #带参数路由地址的重定向
url_for 通过视图函数名称 反向构造出路由地址
导入
from flask import redirect,url_for
实例
@app.route('/redirect/')
def redirect_index():
url = url_for('test')
url = url_for('getarg',name='zhangsan',age=18) #带多个参数
#@app.route('/arg/<name>_<age>/')
#def getarg(age,name):
return url #/test/
注意:
如果给定的视图函数名称不存在 则抛出异常
url_for 和 redirect 组合使用
@app.route('/redirect/')
def redirect_index():
return redirect(url_for('test'))
return redirect(url_for('getarg',name='zhangsan',age=18)) #带多个参数
七、abort 终止
概念:
在视图函数中处理的时候 可以使用abort抛出指定状态码的错误 下面代码不在执行
需要抛出标准http的状态码
from flask import abort
实例
@app.route('/abort/')
def my_abort():
# abort(404)
# abort(500)
return '抛出状态码'
#捕获500的错误
@app.errorhandler(500)
def server_error(e):
return '现在能看到了吗{}'.format(e)
#捕获404的错误信息
@app.errorhandler(404)
def server_error(e):
return '您访问的页面被外星人劫持走了!!!'
八、app.run() 参数说明
参数 | 参数说明 | 默认值 |
---|---|---|
host | 主机名 | 127.0.0.1 |
port | 端口号 | 5000 |
debug | 调试 | False |
threaded | 多线程 | False |
实例
if __name__ == '__main__':
# app.run(debug=True) #开启调试模式
app.run(host='0.0.0.0',port=5001,debug=True,threaded=True)
十、请求 request
说明:
request是由flask框架为我们提供好的对象 使用时 只要导入即可
用户在请求的时候 框架会为当前请求的用户 创建一个request(请求的对象) 包含当前用户请求的所有信息
导入
from flask import request
- url 用户请求的完整的url
- base_url 去除get传参后的url
- host_url 只有主机和端口号的url
- path 获取请求的路由地址
- method 请求的方法
- args 获取get传参
- form 获取表单传递过来的数据
- files 获取文件上传过来的数据
- headers 获取用户请求过来的头信息
- cookies 获取用户请求过来的所有cookie
- json 获取用户请求过来的json数据
实例
@app.route('/request/')
def get_request():
print('用户请求的完整的url',request.url)
print('去除get传参后的url',request.base_url)
print('只有主机和端口号的url',request.host_url)
print('获取请求的路由地址',request.path)
print(' 请求的方法',request.method)
print('获取拼凑的get传参',request.args)
print('获取拼凑的get传参',request.args.get('name'))
print('获取拼凑的get传参',request.args.get('age'))
print('获取表单传递过来的数据',request.form)
print('获取文件上传过来的数据',request.files)
print('获取用户请求过来的头信息',request.headers)
print('获取用户请求过来的所有cookie',request.cookies)
print('获取用户请求过来的json数据',request.json)
return 'request对象'
十一、会话控制 cookie和session
cookie
设置cookie
response.set_cookie(
key, #设置键
value,#设置值
max_age=None, #过期时间
path = '/' #当前cookie的存储路径
)
获取cookie
@app.route('/get_cookie/')
def get_cookie():
print(request.cookies)
return request.cookies.get('name','default默认值')
删除cookie
#清除cookie
@app.route('/del_cookie/')
def del_cookie():
res = make_response('清除cookie')
res.delete_cookie('name')
return res
cookie存储值为明文存储 安全性低
cookie存在客户端(浏览器中)
cookie默认存活时间为 当前浏览结束(关闭当前的浏览器)
session
session的使用 需要一个secret_key 来进行加密产生加密的字符串
app.config['SECRET_KEY'] = 'secretkey'
会给cookie设置一个唯一的标识符 sessionId 服务器端会通过cookie携带着唯一的sessionId来区分是哪一个用户的请求 如果客户端的cookie被禁用了 那么服务器端的session将无法使用 session基于cookie
设置session
#设置session
@app.route('/set_session/')
def set_session():
默认存活当前浏览器结束
session['username'] = '张三'
return '设置session'
设置session 及过期时间
#设置session
@app.route('/set_session/')
def set_session():
session.permanent = True #设置session持久化存储
#设置当前session的存活时间60秒 如果当前设置失败 那么存活时间为1月
app.permanent_session_lifetime = timedelta(seconds=60)
session['username'] = '张三'
return '设置session'
获取session
#获取session
@app.route('/get_session/')
def get_session():
return session.get('username','default默认值')
删除session
@app.route('/del_session/')
def del_session():
#删除 key为username的session
session.pop('username')
#删除所有session
# session.clear()
return '删除session'
十二、flask-script扩展
简介:
就是一个flask终端运行的解析器 通过不同参数 来设置flask的启动项
安装
sudo pip3 install flask-script
使用
from flask_script import Manager #导入终端运行的解析器
app = Flask(__name__)
manager = Manager(app)
...
if __name__ == '__main__':
manager.run()
启动参数
-h | 主机 |
---|---|
-p | 端口号 |
-d | 调试 |
-r | 重新加载 |
-threaded | 多线程 |
python manage.py runserver -h
python manage.py runserver -h0.0.0.0 -p5000 -d -r –threaded
python manage.py runserver -d -r
十三、蓝本蓝图 Blueprint
概述
当所有代码越爱越多的时候 在manage.py中 很明显是不合理的 我们需要将不同功能的视图函数 存放在不同的文件中 使用我们的项目的目录结构更加的清晰
使用
user.py 用户的处理
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/login/')
def login():
return '登录'
manage.py中
from mysession import mysession
from user import user
#http://127.0.0.1:5000/login/
app.register_blueprint(user) #注册蓝本
#http://127.0.0.1:5000/user/login/
app.register_blueprint(user,url_prefix='/user') #注册蓝本并添加前缀
蓝本中的重定向
@app.route('/')
def index():
# return '首页'
return redirect('/user/login/')
return redirect(url_for('user.login')) #使用url_for反向构造出路由的时候 需要指定当前的视图函数 是哪一个蓝本对象的
十四、请求钩子函数
在manage文件中使用
钩子函数 | 功能描述 |
---|---|
before_first_request | 第一次请求之前 |
before_request | 每次请求之前 |
after_request | 每次请求之后 没有异常 |
teardown_request | 每次请求之后 即使有异常出现 |
实例
@app.before_first_request
def before_first_request():
print('before_first_request')
@app.before_request
def before_request():
print('before_request')
if request.method == 'GET' and request.path == '/form/':
abort(500)
@app.after_request
def before_request(r):
print('before_request',r)
return r
@app.teardown_request
def teardown_request(r):
print('teardown_request')
return r
在蓝本中使用
钩子函数 | 功能描述 |
---|---|
before_app_first_request | 第一次请求之前 |
before_app_request | 每次请求之前 |
after_app_request | 每次请求之后 没有异常 |
teardown_app_request | 每次请求之后 即使有异常出现 |
实例
@user.before_app_first_request
def before_first_request():
print('before_first_request')
@user.before_app_request
def before_request():
print('before_request')
if request.method == 'GET' and request.path == '/form/':
abort(500)
@user.after_app_request
def after_request(r):
print('after_request',r)
return r
@user.teardown_app_request
def teardown_request(r):
print('teardown_request')
return r
注意:
钩子函数写在蓝本或者启动文件中 都可以捕获到所有的请求和响应(一样)一个flask中只需要写一个钩子函数而不需要重复写钩子函数