Flask - 视图函数views的操作

2018-07-15  本文已影响0人  月亮是我踢弯得

一、视图-路由

路由对应视图函数,并且可以接受参数。

参数类型

    路劲参数

    位置参数

关键字参数

请求参数

     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

官方文档:http://www.redis.net.cn/

上一篇下一篇

猜你喜欢

热点阅读