第二课 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请求的客户端地址
argsGET请求参数
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个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值