当前位置: 代码迷 >> 综合 >> 20200717《Flask进阶》——Flask与HTTP(一)
  详细解决方案

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

热度:72   发布时间:2024-01-29 17:04:07.0

第二章 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让我们可以在不重载页面的情况下和服务器进行数据交换   
  相关解决方案