Flask - 视图函数views的操作
一、视图-路由
路由对应视图函数,并且可以接受参数。
参数类型
路劲参数
位置参数
关键字参数
请求参数
get 参数在路劲中?之后
post 参数在请求体中
参数语法
converter:var_name (参数类型:参数名)
参数类型comverter
string 字符串 接收的时侯也是string,匹配到 / 的时候是匹配结束
#带参数,默认是string
@blue.route('/getname/')
def getname(username):
print(type(username))
return '你的名字是:%s' % username
path 路径 接收的时侯也是string,而 / 只会当字符串中的一个字符处理
# 带参数path
@blue.route('/getpath/')
def getpath(where):
return '你在哪?%s' %where
int 整数行 接收的时侯也是int,匹配到 / 的数字
# 带参数 整形
@blue.route('/getage/')
def getage(age):
return '我的年龄是: %d' % age
any 多个中意义一个 指的是any 中提供的任意一个,类似于SQL查询中的 in
# 带参数any[数据库in] 多个选一个
@blue.route('/getoption/')
def getoption(op):
return '你的选择的是:%s' % op
uuid 格式
import uuid
#获取uuid
@blue.route('/getuuid/')
def get_uuid():
return str(uuid.uuid4())
# 带参数uuid
@blue.route('/getuuid/')
def getuuid(uu):
return '你的uu %s' %uu
float 格式
# 带浮点型参数
@blue.reute('/getscore/')
def getscore(score):
return '你的成绩 %f' % score
注意:默认是string类型
路由参数名和视图函数名必须一致 !!
请求方式
默认支持GET,HEAD,OPTIONS
如果想支持某一请求方式,需要自己手动指定
@blue.route('/requesttest/',mothods=['POST','GET','PUT'])
反向解析
语法
url_for()
url_for('蓝图名.函数名')
例如
#反向解析
@blue.route('/gethello/')
# url_for('蓝图名.函数名')
def gethello():
p=url_for('blueflask.index')
return p
反向解析即是获取对应的路劲
二、视图 - Request 请求
服务器在接收到客户端请求后,会自动创建Request对象,由Flask自动创建,Requestt对象不可修改。
request.method 请求方式
request.path 路由中的路径
request.args get 请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象 数据存储也是key-value 外层是大列表,列表中的元素是元组,元组中左边是key,右边是value
request.form
存储结构和args一致
默认是接受post参数
hai可以接收PUT,PATCH参数
re'quest.url 完整请求地址
request.base_url 去掉GET参数的URL
request.remove_addr 请求客户端地址
request.file 上传文件
request.headers 请求头
request.cookie 请求中的cookie
ImmutableMultiDict类型
ImmutableMultiDict类似字典的数据结构 与字典的区别,可以存在相同的键
args、form、files都是ImmutableMultiDict的对象
ImmutableMultiDict数据获取方式
dict['uname']
dict.get('uname') # 推荐(在没有数据为空)
dict.getlist('uname') # 获取指定key对应的所有值
例如
@blue.route('/requesttest/',methods=['GET','POST'])
def requesttest():
#请求方式
print(request.method)
#请求路径
print(request.path)
#请求参数(get)类似于字典
print(request.args)
# print(request.args['name'])
print(request.args.get('sex')) # 取值
#请求参数(post)# 类似于字典
print(request.form)
print(request.args.get('name'))
#客户地址
print(request.remote_addr)
#请求头
print(request.headers)
# cookie
print(request.cookies)
#文件上传
print(request.files)
return '请求测试'
request、session 是内置对象(所有路由函数中都有)!
三、视图 - Response响应
服务器返回给客户端的数据
Response创建方式
直接返回字符串
render_template 渲染模板,将模板转换成字符串
make_response 创建一个相应,是一个真正的Response
Response()创建
redirect
重定向
返回的也是Response
反向解析
url_for('蓝图名.函数名')
endpoint
app上直接使用函数名
blueprint 蓝图名.函数名
例如
返回字符串
直接写,将内容传递过去
@blue.route('/response/')
def get_response():
return '带你装逼带你飞,带你走进垃圾堆!',403
返回创建response对象
@blue.route('/testresponse/')
def testresponse():
#创建response对象
respon = make_response('睡觉的醒醒!')
print(respon)
print(type(respon))
return respon
返回重定向
@blue.route('/redirect/')
def make_redir():
# 反向解析
return redirect(url_for('first.make_resp'))
返回json数据
resp = make_response('{'name':'disen','age':18}',200)
resp.headers['Content-Type'] = 'application/json'
return resp
return jsonify({'name':'disen','phone':17788818818})
返回配置
返回内容
直接写,将内容传递过去
@blue.route('/response/')
def get_response():
return '一神带四眼,一个打九个,就这么六',403
返回状态码
字符串形式直接将状态码添加到return的第二个参数
如果make形式,直接添加到meke的第二个参数上
# response 响应
@blue.route('/makeresponse/')
def make_resp():
resp = make_response('
社会我胖哥,人狠,话不多!!
',300)returen resp
返回重定向
redirect 重定向 302
url_for 反向解析
@blue.route('/redirect/')
def make_redir():
# 固定
# return redirect('/makeresponse/')
#反向解析
return redirect(url_for('blue.make_resp'))
抛出异常,终止程序执行
abort 状态码
@blue.route('/makeabort/')
def make_abort():
# 抛出异常(4xx,5xx)
abort(404)
return '发生了什么?'
捕获异常
可以根据状态或 Exception进行捕获
函数中要包含一个参数,参数用来接收异常信息
#捕获404异常
@blue.errorhandler(404)
def hanfler404(exception):
return '
这逼是404!!,锤它。
'四、视图 - 会话技术
会话技术都是来解决HTTP请求在网络开发中短链接的问题,HTTP是无状态的。
Cookie
客户端会话技术,浏览器的会话技术
数据全是存在客户端中
Cookie是通过服务器创建的Responsse来创建的
cookie特性
支持过期时间
默认会自动携带本网站的所有cookie
根据域名进行cookie存储
不能跨域
不能跨浏览器
设置cookie
response = redirect(url_for('blue.index'))
resp.set_cookie('username',username)
获取cookie
username = request.cookie.get('username','游客')
删除cookie
resp = redirect(url_for('blue.user_index'))
resp.delete_cookie()
备注:
# 模板转为字符串
tempstr = render_template('about.html',username= uu)
respon = make_response(tempstr)
return respon
cookie交互流程
Session
服务端的会话技术
所有数据存储在服务器中
默认存储在内存中
Django默认做了数据持久化(存在了数据库中)
存储结构也是key-value形式,键值对(其实就是字典)
session 是离不开cookie的
设置session
session['username'] = username
获取session
username= session.get('username','游客')
删除session
#方式一:session是存在cookie中的
resp.delete_cookie('session')
# 方式二:直接删除session中对应数据
session.pop('username')
session 交互流程
注意:要使用session还需要密匙种子SECRET_KEY,在app初始化添加进去既可以(app.config[SECRT_KEY] = '123WER1245erwrwe&*%W34@##*&@!)
Token
手动实现的session
如果在web开发中没有cookie,那么token也是不能使用的
脱离web前端,Token是可以使用的
传输给客户端,客户端保存
在请求的时候,将token值再传输回来
五、session -- 持久化保存
flask 中这些插件中几乎并没有干扰到之前的任何逻辑,使用起来非常的方便,就类似于中间件。
flask中session默认存储在内存中;
django中做了持久化,存储在数据库(可以修改到redis中);
flask中没有对默认session进行任何处理;
flask-session 可以实现session的数据持久化;
redis(缓存在磁盘上的时候,管理磁盘文件使用lru, 最近最少使用);
flask-session 安装
pip install flask-session
官方文档:https://pythonhosted.org/Flask-Session/
官方文档:http://flask.pocoo.org/snippets/category/sessions/
flask-session 的配置(初始化完成后,使用和之前session使用)
初始化 flask-session (在__init__.py中)
from flask-session import Session
app.config['SECRET_KEY'] = '135Wwei@o*&^dfsfasd78#*' # 密匙
app.config['SESSION_TY[E'] = 'redis' # 配置数据库
session = Session() # 实例化session对象
session.init_app(app) # session 对象初始化
# 简化操作:session =Session(app)
redis连接问题(需要启动)
redis-sever
redis查看值
#进入redis
redis-cli
#查看所有
keys *
# 获取对应的值
get xxx(key)
#获取时间(session 的生命周期,默认为31)
ttl xxx(key)
# 删除对应的值
del xxx(key)
#删除当前所有的
flushdb
session其他设置(flask-session同样适用)
PERMANENT_SESSION_LIFETIME 设置超时时间
app.config[PERMANENT_SESSION_LIFETIME] = 60
SESSION_COOKIE_NAME 设置会话cookie的名称
app.config['SESSION_COOKIE_NAME'] = 'falsk'
如果没有安装redis-server时启动启动不了的。安装操作:sudo apt insatll redis