网站前台建设需要哪些技术知识,php综合网站源码,公司电子商务平台和企业网站建设和维护工作管理办法,2018做技术分享网站有前景吗文章目录 一、请求响应循环二、HTTP请求1. 请求报文2. request对象3. 在flask中处理请求3.1 路由匹配3.2 设置监听的http方法3.3 URL处理 三、请求钩子 一、请求响应循环
每一个web应用都包含这种处理方式#xff0c;请求-响应循环#xff1a;客户端发出请求#xff0c;服务… 文章目录 一、请求响应循环二、HTTP请求1. 请求报文2. request对象3. 在flask中处理请求3.1 路由匹配3.2 设置监听的http方法3.3 URL处理 三、请求钩子 一、请求响应循环
每一个web应用都包含这种处理方式请求-响应循环客户端发出请求服务器端接受请求并返回响应。 从下图可以看出HTTP在整个流程中起到了至关重要的作用它是客户端和服务器端之间沟通的桥梁。
当用户访问一个URL浏览器便生成对应的HTTP请求经由互联网发送到对应的Web服务器。Web服务器接收请求通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。在程序中Flask根据请求的URL执行对应的视图函数获取返回值生成响应。响应依次经过WSGI转换生成HTTP响应再经由Web服务器传递最终被发出请求的客户端接收。浏览器渲染响应中包含的HTML和CSS代码并执行JavaScript代码最终把解析后的页面呈现在用户浏览器的窗口中
二、HTTP请求
URL是一个请求的起源。一个标准的URL由很多部分组成以下面这个为例 http://www.baidu.com/hello?namezly http:协议字符串指定要使用的协议。 www.baidu.com服务器弟子域名。 /hello?namezly要获取的资源路径path类似于unix的文件目录结构。 请求的实质是发送到服务器上的一些数据这种浏览器与服务器之间交互的数据称为报文请求时浏览器发送的数据被称为请求报文而服务器返回的数据被称为响应报文。 1. 请求报文
请求报文由请求的方法、URL、协议版本、首部字段以及内容实体组成。 常见的http方法类型
方法说明get获取资源post创建或更新资源put创建或替换资源delete删除资源head获得报文首部options询问支持的方法
报文首部包含了请求的各种信息和设置比如客户端的类型是否设置缓存语言偏好等等。
2. request对象
flask请求对象request这个请求对象封装了从客户端发来的请求报文。 请求解析和响应封装实际上大部分是由werkzeug完成的flask子类化werkzeug的请求Request和响应Response对象并添加了和程序相关的特定功能。 假如此时有一个请求http://www.baidu.com.cn/hello?namezly 当flask接收到请求后请求对象会提供多个属性来获取URL的各个部分。常用属性如下表所示
属性值path‘/hello’full_path‘/hello?namezly’host‘www.baidu.com.cn’host_url‘http://www.baidu.com.cn/’base_url‘http://www.baidu.com.cn/hello’url‘http://www.baidu.com.cn/hello?namezly’url_root‘http://www.baidu.com.cn/’
除了URL之外请求报文中的其他信息都可以通过Request对象提供的属性和方法获取常用部分如下表所示
属性/方法说明method获取请求的HTTP方法例如GET、POST、PUT等。args包含GET请求参数的字典可以通过request.args[‘key’]或request.args.get(‘key’)来获取特定参数的值。form包含POST请求参数的字典可以通过request.form[‘key’]或request.form.get(‘key’)来获取特定参数的值。files包含上传文件的字典可以使用request.files[‘file_field_name’]来访问上传的文件。headers获取请求头部信息返回一个包含所有请求头的字典。可以使用request.headers[‘header_name’]来获取特定头部的值。cookies包含所有的Cookie信息的字典可以使用request.cookies[‘cookie_name’]来获取特定Cookie的值。session访问当前用户的会话对象可以使用request.session[‘key’]来获取会话数据。
3. 在flask中处理请求 url是指向网络上资源的地址。在flask中我们需要让请求的URL匹配对应的视图函数视图函数返回值就是URL对应的资源。 3.1 路由匹配
在 Flask 中路由匹配是通过装饰器来完成的。你可以使用 app.route 装饰器来定义路由并指定对应的 URL 规则。
from flask import Flaskapp Flask(__name__)# 定义根路径的路由
app.route(/)
def index():return Hello, World!# 定义其他路径的路由
app.route(/about)
def about():return About pageapp.route(/user/username)
def user_profile(username):return fProfile page of {username}
3.2 设置监听的http方法
在 Flask 中你可以使用 methods 参数来设置路由监听的 HTTP 方法。这个参数可以是一个字符串也可以是一个包含多个方法的列表。
from flask import Flask, requestapp Flask(__name__)# 设置只接受 GET 请求的路由
app.route(/, methods[GET])
def index():return Hello, World!# 设置接受 POST 和 PUT 请求的路由
app.route(/data, methods[POST, PUT])
def handle_data():if request.method POST:return Received a POST requestelif request.method PUT:return Received a PUT request3.3 URL处理
URL变量部分默认类型为字符串但flask提供了一些转换器可以在URL规则中使用。
转换器说明string不包含斜线的字符串int整数float浮点数path包含斜线的字符串static路由的URL规则中filename变量就使用了这个转换器any匹配一系列值中的一个uuiduuid字符串
使用示例
app.route(/goback/int:year)
def go_back(year):return pWelcome to %d!/p % (2018-year)app.route(/colors/any(blue, white, red):color)
def three_colors(color):return color三、请求钩子
在 Flask 中你可以使用请求钩子Request Hooks来在请求的不同生命周期中执行特定的操作。Flask 提供了一些装饰器来定义这些钩子函数。 以下是几个常用的请求钩子
before_request在每个请求处理之前执行。可以用于进行认证、权限检查等操作。例如网站要记录用户最后在线的时间可通过用户最后发送的请求时间来实现。after_request在每个请求处理之后执行但只有在没有未处理的异常时才会执行。可以用于修改响应、添加头部信息等操作。例如我们经常在视图函数中进行数据库操作比如更新、插入等之后需要将更改提交数据库中提交更改的代码可以放到此钩子中。teardown_request在每个请求处理之后执行无论是否发生异常。可以用于清理资源、关闭数据库连接等操作。before_first_request在第一个请求处理之前执行用于初始化应用程序的全局状态。例如在玩具程序中运行程序前我们需要进行一些程序的初始化操作比如创建数据库表添加管理员用户。
from flask import Flaskapp Flask(__name__)# 在每个请求处理之前执行的钩子
app.before_request
def before_request():# 在这里执行需要在每个请求之前进行的操作print(Before Request)# 在每个请求处理之后执行的钩子
app.after_request
def after_request(response):# 在这里执行需要在每个请求之后进行的操作print(After Request)return response# 在每个请求处理之后包括异常情况执行的钩子
app.teardown_request
def teardown_request(exceptionNone):# 在这里执行需要在每个请求之后进行的操作print(Teardown Request)# 在第一个请求处理之前执行的钩子
app.before_first_request
def before_first_request():# 在这里执行需要在第一个请求之前进行的操作print(Before First Request)# 定义路由
app.route(/)
def index():return Hello, World!if __name__ __main__:app.run()