美文网首页
Flask - 视图函数views的操作

Flask - 视图函数views的操作

作者: 月亮是我踢弯得 | 来源:发表于2018-07-15 00:04 被阅读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/

    相关文章

      网友评论

          本文标题:Flask - 视图函数views的操作

          本文链接:https://www.haomeiwen.com/subject/lmuupftx.html