建网站需要学什么,无锡 公共建设中心网站,简洁轻便的wordpress主题,温州seo网站建设文章目录
1、介绍2、demo演示3、Flask请求和响应 3.1 演示demo3.2 request获取请求体数据3.3 requests发送请求3.4 响应返回和接收 4、特殊路由 4.1 路由重定向4.2 路由拦截器
1、介绍
Flask是由python语言编写的轻量级Web应用框架#xff0c;主要应用于后端框架#xff…文章目录
1、介绍2、demo演示3、Flask请求和响应 3.1 演示demo3.2 request获取请求体数据3.3 requests发送请求3.4 响应返回和接收 4、特殊路由 4.1 路由重定向4.2 路由拦截器
1、介绍
Flask是由python语言编写的轻量级Web应用框架主要应用于后端框架处理客户端请求并返回响应。
2、demo演示
from flask import Flask#应用实例化
app Flask(__name__)#装饰器也称为路由将URL/’映射到视图函数(hello_world)
app.route(/)
def hello_world():、#定义的视图函数return Hello, World!if __name__ __main__:启动内置服务器app.run(host0.0.0.0, port5000, debugTrue)大家可在python环境下安装flask依赖执行上述代码flaskf服务启动后可直接在浏览器中输入 http://ip:5000/进行测试。
3、Flask请求和响应
flask作为后端框架开发者需要注意的两点一是定义请求路由地址及方法如GETPOST二是获取请求数据便于定义和实现视图函数的功能并返回响应。
3.1 演示demo
先定义一个完整的Flask服务路由地址和视图函数后面修改内容均在视图函数中的获取参数数据部分的内容
from flask import Flask,request
from gevent import pywsgiapp Flask(__name__)
#定义路由地址
demo_url /demo # 识别#请求方式POST
app.route(demo_url, methods[POST])
def predict_router():#获取文件数据file request.files.get(file)#获取文档数据id request.values.get(id)name request.values.get(name)return iddef __main(mode True):if mode:#创建WSGI服务server pywsgi.WSGIServer((0.0.0.0, 39026), app)print(f-------- 端口号 , port:{server.server_port} - ------)#服务持续运行server.serve_forever()else:#内置服务启动app.run(host0.0.0.0, port39026, debugTrue)if __name__ __main__:__main()使用上述代码启动服务后可使用Postman接口工具直接访问。 如上图postman工具访问服务时定义请求方式POST路由地址 http://ip:port/demo提交数据用的是body中的form-data表单数据其中的file字段是图片文件需在file字段后面选择file类型id和name字段使用text类型即可。
以上完整演示了后端服务启动前端postman工具接口调用的完整流程。下面将会分开讲解每一部分内容包括前端如何定义请求体数据发送请求后端如何获取请求体的数据返回响应最终前端接收响应。
3.2 request获取请求体数据
request对象来自于flask是一个请求上下文对象导入即可使用request中保存了此次HTTP请求的一切信息。
上述代码直接使用了如下的两种方式获取数据
#获取文件
request.files.get(file)#获取文本
request.values.get(id)另外对于文本数据request中还定义了以表单的形式获取
#获取表单数据注意表单数据中不包含文件文件获取方式仍用上述方式
request.form#获取表单数据单个字段
request.form.get(id)
request.form.get(name)#获取表单数据多个值列表形式即同一个字段可上传两个不同的数据获取时可用list
request.form.getlist(list)3.3 requests发送请求
使用postman工具可直接访问服务也可使用requests发送post请求并在其中定义请求体的数据。
import requests#定义请求发送的函数
def send_request(file,id):url http://localhost:39026/demo # 替换成你的 Flask 应用的实际接口地址try:#请求文件以二进制形式读取file {file: open(file,rb)}#请求文本data {id:id}#以post方式发送请求response requests.post(url, filesfile,datadata)#输出响应后的状态码,200表示成功if response.status_code 200:print(文件上传成功)except requests.exceptions.RequestException as e:print(请求发送失败,e)if __name__ __main__:id 123file ‘替换成本机文件的路径’send_request(file,id)注意这里的requests发送请求和上面的request获取请求数据只有一个s之差
3.4 响应返回和接收
成功执行视图函数后后端服务往往需要向前端返回响应而前端则需要接收响应并作出处理。
以下是比较常见的几种返回 返回普通文本或HTML页面 from flask import Flask app Flask(name) app.route(‘/’) def hello(): return ‘Hello, World!’
在这个例子中当用户访问根路径 ‘/’ 时服务器会返回一个显示文本消息 Hello, World!的html页面。 返回json数据比较常见 from flask import Flask, jsonify app Flask(name) app.route(‘/demo’) def get_json(): data {‘id’: id,‘name’:name} #字典转换为json return jsonify(data)
上面字典转换为json格式其实不转换直接返回字典也ok了就是不知道有什么弊端没
返回响应
比如常见的图片数据的字节流以下代码演示了将获取到的图片数据保存到本地并以字节流的形式返回客户端
from flask import Flask, request, jsonify, send_file
from gevent import pywsgiapp Flask(__name__)
#定义路由地址
demo_url /demo # 识别#请求方式POST
app.route(demo_url, methods[POST])
def predict_router():#获取文件file request.files.get(file)#以文件本身名字创建文件保存路径file_source ./ file.filename#读取文件以二进制形式comp_bytes file.read()#打开要保存的文件路径with open(file_source, wb) as fp:#将读取到的二进制文件写入保存的文件路径中fp.write(comp_bytes)#使用send_file返回图片数据return send_file(file_source, mimetypeimage/jpg)其中上面的send_file()函数是 Flask 中用于发送文件的函数可选参数mimetype指定要发送的文件的 MIME 类型。例如‘image/jpeg’ 表示发送 JPEG 图像文件。
执行上述服务端代码后用postman工具请求即可下面是采用了python脚本方式请求服务并打印服务返回内容。
import json
import requests#定义请求发送的函数
def send_request(file,id):url http://localhost:39026/demo # 替换成你的 Flask 应用的实际接口地址try:#请求文件以二进制形式读取files {file: open(file,rb)}#请求文档data {id:id}#以post方式发送请求response requests.post(url, filesfiles,datadata)if response.status_code 200:print(文件上传成功)#打印返回内容的字节数据print(response.content)except requests.exceptions.RequestException as e:print(请求发送失败,e)if __name__ __main__:id 123file 文件路径send_request(file,id)常常用response接收请求服务后的响应其中
response.status_code 是服务器返回的状态码你可以通过它来判断请求是否成功。response.content 是服务器返回的内容的字节表示用 decode(‘utf-8’) 方法将其转换为字符串方便阅读。response.headers 是一个字典包含了服务器返回的响应头部信息
4、特殊路由
4.1 路由重定向
from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/usrname)
def admin():if True:return redirect(url_for(login))return Welcome to admin pageapp.route(/login)
def login():return Please login first在登陆中常常会遇到输入用户名和密码不符合时直接返回登陆界面。上述例子表示当用户访问 ‘/usrname’ 路径时条件不满足服务器会将其重定向到 ‘/login’ 路径。
4.2 路由拦截器
不知道大家会不会碰到这种情况在访问某些路由之前呢需要做个身份认证或权限许可认证成功或许可后才允许访问这些路由这时候就用到了路由拦截器。
路由拦截器是由装饰器来拦截请求的以下处理前和处理后的拦截默认是针对app服务所有的路由执行的称为全局拦截器。
c
from flask import Flask, request
app Flask(__name__)app.before_request
def before_request():# 在每个请求处理前执行的内容return app.after_request
def after_request(response): # 在每个请求处理后执行的内容return 如果想对指定的路由实现拦截局部拦截器可在路由拦截中设置白名单可通行的路由
app.before_request
def before_request():url request.path # 获取当前请求的URL#设置白名单不被拦截的路由passUrl [/login, /regist]if url in passUrl:passelse:#请求处理前执行的内容return