第二课 Flask路由、请求和会话_路由请求会话-程序员宅基地

技术标签: python_Flask框架  

Flask 第二课Flask路由、请求和会话

tags:

  • Flask
  • 2019千锋教育

categories:

  • flask
  • 视图
  • 路由
  • Request对象
  • Response对象
  • Session
  • Cookie
  • Flask-Session

第一节 flask的路由

1. Flask 网络请求的流程

在这里插入图片描述

  1. Flask 有四大内置对象
    • Request对象 request
    • Session对象 session
    • G对象 g
    • Config对象
      • 在模板中config
      • 在python代码中app.config

2. 路由

  1. 路由: 将从客户端发送过来的请求分发到指定函数上
  2. route规则-传参写法<converter:variable name>,converter对变量进行约束
  3. 内置converter类型如下(可以自定义):
    • string接收任何没有斜杠(‘\’)的文件(不设约束时默认)
    • int 接收整型
    • float 接收浮点型
    • path 接收路径,可接收斜线(’/)
    • uuid 只接受uuid字符串,唯一-码,一种生成规则
    • any 可以同时指定多种路径,进行限定
  4. 例子: 下面是注册蓝图blue后的写法。若没有注册用app.route()
  5. 注意:
    • 一个函数上面可以映射多个路由。
    • 可以出现相同的两个路由不报错。访问时以第一个路由为主。
@blue.route('/')
def index():
    #渲染模板和传参 {
    { msg }}
    #return render_template('index.html', msg="今天天气好")
    return 'Hello Flask'


# 传 整型参数
@blue.route('/users/<int:id>/')
def users(id):
    # 将参数约束为数值类型, 浏览器写其他参数报错
    print(id)
    return 'Get Int %s' % str(id)


# 传 字符串参数 不设约束时默认(string).
# 传空或者参数中有/ 。报错找不到。
@blue.route('/getinfo/<string:token>/')
def getinfo(token):
    print(token)
    return 'Get String Success %s' % (token)


# 传 路径参数
# 这里同样不能传空
@blue.route('/getpath/<path:address>/')
def getpath(address):
    print(address)
    return 'Get PATH Successs {}'.format(address)


# 传 UUID参数
@blue.route('/getuuid/<uuid:uu>/')
def getuuid(uu):
    # 网上找一个uuid测试:d6132fce-910d-4261-85c3-e537ce055e05
    print(uu)
    return 'Get UUID Success {}'.format(uu)


# 传 any参数 穷举(只能选a或b)
@blue.route('/getany/<any(a,b):an>')
def getany(an):
    print(an)
    return 'Get Any Success {}'.format(an)
    

@blue.route('/getnotice/<string:notice>/')
@blue.route('/getnotice/<uuid:notice>/')
def getnotice(notice):
    # 一个函数上面可以映射多个路由。
    # 可以出现相同的两个路由不报错。访问时以第一个路由为主。
    print(notice)
    return 'Get notice Success %s' % (notice)

3. 视图函数的方法

  1. 默认支持GET HEAD OPTIONS, 其余请求不支持。
  2. 如想要支持别的请求,需要手动注册。
  3. methods中指定请求方法GET POST HEAD PUT DELETE
@blue.route('/', methods=['GET', 'POST'])
def index():
    #渲染模板和传参 {
    { msg }}
    #return render_template('index.html', msg="今天天气好")
    return 'Hello Flask'
  1. url for反向解析,根据函数名字,获取反向路径url for(‘函数名’,参数名=value)
    • 有蓝图 蓝图 + 函数
    • 没有蓝图 直接路由函数
# 重定向函数
@blue.route('/redirect/')
def red():
    # 这种属于 硬编码
    return redirect('/')
    

# 反向路由
@blue.route('/redirect1/')
def red1():
    # 这种属于 反向解析
    # 有蓝图 蓝图 + 函数
    # 没有蓝图 直接路由函数
    return redirect(url_for('blue.index'))


# 反向路由传参
@blue.route('/redirect2/')
def red2():
    # 反向路由传参
    return redirect(url_for('blue.getany', an='a'))

第二节 Flask请求和响应对象

1. flask的四大内置对象-Request对象

  1. 服务器在接收到客户端的请求后,会自动创建Request对象。由Flask框架创建,Request对象不可修改
  2. 它常见的属性
属性 属性的意义
url 完整请求地址
base url 去掉GET参数的URL
host url 只有主机和端口号的URL
path 路由中的路径
method 请求方法
remote addr 请求的客户端地址
args GET请求参数
form 请POST请求参数
files 文件上传
headers 请求头
cookies 请求中的cookie
  1. get 它并不是get专属,所有请求都能获取这个参数
  2. form 直接支持put 和 patch
  3. ImmutableMultiDict类 是dict子类
    • args和form都是ImmutableMultiDict的对象
    • 与字典的区别,可以存在相同的键
    • ImmutableMultiDict中数据获取方式dict[‘uname’]或dict.get()'uname) 推荐用get
    • 获取指定key对应的所有值(因为相同的键可以对应不同值) dict.getlist(‘uname’)
# Request对象由Flask框架生成
@blue.route('/getrequest/')
def get_request():
    print(request.host)
    print(request.url)
    if request.method == 'GET':
   		print('GET')
    return 'Get request Success '
    
    
# args 接收GET请求参数
# http://127.0.0.1:5000/sendrequest/?user=Rock&password=rock1204
@blue.route('/sendrequest/')
def send_request():
    # 列表下把参数变为元组
    print(request.args) #ImmutableMultiDict([('user', 'Rock'), ('password', 'rock1204')])
    print(type(request.args))
    return 'Send request Success '


# form接收POST参数
# 用PostMan模拟请求
@blue.route('/sendrequest1/', methods=['GET', 'POST'])
def send_request1():
    # POST方式时GET的的参数也能获取到
    print(request.args)
    print(type(request.args))
    print(request.form)
    print(type(request.form))
    print(request.headers)
    return 'Send request Success '

2. Response对象介绍

  1. Response对象:服务器返回会给客户端的数据。由程序员创建,返回Response对象的三种方式
    • 直接返回字符串
    • 直接返回Response对象
    • 通过make_response (data, code) data返回的数据内容 code状态码
    • 返回模板render_template()(本质第一个一样,它把HTML变成字符串)
  2. 重定向
    • redirect()
    • 反向解析url_for(‘函数名’, 参数=value)
  3. 终止执行: 主动终止abort(code)
  4. 捕获异常: 提升交互让程序变得友好
    @app.errorhandler(404)
    def handler_error(error):
    	return 'Error'
# Response 对象
@blue.route('/getresponse/')
def get_response():
    # return 'Hello sleeping ', 404  # 返回状态码404
    # result = render_template('HelloURL.html')
    # print(result)
    # print(type(result))
    # return result
    # response = make_response('<h1>帅吗?</h1>')
    # print(response, type(response)) #<Response 18 bytes [200 OK]> <class 'flask.wrappers.Response'>
    abort(404) #终止请求
    response = Response('自己造一个Response')
    return response


@blue.errorhandler(404)
def handler_error(error):
    print(error)
    print(type(error))
    return 'What'

第三节 flask的会话机制

  1. 跨请求共享数据
  2. 出现原因
    • web开发中http都是短连接(connection:keepAlive)
    • http请求是无状态的
    • 请求从request到response就结束了(请求声明周期)
  3. Cookie
    • 客户端会话技术
    • 数据存储在客户端
    • key-value
    • flask默认对cookie 进行处理,支持中文。
  4. Session
    • 数据存储在服务器
    • key-value存储
    • 对数据进行序列化
    • 还进行了base64
    • 还进行了zlib压缩
    • 还传递了hash
    • 最后Flask中将session数据存储在cookie中
  5. Token

1. Cookie

@blue.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        response = Response('登录成功%s' % username)
        # 设置Cookie
        response.set_cookie('username', username)
        return response


# 获取cookie中的信息
@blue.route('/mine/')
def mine():
    username = request.cookies.get('username')
    return '欢迎回来'

2. Session

  1. 运行报错没有设置secret key。到配置文件中加入: SECRET_KEY = “d6132fce-910d-4261-85c3-e537ce055e05”
  2. 这个值可以随便写,越复杂越安全
@blue.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        response = Response('登录成功%s' % username)
        # 设置Cookie
        #response.set_cookie('username', username)
        # 设置Session
        # 报错The session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.
        session['username'] = username
        return response


# 获取cookie中的信息
@blue.route('/mine/')
def mine():
    username = session.get('username')
    return '欢迎回来'
  1. 服务器关闭,重启后。发现session依然存在。这是因为Flask中将session数据处理后存储在cookie中。

3. Flask-Session

  1. 上面我们知道Flask默认把session存在了cookie中。这种方式不好
  2. 我们想要让session存储到我们的服务器上,所以可以用Flask-Session库。
  3. 安装:pip install Flask-Session -i https://pypi.douban.com/simple
  4. 配置Flask-Session
    1. 在settings.py中配置。SESSION_TYPE = ‘redis’ # 把Session存到redis中
    2. 在ext.py中注册配置。from flask_session import Session Session(app)
  5. 再次运行上述代码:
    • 可以发现session已经不存在cookie中了,它存在我们的redis中
    • 在电脑上其他浏览器也可以访问session
  6. 可以指定过期时间。默认31天。写在settings.py中。PERMANENT_SESSION_LIFETTME
  7. 配置Session安全。SESSION_ COOKIE_ SECURE = True
  8. SESSION_TYPE 默认为null。
    • null: NullSessionInterface (default)
    • redis: RedisSessionInterface
    • memcached: MemcachedSessionInterface
    • filesystem: FileSystemSessionInterface
    • mongodb: MongoDBSessionInterface
    • sqlalchemy: SqlAlchemySessionInterface
  9. 不想别人直接看到Sessionid保证安全。它也是用设置中secret_key进行签名的。 SESSION USE_ SIGNER =True
  10. SESSION_REDIS(默认配置本机redis): 可选择其他的redis
  11. 最大保存session数SESSION_FILE_THRESHOLD. 默认为500个
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aa18855953229/article/details/104032424

智能推荐

基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice-程序员宅基地

文章浏览阅读213次。一、基于JAX-WS的Web Service服务端/客户端下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节。JAX-WS简介:JAX_RPC(Java API for XML-Based RPC)允许Java应用程序可以通过已知的描述信息调用一个基于Java的Web服务,描述信息与Web服务的W..._基于sum-jaxwx开发的webservice获取客户端ip的方法

[论文翻译] Machine learning: Trends, perspectives, and prospects_机器学习论文翻译3000字以上-程序员宅基地

文章浏览阅读965次。[论文题目]:Machine learning: Trends, perspectives, and prospects[论文来源]:Machine learning: Trends, perspectives, and prospects[翻译人]:BDML@CQUT实验室Machine learning:Trends,perspectives, and prospects机器学习:趋势、观点和前景M. I. Jordan1* and T. M. Mitchell2*AbstractMach_机器学习论文翻译3000字以上

vim下缩进及高亮设置-程序员宅基地

文章浏览阅读63次。1、配置文件的位置在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件。如果不知道配置文件及脚本的位置,可以在vim中使用命令 :scriptnames,将显示如下路径/etc/vimrc/usr/..._vim 缩进部分高亮显示

多线程 环形缓冲区_使用环形缓冲区有效登录多线程应用程序-程序员宅基地

文章浏览阅读967次。“有两种编写无错误程序的方法;只有第三种有效。” -艾伦·J·佩利斯 在关键计算机应用程序的生命周期中,日志记录是非常重要的活动,尤其是在故障症状不明显时。 日志记录提供了故障之前应用程序状态的最大详细信息,例如变量的值,函数的返回值等。 在一段时间内会生成单调增加的跟踪数据,并将其连续写入磁盘上的文本文件中。 有效的日志记录需要大量磁盘空间,并且在多线程环境中(其中有多个线程写入其跟踪信..._线程间同步 环形缓冲区

ubuntu 18.04安装cuda 8.0 和cudnn 6.0_ubuntu18安装cudnn-8.6.0-程序员宅基地

文章浏览阅读4.7k次,点赞4次,收藏14次。我的cuda 8.0的下载链接为:https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-runcudnn 6.0的下载链接为:https://developer.nvidia.com/compute/machine-learning/cudnn/s..._ubuntu18安装cudnn-8.6.0

java的实验报告_JAVA 实验报告-程序员宅基地

文章浏览阅读269次。石家庄铁道大学信息科学与技术学院实验报告2018年----2019年 第一学期题目:四则运算、生成验证码课程名称:JAVA语言程序设计班 级:信1705-2班姓 名:赵墨涵学号:20173623指导教师:王建民正文部分格式要求:1、正文汉子部分要求宋体小四,行间距固定值20磅;首行缩进两个字符。2、程序英文部分要求采用Times New Roman字体,行间距固定值20磅,程序缩..._石家庄铁道大学大二上学期java实验报告

随便推点

Python join() 方法与os.path.join()的区别-程序员宅基地

文章浏览阅读79次。Python join() 方法与os.path.join()的区别pythonJoinos.path.join今天工作中用到python的join方法,有点分不太清楚join() 方法与os.path.join()的区别,查了下,写个例子记录下,发现python的有些功能挺强大的,写了几行代码就搞定了,要是用c/C++,估计要多写很多行代码。 1. 函数作用:join() :将序...

VS code 的简单入门使用方法(汇总版本)_vs code怎么把关键字像notapad一样放在一栏-程序员宅基地

文章浏览阅读2.5k次。VS code 的简单入门使用方法背景本文仅仅将vs code 作为文本工具来用,并非将其作为IDE开发工具(替代类似Windows 中的Notepad++)。本文仅讨论 Mac 平台的 vs code。常见问题如何使用 Markdowncmd+shift+p打开命令行,搜索Markdown: Open Preview to the Side需要注意的是,临时文件搜不到这个,必须先保存为 *.md 然后上面的方式操作。功能整体临时用用还行,比Typora差远了默认打开文件的时候换_vs code怎么把关键字像notapad一样放在一栏

小程序异常监控及错误处理-程序员宅基地

文章浏览阅读2.4k次。小程序异常监控收集web端与小程序错误监控差异在 Web 端监测的是页面完整的 url,而小程序端监测的是路由地址;小程序页面属于app内部的页面,使用时已全部加载完毕,因此监控页面性能时不统计页面加载时长等信息,更多的是对页面内请求、资源请求和用户行为的监控;由于微信官方和小程序代码的要求,集成方式对比 Web 端会相对严格一些。小程序需要监控的数据JavaScript异常监控..._小程序 代码异常监控

【分类器】机器学习综述-程序员宅基地

文章浏览阅读815次。机器学习综述摘要 本文主要参考中科院自动化研究所复杂系统与智能科学实验室王珏研究员《关于机器学习的讨论》,讨论机器学习的描述,理论基础,发展历史以及研究现状。关键字:机器学习,科学依据,发展脉络0引言 20世纪90年代初,当时的美国副总统提出了一个重要的计划——国家信息基本设施计划(NationalInformation Infrastructur..._关于分类器的综述

学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project-程序员宅基地

文章浏览阅读65次。下载并安装CMake3.0.1 要自己编译OpenCV2.4.9的源代码。首先。必须下载编译工具,使用的比較多的编译工具是CMake。以下摘录一段关于CMake的介绍: CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描写叙述全部平台的安装(编译过程)。他可以输出各种各样的makefile或者project文件,能測试编译器所支持的C 特性..._opencv报告

在多模态模型训练时,如何合适地融合单模态损失_多模态融合不如单模态-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏10次。多模态训练时候导致的单模态缺损,需要同时考虑单模态损失_多模态融合不如单模态

推荐文章

热门文章

相关标签