当前位置: 首页 > news >正文

【Flask】基础入门

文章目录

  • 前言
  • 简介
  • 安装
  • 基础编程
    • requirements文件的使用
    • 路由
    • Jinja2
    • Restful
  • 参考资料

前言

本文内容为参考网络资源,学习整理得出,仅供学习使用,参考资料在文末,若有侵权,立即删除。

简介

Flask是轻量级的Pyhton的Web框架

安装

pip install flask

基础编程

requirements文件的使用

Python项目中必须要有一个requirements.txt文件来记录依赖包及具体版本号,以便在新环境中部署

  • 将当前虚拟环境中的所有依赖包及其版本号生成到requirement.txt文件中:pip freeze > requirements.txt
  • 在新环境中安装项目所需的所有特定版本的依赖包:pip install -r requirements.txt

路由

  • URL与视图
@app.route('/hello', methods = ['GET', 'POST'])
def hello_world():  return 'Hello World'
  • 默认为GET方法
  • 路由参数处理
@app.route('/hello/<id>')
def hello_world(id):  if id == str(1):return 'flask'else:return 'Hello World'
  • <>为正则匹配(注:默认传递的idstring类型如果要在代码中匹配<>中内容,需要以字符串形式进行判断或匹配);也可在<>中指定类型,如@app.route('/hello/<string:id>')@app.route('/hello/<int:id>')
  • 根据路由显示相应内容
@app.route('/hello/<id>')
def hello_world(id):  return 'Hello World %s' % id
  • request包含前端发送的所有请求数据。(request.method获取请求方式)
  • 重定向302:redirect(...)
  • 返回json数据给前端:
app.config['JSON_AS_ASCII'] = False
return jsonify(...)
  • abort函数(在页面中抛出异常):abort(404)
  • 自定义异常
@app.errorhandler(404)
def handle_404_error(err):...
  • 消息闪现:flash(u'测试')

Jinja2

Jinja2是由Python实现的模板语言

  • 模板渲染
    • 展示index.html网页
@app.route('/')
def hello_world():return render_template("index.html")
  • HTML中的参数使用
    • 注释:{#注释#}
    • 变量代码块:{{url}}
    • 通常,模板中使用的变量名和要传递的变量名保持一致。
    • 控制代码块:{% if a == 1 %}
@app.route('/<my_id>')
def hello_world(my_id):return render_template("index.html", my_id = my_id)
  • 过滤器
    • 自定义过滤器
      • 注册过滤器:app.add_template_filter(自定义函数名字,'用时的名字')
  • WTF表单
    • 定义表单模型类
class Test(FlaskForm):uname = StringField(label = '用户名', validators = [DataRequired('用户名不能为空')])...submit = SubmitField('label = '提交')
  • 使用表单
@app.route('/test')
def test():form = Test()return render_template('test.html', form = form)
  • 验证器validate_on_submitform.validate_on_submit()

Restful

REST(Representational State Transfer)表现层状态转换

  • 详见Flask Restful官方文档
  • 前后端分离,前后端都遵循Restful编程规范,开发效率高,便于管理。
  • 协议使用httphttps协议;数据传输应采用json格式;url中不能有动词,只能有名词,且名词要注意单复数;状态码。
  • 安装:pip install flask-restful
  1. Restful API的要素
    1. 端点-URL
    2. HTTP请求方式
      • GET:获取数据
      • POST:新增数据
      • PUT:修改数据
      • DELETE:删除数据
    3. 头部信息(Request,Response)
    4. 请求数据(要发送给服务的具体数据)
  2. 基本使用
  • 引入flask-restful
from flask_restful import Api
api = Api(app)
  • 定义资源类:写一个类视图(继承子Resource类),在其中定义响应的请求方法(如getpost等);最后使用api.add_resource来添加类视图与url
from flask_restful import Resource
class ManResource(Resource):def get(self, id):return {'id': id, 'name': 'Tom'}def put(self, id):return {'id': id, 'name': 'Mike'}...
api.add_resource(ManResource, '/man/<id>')
  • 可以指定多个url,也可传递参数。
  1. 参数验证(参数解析)
  • 通过flask_restful.reqparseRequestParser建立解析器
  • 通过RequestParser中的add_argument方法定义字段与解析规则
  • 通过RequestParser中的parse_args来解析参数
    • 解析正确:返回正确的参数
    • 解析错误:返回错误信息给前端
from flask import Flask
from flask_restful import Api, Resource
from flask_restful.reqparse import RequestParserapp = Flask(__name__)
api = Api(app)class RegisterView(Resource):def post(self):# 建立解析器parser = RequestParser()# 定义数据的解析规则parser.add_argument('username',type=str,required=True, trim = True, help = '用户名不符合规范')parser.add_argument('age', type=int, help='年龄验证错误')parser.add_argument('gender', type=str, choices = ['男', '女', '保密'], help = '性别验证错误')# 解析数据:正确,直接获取参数;错误,反馈到前端args = parser.parse_args()print(args)# 响应数据return {'msg': '注册成功'}api.add_resource(RegisterView, '/register/')if __name__ == '__main__':app.run()
  1. add_argument方法参数
  • default:默认值
  • required:是否必须,默认为False,若为True则这个参数必须提交。
  • type:这个参数的数据类型,可以为intstr等,也可以为:urlregexdate(若文件类型:FileStorage
  • choices:固定选项
  • help:错误信息
  • trim:是否去掉前后空格
  1. 规范返回值
  • 导入flask_restful.marshal_with装饰器
  • 定义一个字典变量来指定需要返回的标准化字段以及该字段的数据类型。
from flask import Flask
from flask_restful import Api, Resource, fields, marshal_withapp = Flask(__name__)
api = Api(app)class Test_0():def __init__(self, code, msg):self.code = codeself.msg = msgclass Test(Resource):resource_fields = {'code':fields.Integer,'msg':fields.String}@marshal_with(resource_fields)def get(self):return {'code':200, 'msg': '访问成功'}@marshal_with(resource_fields)def post(self):return {'msg': '注册成功'}@marshal_with(resource_fields)def put(self):# 在返回对象时会自动获取约定好的字段,并封装成json返回test = Test_0(404, 'OK')return testapi.add_resource(Test,'/test/')if __name__ == '__main__':app.run()
  • 自定义fields
    • 写一个类继承Raw
    • 重写format方法
    class My_fields(Raw):def format(self):return 结果
    
  • 实现“点击跳转url”:定义两个fields
  • 参数设置
    • 设置重命名属性:使用attribute,重命名后属性名称与后端数据库等操作字段匹配(实现前端显示与后端命名不一致)
    • 设置默认值:使用default(约束字段中的默认值的优先级低于真实数据默认值的优先级)
from flask import Flask
from flask_restful import Api, Resource, fields, marshal_withapp = Flask(__name__)
api = Api(app)class Test_0():def __init__(self, code, message):self.code = codeself.message = messageclass Test(Resource):resource_fields = {# 通过default设置默认值'code':fields.Integer(default=666),# 通过attribute设置返回值'msg':fields.String(attribute = 'message')}@marshal_with(resource_fields)def get(self):test = Test_0(404, 'OK')return test@marshal_with(resource_fields)def post(self):return {'message': '测试'}
api.add_resource(Test,'/test/')if __name__ == '__main__':app.run()
  • 类型设置
    • fields.List()存放一个列表
    • fields.Nested()存放一个字典
    • 若要返回自定义类的对象
      • marshal(对象, 对象的fields格式)marshal([对象, 对象], 对象的fields格式)
      • @marshal_with(my_fields)函数需要参数,参数就是最终的数据输出格式。
  1. 结合蓝图使用
  2. 渲染模版
  • 使用api.representation装饰器定义函数,在函数中对html代码进行封装,再返回。(api.representation装饰器修饰的函数必须返回一个Response对象)
  1. 生成swagger文档
    使用pip install安装apispecflask apispecPyYAML或在requirements.txt中添加这几个包及具体版本号。
  • CBV(Class Based View)类视图
  • FBV(Function Based View)函数视图

参考资料

  • 黑马程序员-6节课入门Flask框架web开发视频
  • 2025版-零基础玩转Python Flask框架-学完可就业
  • 3小时带你快速入门Python Flask框架,零基础入门到精通!学不会我退出IT界!Web开发 | 教程 | 前端 | 后端 | 全栈
  • 千锋教育Flask2框架从入门到精通,Python全栈开发必备教程
  • 合集·Flask Restful API教程
  • Flask自用教程
  • 【千锋】零基础玩转Python_Flask(flask快速上手)
http://www.lryc.cn/news/586091.html

相关文章:

  • Flutter、React Native、Uni-App 的比较与分析
  • 如何防范金融系统中的SQL注入攻击
  • 【LeetCode 热题 100】98. 验证二叉搜索树——(解法一)前序遍历
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • 【Go + Gin 实现「双 Token」管理员登录】
  • Linux/Ubuntu安装go
  • 客户资源被挖?营销方案泄露?企业经营信息保护避坑指南
  • Day 3·知识卡片|Python基础:print 函数还能这么玩?
  • 阿里开源AI大模型ThinkSound如何为视频配上灵魂之声
  • Windows X64环境下mysql5.6.51安装指南
  • SpringBootloggers未授权访问漏洞处理
  • 基于MCP的CI/CD流水线:自动化部署到云平台的实践
  • Unity VR手术模拟系统架构分析与数据流设计
  • JVM 中“对象存活判定方法”全面解析
  • 同步、异步、阻塞、非阻塞之间联系与区别
  • Windows符号链接解决vscode和pycharm占用C盘空间太大的问题
  • [论文阅读] 人工智能 + 软件工程 | AI助力软件可解释性:从用户评论到自动生成需求与解释
  • 利用scale实现分页按钮,鼠标经过按钮放大
  • 12.使用VGG网络进行Fashion-Mnist分类
  • 解决bash终端的路径名称乱码问题
  • java单例设计模式
  • pip国内镜像源一览
  • 高校/企业/医院食堂供应链平台开发详解:采购系统源码的核心价值
  • MySQL 中图标字符存储问题探究:使用外挂法,毕业论文——仙盟创梦IDE
  • Oxygen XML Editor 26.0编辑器
  • 车载诊断架构 --- 诊断功能开发流程
  • Operation Blackout 2025: Smoke Mirrors
  • 日志不再孤立!用 Jaeger + TraceId 实现链路级定位
  • 传感器WSNs TheDataLinkLayer——X-MAC
  • 前端开发中的输出问题