Python Flask教程

Flask

  • Doc: https://rest-apis-flask.teclado.com/docs/course_intro/what_is_rest_api/
  • Github: https://github.com/tecladocode/rest-apis-flask-python

在这里插入图片描述

1. 最简单的应用

  • 最小应用
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello_world():return "<p>Hello, World!</p>"
  • 启动
flask run --host=0.0.0.0 --port=8080
  • 代码热加载

新建一个文件,名为:.flaskenv , 在文件内开启debug模式。(需要下载doenv)库

FLASK_DEBUG=true

1.1 url传参规则

参数规则:

from markupsafe import escape@app.route('/user/<username>')
def show_user_profile(username):# show the user profile for that userreturn f'User {escape(username)}'@app.route('/post/<int:post_id>')
def show_post(post_id):# show the post with the given id, the id is an integerreturn f'Post {post_id}'@app.route('/path/<path:subpath>')
def show_subpath(subpath):# show the subpath after /path/return f'Subpath {escape(subpath)}'
string(default) accepts any text without a slash
intaccepts positive integers
floataccepts positive floating point values
pathlike string but also accepts slashes
uuidaccepts UUID strings

1.2 URL访问规则

  • URL 规则

/root/name/ 可通过url /root/name//root/name访问

/root 仅可通过/root访问,不可通过/root/访问

1.3 url中区分HTTP方法

  • 方法一
from flask import request@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return do_the_login()else:return show_the_login_form()
  • 方法二
@app.get('/login')
def login_get():return show_the_login_form()@app.post('/login')
def login_post():return do_the_login()

1.4 cookies

username = request.cookies.get('username')
resp.set_cookie('username', 'the username')

1.5 重定向和报错

from flask import abort, redirect, url_for@app.route('/')
def index():return redirect(url_for('login'))@app.route('/login')
def login():abort(401)this_is_never_executed()

2. 使用docker运行

  • dockerfile
FROM python:3.10
EXPOSE 5000
WORKDIR /app
COPY requirments.txt .
RUN pip install -r requirments.txt
COPY . .
CMD ["flask", "run", "--host", "0.0.0.0"]# Dockerfile ---build--> docker image ---run--> docker container
  • run cmd
#!/bin/bash# build images
docker build -t flask_smorest_api .# run images
docker run -dp 5005:5000 -w /app -v "$(pwd):/app" flask_smorest_api

image-20230628230735901

3. Restful api之Flask-Smorest

restful 的插件有很多,三选一,选择了smorest, 因为它使用了marshmallow。

理由如下:

  1. 容易使用和学习
  2. 可维护性和可扩展性
  3. 项目活跃度
  4. 文档和最佳练习
  5. 开发体验
  • Flask-RESTful
  • Flask-RESTX
  • Flask-Smorest 官网url
# pip install flask-smorest
# 设置api的title 和 访问地址
app.config["API_TITLE"] = "Stores REST API"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.0.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
# web页面的api访问地址
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/cds"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

3. 1 methodview

from flask.views import MethodView
import marshmallow as ma
from flask_smorest import Api, Blueprint, abort@blp.route("/")
class Pets(MethodView):@blp.arguments(PetQueryArgsSchema, location="query")@blp.response(200, PetSchema(many=True))def get(self, args):"""List pets"""return Pet.get(filters=args)@blp.arguments(PetSchema)@blp.response(201, PetSchema)def post(self, new_data):"""Add a new pet"""item = Pet.create(**new_data)return item

3.2 bluepoint

bp = Blueprint('store', __name__ , description='Store API')@bp.route('/store/<string:stroe_id>')
class store(MethodView):def get(self, stroe_id):return "================="

比如如上的蓝图,注册后访问的网址就是:

image-20231021102741307

4. 数据验证之marshmallow

数据校验模块 marshmallow官网API

flask
flask-smorest
python-dotenv
  • 语法
from marshmallow import Schema, fields# 基础1
class PlainItemSchema(Schema):id = fields.Int(dump_only=True)name = fields.Str(required=True)price = fields.Float(required=True)# 基础2
class PlainStoreSchema(Schema):id = fields.Int(dump_only=True)name = fields.Str()# 继承基础1
class ItemSchema(PlainItemSchema):# 只有入参需要 store_id = fields.Int(required=True, load_only=True)# 只有出参需要, 嵌套基础2store = fields.Nested(PlainStoreSchema(), dump_only=True)class ItemUpdateSchema(Schema):name = fields.Str()price = fields.Float()class StoreSchema(PlainStoreSchema):# 嵌套items = fields.List(fields.Nested(PlainItemSchema()), dump_only=True)
  • dump_only: 只有在回应http请求的时候需要,接受http请求的时候不是必须的。
  • requiered=true: http发起请求和接受请求都需要该参数
# 所有字段在传入和传出的时候,都是可选的。
class ItemUpdateSchema(Schema):name = fields.Str()price = fields.Float()
  • 输入入参数
@blp.arguments(ItemUpdateSchema)
  • 输出参数
@blp.response(200, ItemSchema)
# 输出参数改数组
@blp.response(200, ItemSchema(many=True))

5. 数据库之SQL Alchemy

sqlalchemy
flask-sqlalchemy

Flask-SQLAlchemy官网

官网-查询的实例

主键:表中可以唯一区别的列

外键:其它表中可以唯一区别的列

5. 1 Alchemy使用流程

  1. 初始化
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase# 基类有2个,一般情况用DeclarativeBase
# :DeclarativeBase 或 DeclarativeBaseNoMeta 。class Base(DeclarativeBase):passdb = SQLAlchemy(model_class=Base)

初始化后 db 对象允许你访问 db.Model 类来定义模型,并访问 db.session 来执行查询。SQLAlchemy 对象还需要其他参数来自定义它管理的对象。

  1. 配置扩展

下一步是将扩展连接到 Flask 应用。唯一需要的 Flask 应用配置是 SQLALCHEMY_DATABASE_URI 键。这是一个连接字符串,它告诉 SQLAlchemy 要连接到哪个数据库。

创建 Flask 应用程序对象,加载任何配置,然后通过调用 db.init_app 使用应用程序初始化 SQLAlchemy 扩展类。此示例连接到存储在应用的实例文件夹中的 SQLite 数据库。

# create the app
app = Flask(__name__)
# configure the SQLite database, relative to the app instance folder
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
# initialize the app with the extension
db.init_app(app)
  1. 定义模型

子类 db.Model 来定义模型类。该模型将通过将 CamelCase 类名转换为 snake_case 来生成表名。

from sqlalchemy import Integer, String
from sqlalchemy.orm import Mapped, mapped_column# 子类 db.Model 来定义模型类。该模型将通过将 CamelCase 类名转换为 snake_case 来生成表名。
class User(db.Model):id: Mapped[int] = mapped_column(Integer, primary_key=True)username: Mapped[str] = mapped_column(String, unique=True, nullable=False)email: Mapped[str] = mapped_column(String)
  1. 创建表

定义所有模型和表后,调用 SQLAlchemy.create_all() 在数据库中创建表架构。这需要应用程序上下文。由于此时您不在请求中,因此请手动创建一个。

with app.app_context():db.create_all()# 如果使用flask_migrate, 则不需要上面的二行代码。
from flask_migrate import Migrate
migrate = Migrate(app, db)

如果在其他模块中定义模型,则必须在调用 create_all 之前导入它们,否则 SQLAlchemy 将不知道它们。

create_all 不会更新表中的表(如果它们已在数据库中)。如果更改模型的列,请使用迁移库(如带有 Flask-Alembic 或 Flask-Migrate 的 Alembic)来生成更新数据库架构的迁移。

  1. 查询数据
@app.route("/user-by-id/<int:id>")
def user_by_id(id):user = db.get_or_404(User, id)return render_template("show_user.html", user=user)@app.route("/user-by-username/<username>")
def user_by_username(username):user = db.one_or_404(db.select(User).filter_by(username=username))return render_template("show_user.html", user=user)

继承db.Model的类,会自动注册到数据库。

# 子类 db.Model 来定义模型类。该模型将通过将 CamelCase 类名转换为 snake_case 来生成表名。
class User(db.Model):id: Mapped[int] = mapped_column(Integer, primary_key=True)username: Mapped[str] = mapped_column(String, nullable=False)email: Mapped[str] = mapped_column(String)

数据表类是大驼峰,然后会自动创建小驼峰的表在数据库中。

比如User 类,会创建user比数据表。

6. 用户认证JWT

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。

解析: jwt (JSON WEB TOKEN) 是一个JSON格式的规范
之前学过的认证方案: session的认证方案
特点: 非常轻巧
使用jwt替代session的原因:
session是基于cookie的,所以在android和ios中,并不通用。为了统一前端认证方案,使用jwt。
备注:
我们一般说的jwt指的是jws。

jws是一个jwt的一种实现方式。
数据格式:header.payload.signature1.header(头部):头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。2.payload(载荷): 可以简单的理解为我们自己要传输的数据3.signature(签名)
备注:1.JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。2.但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。
flask-jwt-extended

j w t-extened官网文档

# 1. 注册进flask
from flask_jwt_extended import JWTManager
# JWT的设置
# Here you can globally configure all the ways you want to allow JWTs to
# be sent to your web application. By default, this will be only headers.
app.config["JWT_TOKEN_LOCATION"] = ["headers", "cookies", "json", "query_string"]# If true this will only allow the cookies that contain your JWTs to be sent
# over https. In production, this should always be set to True
app.config["JWT_COOKIE_SECURE"] = True# Change this in your code!
app.config["JWT_SECRET_KEY"] = "super-secret"jwt = JWTManager(app)# 2. 创建jwt  
from flask_jwt_extended import create_access_token
access_token = create_access_token(identity=user.id)# 3. 检验jwt
from flask_jwt_extended import jwt_required
@jwt_required()
def get(self, item_id):item = ItemModel.query.get_or_404(item_id)return item# 4. 设置jwt    
from flask import Flask, jsonify
@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):return (jsonify({"message": "The token has expired.", "error": "token_expired"}),401,)# 添加jwt
@app.route("/login")
def login():response = jsonify({"msg": "login successful"})access_token = create_access_token(identity="example_user")set_access_cookies(response, access_token)return response# 删除jwt
@app.route("/logout")
def logout():response = jsonify({"msg": "logout successful"})unset_jwt_cookies(response)return response@jwt.invalid_token_loader
def invalid_token_callback(error):return (jsonify({"message": "Signature verification failed.", "error": "invalid_token"}),401,)@jwt.unauthorized_loader
def missing_token_callback(error):return (jsonify({"description": "Request does not contain an access token.","error": "authorization_required",}),401,)

7. 数据库迁移工具Flask-migrate

Flask- migrate的官方文档

pip install flask-migratefrom flask_migrate import Migrate
db.init_app(app)
migrate = Migrate(app, db)# 不在需要下面这二行
#with app.app_context():
#    db.create_all()# 初始化 migrations 文件夹创建一个迁移环境:
flask db init
# 生成迁移的中间文件 自动生成迁移脚本:
flask db migrate -m "add note timestamp"
# 执行迁移文件,作用与数据库 upgrade子命令即可更新数据库:
flask db upgrade# 其它相关指令可以参考: 
flask db --help

8. Deploy reset apis

9. task queues and rq and e-mail

部署

Gunicorn

总结

flask
flask-smorest
python-dotenv
sqlalchemy
flask-sqlalchemy
flask-jwt-extended
passlib
flask-migrate
gunicorn

常用插件

在 Flask 网页开发中,有许多常用的插件可以增强 Flask 应用程序的功能和用户体验。以下是一些常用的 Flask 插件:

  1. Flask-SQLAlchemy:用于管理数据库连接和模型定义的插件。它简化了数据库操作,并提供了方便的 ORM 功能。
  2. Flask-WTF:提供了表单验证和提交功能的插件。它支持多种表单控件,如文本框、单选框、复选框等。
  3. Flask-Login:用于用户身份验证和会话管理的插件。它提供了方便的函数和装饰器,用于处理用户登录和注销操作。
  4. Flask-Bcrypt:用于密码哈希和验证的插件。它使用 Bcrypt 算法对密码进行哈希,提高了密码的安全性。
  5. Flask-Mail:用于发送电子邮件的插件。它提供了简单的接口,用于发送 HTML 或文本邮件。
  6. Flask-DebugToolbar:一个调试工具栏插件,可以在开发时提供有用的应用程序信息。它可以帮助开发人员诊断和解决应用程序问题。
  7. Flask-Assets:用于管理静态文件和编译静态资源的插件。它支持多种静态文件类型,如 CSS、JavaScript、图片等。
  8. Flask-Cache:用于缓存的插件。它可以提高应用程序的性能,并减少对数据库和服务器的请求。
  9. Flask-Migrate:用于数据库迁移的插件。它提供了方便的接口,用于管理数据库模型的版本控制和迁移。

knowlege

http verbs

  • get: get a item or a list or items.
  • post: create an item
  • Delete: delete an item
  • Put: update an item

http head

  • Content-type: media type that slient sent to server,
    • no default value,will put error when no value setted.
    • application/json
  • Accept: media types that client willing to accpet
    • Default is json

http status code

http status code


what is http verbs

  • rest api

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

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

相关文章

18 串口通讯

文章目录 18.0 前言18.1 串口通讯协议简介18.1.1 物理层 18.2 RT1052 的 LPUART 简介18.3 UART 功能框图18.3.1 中断控制 18.4 UART 初始化结构体详解18.4.1 baudRate_Bps18.4.2 parityMode18.4.3 dataBitsCount18.4.4 isMsb18.4.5 stopBitCount18.4.6 txFifoWatermark与rxFifo…

Kubernetes 集群管理—日志架构

日志架构 应用日志可以让你了解应用内部的运行状况。日志对调试问题和监控集群活动非常有用。 大部分现代化应用都有某种日志记录机制。同样地&#xff0c;容器引擎也被设计成支持日志记录。 针对容器化应用&#xff0c;最简单且最广泛采用的日志记录方式就是写入标准输出和标…

RIP【新华三与华为区别】

【介绍】 rip分为rip 1 与 rip 2 &#xff0c;rip 2 是对 rip 1 的一种升级&#xff0c;rip 2 可以进行认证等功能 【命令】 新华三&#xff1a; [HC3-R1] rip #启用rip [HC3-R1-rip] version 2 #告知rip 版本号 [HC3-R1-rip] network 192.168.1.0 #宣告其网段 [HC3-R1-rip] …

ES分词器

Analysis&#xff1a;文本分析是把全文本转换一系列单词的过程&#xff0c;也叫分词。Analysis是通过Analyzer(分词器)来实现的。 1.Analyzer组成 注意&#xff1a;在ES中默认使用标准分词器&#xff1a;StandardAnalyzer。特点是&#xff1a;中文是单字分词&#xff0c;英文是…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一&#xff1a;创建自定义网络 首先&#xff0c;我们需要创建一个自定义网络&#xff0c;以便容器可以连接到这个网络上&#xff0c;从而实现互相通信。在命令行中执行以下命令&#xff1a; # 创建 docker network create ddz # 查看 docker n…

costmap_2d包介绍

文章目录 一. costmap_2d包介绍二. Costmap包的执行入口-- move_base中调用三. Costmap包的初始化以及维护3.1 Costmap2DROS类3.1.1 构造函数 Costmap2DROS::Costmap2DROS3.1.2 地图更新线程 Costmap2DROS::mapUpdateLoop3.1.3 地图更新 Costmap2DROS::updateMap()3.1.4 激活各…

openssl3.2 - 在VS2019下源码调试openssl.exe

文章目录 openssl3.2 - 在VS2019下源码调试openssl.exe概述笔记先看一个用.bat调用openssl干活的实例VS2019调试参数设置设置 - 命令参数设置 - 工作目录设置 - 环境变量将命令行中需要的文件拷贝到exe目录单步调试备注END openssl3.2 - 在VS2019下源码调试openssl.exe 概述 …

多租户体系实现

文章目录 核心思路方案选择设计考量安全性扩展性通用性易用性 具体实现租户信息透传透传变量名命名规范应用内透传应用间透传 数据层租户隔离MySQL存储方案&#xff1a;多租户Mybatis插件Mybatis插件特点使用多租户Mybatis插件的优势参考文档 应用场景 经过工作中的一处场景启发…

PLC编程中ST语言操作符的使用方法

ST&#xff08;Structured Text&#xff09;语言操作符主要用于PLC编程&#xff0c;主要包括算术运算符、比较运算符和逻辑运算符等。 算术运算符包括加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和指…

中国1981-2023年逐年每15天8km植被指数数据集

摘要 中国1981-2023年逐年每15天8km植被指数数据集来源于GIMMS NDVI数据&#xff0c;包括了1981年7月&#xff0d;2023年12月的长时间序列逐年每15天植被指数变化&#xff0c;格式为arcgis grid格式&#xff0c;投影为WGS84&#xff0c;其时间分辨率是15天&#xff0c;空间分辨…

什么是云服务器,阿里云优势如何?

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

C/C++--ProtoBuf使用

一.什么是ProtoBuf 1.序列化和反序列化概念 序列化&#xff1a;把对象转变为字节序列的过程&#xff0c;称为系列化。 反序列化&#xff1a;把字节序列的内容恢复为对象的过程&#xff0c;称为反序列化。 2.什么情况下需要序列化和反序列化 存储数据&#xff1a;将内存中的对象…

Vulnhub靶机:driftingblues 6

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues6&#xff08;10.0.2.22&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

洛谷 P9868 [NOIP2023] 词典

原文链接&#xff1a;NOIP真题第四讲&#xff1a;词典 题目来源&#xff1a;2023 年 NOIP T1 本题考察点&#xff1a;【贪心、枚举、模拟】 前置知识 字典序&#xff1a;指按照a、b、c、...、z的顺序&#xff0c;即a<b<c<...<z&#xff1b; 一、题目及链接 题…

如何用ChatGPT写教案设计?以“沁园春雪”为例

1. 引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已成为教育领域的一大创新工具。ChatGPT不仅能够模拟人类对话&#xff0c;还可以帮助设计互动丰富、内容丰富的教案。本文将探索如何利用ChatGPT进行教案教学设计&#xff0c;特别是通过“沁园春雪”这一案例&#xff0…

项目压测优化实践思路

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

RuntimeError: CUDA error: device-side assert triggered

授人以鱼不如授人以渔 解决步骤 记录下解决步骤…cuda报错真要人命 首先根据终端的提示 他说让你加这个来定位具体的python代码错哪了&#xff0c;所以咱们就加。 我这里启动命令是&#xff1a; accelerate launch --config_file "utils/acc_configs/accelerate_con…

官方认可!360荣获“科技产业高质量发展突出贡献企业”称号

近日&#xff0c;2023年度朝阳区高质量发展突出贡献企业表彰大会在北京成功召开。会上&#xff0c;朝阳区管委会&#xff08;区科信局&#xff09;对朝阳区做出积极贡献的企业单位进行表彰&#xff0c;360数字安全集团作为数字安全的领导者&#xff0c;在技术能力、研发创新和实…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html