20200717《Flask进阶》——Flask与HTTP(一)

第二章 Flask与HTTP协议

2.1 请求响应循环

- 客户端 —— HTTP ——web服务器 —— WSGI —— Flask —— 数据库

2.2 HTTP请求

- URL组成,以http://helloflask.com/hello?name=lieven为例:
    - http://   协议字符串,指定要使用的协议
    - helloflask.com    服务器的地址(域名)
    - /hello?name=lieven    要获取的资源路径(path),类似UNIX的文件目录
    - 浏览器与服务器之间交互的数据被称为报文(message),分为请求报文(request message)和响应报文(response message)
    - 请求报文组成:请求的方法 + URL + 协议版本 + 首部字段(header) + 内容实体
    - 查看报文: 在浏览器中开发者工具(F12)里的Network
    - HTTP的方法类型:
        - GET   获取资源
        - POST  传输数据
        - PUT   传输文件
        - DELETE    删除资源
        - HEAD  获得报文首部
        - OPTIONS   询问支持的方法
    - Request对象: 请求对象封装了从客户端发出的请求报文,我们能从它获取请求报文的所有数据
    - request对象的常用属性:
        - args  储存解析后的查询字符串,可以用字典的方式获取键值
        - blueprint 获取当前蓝本的名称
        - cookies   一个包含所有随请求提交的字典
        - data  包含字符串形式的请求数据
        - endpoint  与当前请求匹配的端点值
        - files 包含所有上传文件,可以使用字典的形式获取文件
        - form  与files类似,包含表单
        - values    结合了args和form属性的值
        - get_data
        - get_json
        - headers
        - is_json
        - json
        - method    请求的HTTP方法
        - referrer  请求发起的源URL
        - scheme    请求的URL模式(http或https)
        - user_agent    用户代理(User Agent,UA),包含了用户的客户端类型,操作系统类型等信息
    注:当直接使用键作为索引获取数据时(比如request.args['name']),如果没有对应的键,会返回HTTP 404错误相应,而不是Keyerror异常
        为了避免这个错误,我们应该使用get()方法获取数据,如果没有对应的值,返回None,get()方法的第二个参数可以设置默认值,比如:
        request.args.get('name', 'lieven')
- 在Flask中处理请求
    - 路由匹配:为了将请求分发到对应的视图函数,程序实例中储存了一个路由表(app.url_map),当请求发来后,flask会根据请求报文中的
        URL(path部分)来尝试与这个表中的所有URL进行匹配,调用匹配成功的试图函数,如果没有找到,就返回404错误
        flask routes 可以查看程序中定义的所有路由
    - 可以在路由中监听HTTP方法,用methods参数,如果请求的方法不符合要求时,请求将无法被正常处理。
    - 路由中可加入转换器,格式:<转换器:变量名>
        flask内置的转换器:string、int、float、path、any、uuid
    - 请求钩子,以装饰器的形式:
        - before_first_request  注册一个函数,在处理第一个请求前运行
        - before_request    注册一个函数,在处理每个请求之前运行
        - after_request     注册一个函数,如果没有未处理的异常抛出,会在每个请求结束后运行
        - teardown_request  注册一个函数,即使由未处理的异常抛出,会在每个请求结束后运行,如果发生异常,会传入异常对象作为参数到注册函数中
        - after_this_request    在视图函数内注册一个函数,会在这个请求结束后运行
    - 响应在flask中使用Response对象表示
    - 重定向函数:redirect(),使用此函数时默认的状态码为302
    - 手动返回错误响应,使用函数abort(),参数为错误响应代码,如404,当abort函数被调用,之后的代码将不会被执行
    - 响应格式:在HTTP响应中可以有多种格式,默认为HTML。不同的格式需要设置MIME类型,在首部的Content-Type字段中定义,例:
        Content-Type:text/html; charset=utf-8
    - 常用的数据类型:
        - 纯文本   text/plain
        - HTMl  text/html
        - XML   application/xml(被设计用来交换数据,弥补HTML较繁琐的不足)
        - JSON  application/json(轻量的交换数据的格式,弥补了XML体积大、速度慢的不足,并且能和JS更好的兼容,flask提供了
            jsonify()函数)
        - 方法,make-response(),生成响应对象
    - Cookie技术:HTTP是无状态协议,即在一次请求响应结束后,服务器不会留下任何对方状态的信息,
        若要保存数据,需要cookie技术,即在请求和响应之间cookie数据来保护客户端的状态信息
        cookie指服务器为了存储某些数据而保存在浏览器上的小型文本数据,浏览器会在一定时间内保存它,并在下次向同一个服务器
        发送请求时附带这些数据
        - 方法set_cookie()    设置cookie   
        其他Response类的常用方法/属性:
        -   headers     一个Werkzeng的Headers对象,表示响应首部,可以像字典一样操作
        - status    状态码,文本类型
        - status_code    状态码,整型
        - mimetype      MIME类型(仅包括内容类型部分)
        - set_cookie()  用来设置一个cookie
        - Cookie数据加密————session,在编程中session指用户会话,即服务器和客户端之间的交互
            在Flask中,session对象用来加密Cookie,默认情况下,会把数据存储在浏览器上一个名为session的cookie里
            session通过密钥对数据进行签名并加密数据
            设置密钥,通过Flask.secret_key属性,或者配置变量SECRET_KEY设置
            更安全的做法是把密钥写进系统环境变量(在命令行中使用export或set命令),或是保存在.env文件中
            然后在程序脚本中使用os模块提供的getenv()方法获取:
- Flask上下文:可以把编程中的上下文理解为当前环境的快照,Flask中有程序上下文(applicationg context)和请求上下文(request context)
    Flask中的上下文变量:
    - reques
    - session
    - current_app
    - g
    一下4种情况FLask会自动激活程序上下文:
    - 用flask run 启动程序时
    - 用app run 启动程序时
    - 执行@app.cli.command()装饰器注册的flask命令时
    - 使用flask shell 启动python shell时
    注:同样依赖上下文的还有url_for()和  jsonify()等函数
    - 上下文钩子:teardown_appcontext,使用它注册的回调函数会在程序上下文被销毁时被调用(通常也是请求上下文被销毁时)
- HTTP进阶:
    - 获取上一个页面的url:
        - request.referrer
        - 查询参数,一般命名为next,例如:url_for('index', next=request.full_path)
    - URL安全验证:
        URL验证函数:is_safe_url(),用来验证变量值是否属于程序内部URL
- AJAX技术,指异步Javascript和XML,是一系列技术的组合
    AJAX基于XMLHttpRequest让我们可以在不重载页面的情况下和服务器进行数据交换   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值