Flask入门
python
MVT
M: 模型 负责与数据库进行交互
V:视图(视图函数)负责业务逻辑的处理
T:模板 负责展示
MVC:
M: 模型 负责与数据库进行交互
V:视图(模板 负责展示)
C:控制器 (视图(视图函数)负责业务逻辑的处理)
WEB网站架构:
-
B/S
浏览器->服务器
-
C/S
客户端->服务器
一、Flask框架
简介:
flask是一个非常小的pythonweb框架 被称之为微型框架 只有一个强健的核心 所有功能都要依赖于第三方扩展库(要安装很多第三方扩展库)
安装:
pip3 install flask
完整运行代码
from flask import Flask #导入flask类
app = Flask(__name__) #类的实例化
#添加路由
#访问地址 http://127.0.0.1:5000/
#访问地址 http://127.0.0.1:5000
@app.route('/')
def index(): #视图函数
return 'Hello Flask!' #响应内容
if __name__ == '__main__': #主程序运行falsk
app.run()
访问地址:
run参数(不需要记 要知道)
参数 | 说明 |
---|---|
host | 主机 默认127.0.0.1 0.0.0.0 |
port | 端口号 默认 5000 |
debug | 调试模式 默认False 开启True |
threaded | 开启多线程(本地没意义的) |
实例:
app.run(host="0.0.0.0",port=5001,debug=True,threaded=True)
开发:
app.run(debug=True)
二、视图函数
(1) 无参路由
@app.route('/')
def index():
return 'index'
(2) 带一个参数的路由地址
@app.route('/arg/<argname>/')
def arg(argname):
return '参数argname的值为{}'.format(argname)
(3) 一个参数并限制参数类型
#限制参数类型
#参数默认类型都为字符串
# @app.route('/arg/<age>/')
# @app.route('/arg/<int:age>/') #限制参数类型为int类型
# @app.route('/arg/<float:age>/') #限制参数类型为float类型
# @app.route('/arg/<path:age>/') #限制参数类型为字符串类型 /不再做为分隔符 而是参数值的一部分
@app.route('/arg/<string:age>/') #默认就为字符串
def arg(age):
print(type(age))
return '带一个参数的路由地址{}'.format(age)
(4) 传递多个参数
@app.route('/args/<arg1>/<arg2>/')
@app.route('/args/<arg1>_<arg2>/')
def args(arg1,arg2):
return '参数1的值为{} 参数2的值为{}'.format(arg1,arg2)
(5) 参数可有可无的视图函数
#可有可无参数的视图
@app.route('/arg1/<string:age>/') #默认就为字符串
@app.route('/arg2/') #默认就为字符串
def arg(age='default'):
print(type(age))
return '带一个参数的路由地址{}'.format(age)
注意:
- 路由地址结尾的/ 建议都加上 如果在定义的时候没有/作为结尾 则访问的时候路由地址也不能有/ 否则404
- 如果定义的时候 有/作为结尾 但是访问的时候没有/ 则框架会自动301重定向 来帮你添加/
- 路由地址结尾的/如果存在 则访问有没有/都可以 如果定义的时候 没有/则访问不能存在/
三、重定向 redirect
- redirect()
- url_for()
导入
from flask import redirect,url_for
实例
from flask import url_for,redirect
#重定向
@app.route('/testredirect/')
def testredirect():
# return redirect('值为路由地址')
# return redirect('/') #去首页
# return redirect('/arg1/18/') #重定向到一个参数的视图函数
# return redirect('/args/zhangsan/18/') #重定向到多个参数的视图函数
# return url_for('index') #通过视图函数名称反向解析路由地址 /
# return url_for('arg',age=18) #通过视图函数名称反向解析路由地址 /arg1/18/
# return url_for('args',arg1='zhangsan',arg2=18) #通过视图函数名称反向解析路由地址 /args/zhangsan/18/
# 组合使用
# return redirect(url_for('index'))
return redirect(url_for('arg',age=18))
四、终止代码执行 abort
概述:
类似 python中的raise 上方代码正常执行 下面代码不再执行
区别: raise 抛出错误名称 abort 参数为http标准状态库中的状态码 抛出对应的信息
导入
from flask import abort
@app.route('/')
def index():
# abort(404)
# abort(500)
return 'index'
# pass
#捕获状态码
@app.errorhandler(500)
def server_error(err):
return '错误信息{}'.format(err)
#捕获状态码
@app.errorhandler(404)
def not_found(err):
return '错误信息{}'.format(err)
五、请求 request
导入
from flask import request
作用:
获取请求者携带着的请求数据
概述:
flask框架 在接收到用户的请求以后 会自动创建出 请求对象 request 在使用的时候 只需要导入即可
请求的属性
-
url 完整的url地址
-
base_url 去除get的url
-
host_url 只有主机和端口的url
-
host 只有主机和端口
-
path 获取请求的路由地址
-
method 获取请求方式(大写)
-
remote_addr 客户端请求ip地址
-
args 获取get传参 建议使用get方法来获取 如果key不存在则返回 None(不报错)
getlist() 以列表形式获取具有相同key的get传参
-
form 获取post传参
-
files 获取文件上传
-
headers 获取所有的请求头信息
-
cookies 获取cookie值
-
json 获取传递过来的json数据
实例
#http://127.0.0.1:5000/request/?name=zhangsan&name=lisi&age=18/#abc
@app.route('/request/')
def Request():
print(request.url) #获取完整请求url
print(request.base_url) #去掉get传参的url
print(request.host_url) #只有主机和端口的url
print(request.host) #只有主机和端口
print(request.path) #返回路由地址
print(request.method) #请求的方法
print(request.remote_addr) #客户端请求ip地址
print(request.args) #获取get传参
print(request.args.get('name')) #获取get传参
print(request.args['name']) #获取get传参
print(request.args.getlist('name')) #获取get传参
print(request.headers) #获取请求头信息
return 'request'
六、路由响应 response
导入:
from flask import make_response
实例
from flask import make_response
#响应
@app.route('/response/')
def response():
# return '响应',404
res = make_response('响应',404)
return res
会话控制 cookie和session
概述:
原因是http协议为无状态协议 每次请求都是一个新的会话 为了维护一个用户的连续的请求和状态的维持 所以使用cookie和session
七、cookie
cookie将数据存储在客户端(也就是浏览器中) 明文存储 不安全 很多浏览器都对cookie个数的存储存在限制 一般一个站点最多存储20个cookie
(1) 设置cookie
Response.set_cookie(key,value,max_age=None,expires=None,path=’/’)
max_age: 值为秒 活…秒
**expires:**值为一个截至的时间戳 活到某个时间戳就终止
**path:**cookie值的有效路径
实例
#设置cookie
@app.route('/set_cookie/')
def set_cookie():
res = make_response('设置cookie')
#设置cookie 默认存活时间为 浏览会话结束
res.set_cookie('message','有比女朋友漏气更苦比的事吗? 男朋友漏电了')
return res
(2) 设置cookie并设置过期时间
实例
#设置cookie并设置过期时间
@app.route('/set_cookie_lifttime/')
def set_cookie_lifttime():
res = make_response('设置cookie并设置过期时间')
# res.set_cookie('message','拼搏到无能为力 坚持到感动自己',max_age=30)
import time
leftTime = time.time()+30 #30秒以后的时间戳
res.set_cookie('message','拼搏到无能为力 坚持到感动自己',expires=leftTime)
return res
(3) 获取cookie
实例
#获取cookie
@app.route('/get_cookie/')
def get_cookie():
print(request.cookies) #打印所有cookie
value = request.cookies.get('message') #获取cookie
return '获取cookie的值为--{}'.format(value)
(4) 删除cookie
实例
#删除cookie
@app.route('/delete_cookie/')
def delete_cookie():
res = make_response('删除cookie')
# res.delete_cookie('message') #删除cookie
res.set_cookie('message','',max_age=0) #重新设置 刚活就死掉了
return res
八、session
session将数据存储在服务器端 基于cookie cookie来存储session值的唯一id 称之为sessionid 安全性高于cookie 如果服务器端的session存储过高 会占用服务器的性能啊 将重要的数据存储在服务器端 不重要的存储在客户端
注意:
设置session 需要密钥 secret_key
导入
from flask import session
(1) 设置session
实例
#设置session
@app.route('/set_session/')
def set_session():
session['key'] = '最牛比的字是什么字?昊'
return '设置session'
默认: 关闭浏览器就结束
(2) 设置session并设置过期时间
实例
#设置session并设置过期时间
@app.route('/set_session_lefttime/')
def set_session_lefttime():
from datetime import timedelta #计算时间差值的类
#开启持久化存储
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=1) #存活1分钟
session['key'] = '最牛比的字是什么字?昊'
return '设置session过期时间'
(3) 获取session
实例
@app.route('/get_session/')
def get_session():
return session.get('key','default')
(4) 删除session
实例
@app.route('/delete_session/')
def delete_session():
session.pop('key') #删除某一个key
session.clear() #清除所有
return '删除session'