flask的基本使用1

【 一 】Flask介绍

  • python 界的web框架

-Django:大而全,使用率较高 :https://github.com/django/django
-FastAPI:新项目选择使用它:https://github.com/tiangolo/fastapi
-flask:公司一些小项目使用它:https://github.com/pallets/flask

​ Flask 是一个Python编写的一种轻量级的框架,只提供了web框架基本的功能,比其他的框架更加灵活、自由。

​ Flask 是 Python 社区中开发 Web 应用最火热的框架之一,不同于 Django 陡峭的学习曲线,个人感觉 Flask 非常好上手,且社区生态丰富,有很多成熟的扩展可以拿来直接安装使用。 Flask 框架自身集成了基于 Jinja 的模板语言,使其可以完成前后端的所有开发,但现在大部分的 Web 应用都是前后端分离,所以本文将使用 Flask RESTful 扩展实现一个纯后端的 API 服务。 通过本文可以学习到以下内容:

  • 使用 Flask + Flask RESTful 搭建 API 应用并使用 Blueprint(蓝图) 管理 API;
  • 使用 Flask-SQLAlchemy 扩展实现 ORM 操作 MySQL 数据库;
  • 基于 JWT 验证实现注册、登录以及登出接口;
  • 实现一个最基本的列表获取接口;
  • 解决跨域问题;
  • 使用 Docker 部署该应用。

【 1 】Django与Flask的区别:

  • Django是一个重量级的框架,为业务开发,提供了丰富的工具、组件

  • Flask是一个轻量级的框架,只提供Web框架的核心功能,自由、灵活、高度定制

  • 相同点:都python的web框架

  • 不同点:

    • django比较全面,web开发中使用到的东西,它都会内置
    • -orm
    • -forms组件,表单验证
    • -模板:dtl
    • -缓存
    • -信号
    • -admin 后台管理。。。
  • ​ flask小而精,只保留了web开发的核心功能,其他的需要借助于第三方实现

  • ​ 众多第三方,比如orm咱们会用sqlalchemy,peewee。。

  • fastapi:跟flask相似,只保留了web开发的核心功能,其他的需要借助于第三方实现-异步框架-更方便的使用python  async 和 await 关键字来实现异步操作
    

【 2 】Flask文档

中文文档:`

[]: https://dormousehole.readthedocs.io/en/latest/

`

英文文档:`

[]: https://flask.palletsprojects.com/en/2.2.x/

`

【 3 】常用扩展包

扩展列表:`

[]: http://flask.pocoo.org/extensions/

`

Flask-SQLalchemy:操作数据库
Flask-script:插入脚本
Flask-migrate:管理迁移数据库
Flask-Session:Session存储方式指定
Flask-WTF:表单
Flask-Mail:邮件
Flask-Bable:提供国际化和本地化支持,翻译
Flask-Login:认证用户状态
Flask-OpenID:认证
Flask-RESTful:开发REST API的工具
Flask-Bootstrap:集成前端Twitter Bootstrap框架
Flask-Moment:本地化日期和时间
Flask-Admin:简单而可扩展的管理接口的框架

【 二 】flask 安装与运行

  • 直接在Python里面安装就好
pip3 install flask
from flask import Flask# 1 实例化得到对象
app = Flask(__name__)# 2 注册路由--》写视图函数
@app.route('/')
def index():# 3 返回给前端字符串return 'hello world'if __name__ == '__main__':# 运行app,默认运行在5000app.run()app.run(host='0.0.0.0',port=8080)

image-20240612162232741

image-20240612162303100

【 1 】Werkzeug WSGI-(socket服务端)

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等Werkzeug is a comprehensive WSGI web application library. It began as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility libraries.
Werkzeug 是一个综合性 WSGI Web 应用程序库。它最初是 WSGI 应用程序的各种实用程序的简单集合,现已成为最先进的 WSGI 实用程序库之一。Werkzeug doesn’t enforce any dependencies. It is up to the developer to choose a template engine, database adapter, and even how to handle requests
Werkzeug 不强制执行任何依赖关系。由开发人员选择模板引擎、数据库适配器,甚至如何处理请求# django--->wsgiref ,uwsgi
# flask---->Werkzeug
# django或flask--》都需要有web服务器---》web服务器需要符合 wsgi协议-规定了,框架是一个可调用对象,请求来了,wsgi服务器调用这个对象的时候,会传入 两个参数environ,start_response-flask中能找到这两个参数,django中也能找到这两个参数# https://werkzeug.palletsprojects.com/en/3.0.x/# 后期:测试django项目,使用wsgiref,上线djagno项目,使用uwsgi,gunicorn测试flask项目,使用werkzeug,上线djagno项目,使用uwsgi,gunicorn

在这里插入图片描述

2.1.1什么是wsgiref

wsgiref 是 Python 标准库中的一个模块,用于实现 WSGI(Web 服务器网关接口)。它包含了一些用于开发和测试 WSGI 服务器和应用程序的工具和实用程序。

2.1.2什么是uwsgi

uwsgi 是一个 Web 服务器软件,用于部署 Python 程序。它是一个快速的、纯 C 语言编写的 Web 服务器,可用于部署 Python WSGI 应用程序。uwsgi 服务器与 WSGI 应用程序之间通过通用网关接口 (uWSGI) 进行通信。

2.1.3什么是Werkzeug

Werkzeug 是一个 Python 的 WSGI 工具库,用于构建 Web 应用程序和框架。它提供了许多实用的工具和实用程序,包括路由、调试器和服务器。Werkzeug 的设计灵感来自于 Ruby 的 Rack 框架,它被广泛用于构建 Flask 框架等 Python Web 应用程序。

2.1.4什么是WSGI 协议

WSGI 协议(Web 服务器网关接口)是一种定义了 Web 服务器和 Web 应用程序之间通信的标准协议。它允许不同的 Web 服务器(比如 Nginx、Apache 等)与不同的 Web 框架(比如 Flask、Django 等)之间进行交互,使得开发者可以使用不同的工具组合来构建 Web 应用。

image-20240612162602916

2.1.5Werkzeug的使用

from wsgiref.simple_server import make_serverdef application(environ, start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])if environ.get('PATH_INFO') == '/index':with open('index.html', 'rb') as f:data = f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data = b'<h1>Hello, web!</h1>'return [data]if __name__ == '__main__':myserver = make_server('', 8011, application)print('监听8011')myserver.serve_forever()
  • 这段代码的意思就是如果访问的是127.0.0.1:8011/index 就会输出为什么在本地定义的index.html的内容,如果不是就会返回我们定义的data = b'<h1>Hello, web!</h1>'
  • image-20240612192014631

image-20240612191715324

在这里插入图片描述

  • 有了 Request和Response,路由分发,可以获取静态文件,可以返回html页面
  • 注意request.args.get 就是在请求头获取数据

from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple
def application(environ, start_response):request = Request(environ)text = f"Hello {request.args.get('name', '你是谁!!!!')}!"response = Response(text, mimetype='text/plain')return response(environ, start_response)if __name__ == '__main__':run_simple('localhost', 4000, application)

在这里插入图片描述

【 2 】Jinja template engine

Jinja — Jinja Documentation (3.1.x) (palletsprojects.com)

​ Jinja 是一个快速、富有表现力、可扩展的模板引擎。模板中的特殊占位符允许编写类似于 Python 语法的代码。然后向模板传递数据以渲染最终文档。

【 3 】Click CLI

​ Click 是一个 Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的【命令行界面】。它是“命令行界面创建工具包”。它具有高度可配置性,但具有开箱即用的合理默认值。

​ 它的目的是使编写命令行工具的过程变得快速而有趣,同时也防止因无法实现预期的 CLI API 而造成的任何挫败感。

  • 命令的任意嵌套。
  • 自动生成帮助页面。
  • 支持在运行时延迟加载子命令。
import click
@click.command()
@click.option('--count', default=6, help='Number of greetings.')
@click.option('--name', prompt='Your name',help='The person to greet.')
def hello(count, name):for x in range(count):click.echo(f"Hello {count}!")if __name__ == '__main__':hello()# python版本号 "py文件名.py" --定制名 = ?
# 1  python310 "ClickCLI.py" --count=3
# 2  python310 "ClickCLI.py" --help
# 3  python310 "ClickCLI.py" --count=3 --name=jing

image-20240612194205431

【 4 】flask使用

【 1 】基本使用

from flask import Flask# 1 实例化得到对象
app = Flask(__name__)# 2 注册路由--》写视图函数
@app.route('/')
def index():# 3 返回给前端字符串return 'hello world'if __name__ == '__main__':# 运行app,默认运行在5000app.run()app.run(host='0.0.0.0',port=8080)

image-20240612201741794

【 2 】watchdog使用

  • pip3 install watchdog
# pip3 install watchdog
# 当前目录下文件修改会被监控到,打印日志
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandlerif __name__ == "__main__":logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')path = sys.argv[1] if len(sys.argv) > 1 else '.'event_handler = LoggingEventHandler()observer = Observer()observer.schedule(event_handler, path, recursive=True)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何提高软件APP质量的测试类型

如今&#xff0c;由于市场竞争非常激烈&#xff0c;移动应用质量至关重要。我们需要关注用户体验以及应用的性能。如果应用包含错误&#xff0c;应用评级就会下降&#xff0c;应用下载量也会下降。如果我们能使我们的应用没有错误&#xff0c;那么应用获得人气的机会就会增加。…

通过颜色传感器控制机械臂抓物体

目录 1 绪论 2整体设计方案 2.1 系统的介绍 2.2 抓取模块 2.2.1 机械臂的定义 2.2.2 机械臂的分类 2.2.3 机械臂的选用 2.3 颜色识别模块 2.3.1 颜色传感器识别原理 2.3.2 TCS3200简介 2.4 整体控制方案 3 颜色识别抓取系统的硬件设计 3.1 单片机选型及参数 3.2 系…

win11系统重装?正版系统Windows11安装重启!保姆级重装系统攻略!

随着科技的不断发展&#xff0c;Windows 11系统已经逐渐成为了众多电脑用户的新选择。然而&#xff0c;当当电脑出现严重故障、受到病毒攻击、软件冲突、系统升级失败、硬件更换或升级、系统性能下降或个性化需求等情况时&#xff0c;重装系统可能是一个有效的解决方案。本文将…

构建网络图 (JavaScript)

前序&#xff1a;在工作中难免有一些千奇百怪的需求&#xff0c;如果你遇到构建网络图&#xff0c;或者学习应对未来&#xff0c;请看这边文章&#xff0c;本文以代码为主。 网络图是数据可视化中实用而有效的工具&#xff0c;特别适用于说明复杂系统内的关系和连接。这些图表…

kaoYan-Composition

It is almost axiomatic&#xff08;不证自明的、公理的&#xff09; that cooperation can benefit us in many ways.First, cooperation can facilitate the communication between different people.Likewise, collaboration can offer us an opportunity to learn from eac…

mybatisplus的lambdaQuery()使用案例

一、常用 查询 // 方式一 条件是LearningLesson必须为LearningLessonServiceImpl的T LearningLesson lesson lambdaQuery().eq(LearningLesson::getUserId, userId).eq(LearningLesson::getStatus, LessonStatus.LEARNING.getValue()).orderByDesc(LearningLesson::getLates…

【十六】【QT开发应用】Menu菜单,contextMenuEvent,setContextMenuPolicy,addAction

在 Qt 框架中&#xff0c;QMenu 类用于创建和管理菜单。菜单是用户界面的一部分&#xff0c;可以包含多个选项或动作&#xff0c;用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单&#xff08;右键菜单&#xff09;或工具栏中。 基本用法 创建菜单对象…

深入解读一下 `com.google.android.material.appbar.CollapsingToolbarLayout`

简介 在现代 Android 应用中&#xff0c;提供流畅且美观的用户体验是非常重要的。CollapsingToolbarLayout 是 AndroidX库中 Material Components 的一部分&#xff0c;它提供了一种易于实现的可折叠工具栏效果&#xff0c;常用于提供视觉吸引力的标题栏和动画效果。 本文将详…

已解决Writing ‘modem_a‘FAILED (remote: ‘Operation not permitted‘

今天用可视化工具FastbootEnhance线刷&#xff0c;没有注意到日志报错&#xff0c;开机后黑屏&#xff0c;电脑能检测到是开机状态&#xff0c;电源键按下有声音。 排除线刷包问题&#xff0c;翻看FastbootEnhance的日志&#xff0c;它的日志放到记事本全屏方便观看&#xff0…

项目1111

中文显示姓名列和手机号 SELECT contact_name AS 姓名, contact_phone AS 手机号 FROM 2_公司id; 使用explain测试给出的查询语句&#xff0c;显示走了索引查询 EXPLAIN SELECT * FROM 7_订单数量 WHERE countid LIKE e%; 统计用户订单信息&#xff0c;查询所有用户的下单数量…

Prometheus中添加基本身份验证功能

在Prometheus中添加基本身份验证功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、生成哈希密码 首先&#xff0c;需要安装bcrypt工具&#xff0c;用于生成哈希密码。这可以通过Python的bcrypt库来完成。如果未安装&#xff0c;可以使用pip进行安装。 创建一个Python脚…

Android性能优化——卡顿优化

文章目录 一、从XML到屏幕上的展示造成跳帧的因素有那些发现问题定位问题定位代码 一、从XML到屏幕上的展示 数据加载阶段 数据控制阶段 数据展示阶段 xml —> view onCreat —> 解析layout.xml resume —> view —> wms ViewRootImpl UI 绘制流程 &#xff1a;测…

计算机网络之数据通信原理

1.通信系统的基本组成 信源&#xff1a;信息的发出者&#xff1b; 信宿&#xff1a;信息的接收者&#xff1b; 载体&#xff1a;信息的传送通道&#xff1b; 变换器&#xff1a;将信息变换成载体上可传输的信号&#xff1b; 反变换器&#xff1a;将载体上传输的信号变换成信…

Java中网络安全的基础知识

Java中网络安全的基础知识 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代互联网应用中&#xff0c;网络安全是一个至关重要的话题。随着网络攻击和数据…

Java零基础-集合:TreeSet

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

SQL基础:掌握数据查询与操作的核心技能(四)

引言&#xff1a;数据操作的语言艺术 在前一章节《数据库与表的基本操作》中&#xff0c;我们深入了解了如何创建、管理数据库和表&#xff0c;构建了数据存储的基础框架。本章节&#xff0c;我们将深入探索SQL语言&#xff0c;它是数据库管理系统的通用语言&#xff0c;用于数…

SpringBoot集成Druid数据库连接池并配置可视化界面和监控慢SQL

pom.xml <!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency>application.yml spring:jackson:date-…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

Flask的 preprocess_request

理解 Flask 类似框架中的 preprocess_request 方法 在 Flask 类似的 web 框架中&#xff0c;preprocess_request 方法是一个关键组件。它在请求被分派之前调用&#xff0c;用于执行一些预处理操作。让我们一步一步来理解这个方法的工作原理。 1. 方法概述 首先&#xff0c;我…

【Android面试八股文】说一说Handler的sendMessage和postDelay的区别?

文章目录 一、`sendMessage` 方法1.1 主要用法1.2 适用场景二、`postDelayed` 方法2.1 主要用法2.2 适用场景三、 区别总结3.1 区别3.2 本质上有差别吗?四、实例对比4.1 使用`sendMessage`4.2 使用`postDelayed`五、结论Handler类在Android中用于消息传递和任务调度。 sendMe…