原起:

最近项目中现存的是使用的python的异步方式进行开发, 但是只是存在脚本部分, 并没有提供对外的Web服务,正好趁机将Fastapi嵌入其中使用.

官方文档: https://fastapi.tiangolo.com/zh/tutorial/first-steps/

[安装]

pip install "fastapi[all]"

[使用]

基本:

# pip install fastapi pycryptodome
import json
import base64
import string
import random
import uvicorn
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi.responses import HTMLResponse, JSONResponse app = FastAPI() users_db = {
"testuser": {
"username": "testuser",
"password": "testpassword",
"email": "testuser@example.com",
"fullName": "Test User",
}
} class LoginRequest(BaseModel):
data: str def encrypt(data: dict, key: bytes, iv: bytes) -> str:
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_data = pad(json.dumps(data).encode("utf-8"), AES.block_size)
encrypted = cipher.encrypt(padded_data)
return base64.b64encode(encrypted).decode("utf-8") def decrypt(data: str, key: bytes, iv: bytes) -> dict:
encrypted_data = base64.b64decode(data)
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
return json.loads(decrypted_data.decode("utf-8")) def generate_string(length: int) -> str:
return "".join(
random.choice(string.digits + string.ascii_letters) for _ in range(length)
) @app.get("/api/getSecret")
async def get_secret():
key = generate_string(32)
iv = generate_string(16)
app.state.secret_key = key
app.state.secret_iv = iv
return {"key": app.state.secret_key, "iv": app.state.secret_iv} @app.post("/api/login")
async def login(request: LoginRequest):
key = app.state.secret_key.encode()
iv = app.state.secret_iv.encode() login_data = decrypt(request.data, key, iv) username = login_data.get("username")
password = login_data.get("password") if username in users_db and users_db[username]["password"] == password: # type: ignore
user_info = users_db[username] # type: ignore
encrypted_response = encrypt({"success": True, "user": user_info}, key, iv)
return JSONResponse(content={"data": encrypted_response})
else:
encrypted_response = encrypt(
{"success": False, "message": "Invalid username or password"}, key, iv
)
return JSONResponse(content={"data": encrypted_response}) @app.get("/", response_class=HTMLResponse)
async def index():
with open("index.html", "r", encoding="utf-8") as file:
html_content = file.read()
return HTMLResponse(content=html_content) if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)

部分说明:

  • app.state: state是实例的一个属性, 可以为该实例定义一下全局属性

Python框架之FastAPI的更多相关文章

  1. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  2. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

  3. android模拟器(genymotion)+appium+python 框架执行基本原理(目前公司自己写的)

    android模拟器(genymotion)+appium+python 框架执行的基本过程: 1.Push.initDate(openid)方法     //业务数据初始化 1.1   v5db.p ...

  4. 10个用于Web开发的最好 Python 框架

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  5. 第六篇:web之python框架之django

    python框架之django   python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...

  6. Python框架之Django学习

    当前标签: Django   Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0     Python框架之Django学习笔记(十三) 尛 ...

  7. Hadoop的Python框架指南

    http://www.oschina.NET/translate/a-guide-to-Python-frameworks-for-Hadoop 最近,我加入了Cloudera,在这之前,我在计算生物 ...

  8. 【python】Python框架、库和软件资源大全

    很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世界各地的程序员们都能够贡献他们的代码与创新. Python就是这样一门受到全世界各地开源社区支持的语言. ...

  9. Python框架之Django的相册组件

    Python框架之Django的相册组件 恩,没错,又是Django,虽然学习笔记已经结贴,但是学习笔记里都是基础的,Django的东西不管怎么说还是很多的,要学习的东西自然不会仅仅用十几篇博文就能学 ...

  10. 10款Web开发最佳的Python框架

    Python是跻身于当代IT世界最流行和代码最高效的编程语言之一.Python框架能帮助你快速启动Web应用. 1.CubicWeb CubicWeb的最重要的功能是其代码的可重用性,由一个个代码单元 ...

随机推荐

  1. 【YashanDB数据库】yasboot查询数据库状态时显示数据库状态为off

    [问题现象] yasboot cluster status -c yashandb 显示数据库状态为off与数据库实际的状态不符,如下图 [问题分类]yasboot.yasdb使用问题 [关键字]ya ...

  2. CSS – 实战 Font

    前言 这篇想整理一下在网页开发中, 字体是如果被处理的. 先看完: 平面设计 – 字体 CSS – Font / Text 属性 CSS – Font Family CSS – word-break, ...

  3. [rCore学习笔记 027]地址空间

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 引言 ...

  4. C++ 模板(函数模板与类模板)

    模板 模板介绍 C++提供了函数模板(function template).所谓函数模板.实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就称为函数模板. ...

  5. Spring —— 注解开发(依赖注入)

    自动装配   引用类型         简单类型      加载properties文件      

  6. ChatGPT转发工具-springboot

    背景 国内服务器无法访问openAI接口,我想过有两种实现方式 代理工具类似 tinyproxy.nginx 开发一个转发客户端(java.python都可以实现),提供一个api接口 源码 gith ...

  7. 2024年常用的Net web框架

    ASP.NET Core 框架声明:是微软推出的新一代开源.跨平台的 Web 应用框架,用于构建高性能.现代化的 Web 应用程序. 官网地址:https://dotnet.microsoft.com ...

  8. 《Vue.js 设计与实现》读书笔记 - 第15章、编译器核心技术概览

    第15章.编译器核心技术概览 15.1 模板 DSL 的编译器 完整的编译包括 [源代码] -->词法分析-->语法分析-->语义分析(编译前端) -->中间代码生成--> ...

  9. 最小代价的 SSO 单点登录方案

    现在有多个 WebApp,想用最小的代价实现 SSO 单点登录.所谓最小代价,我的理解就是对原有 WebApp 的改动最小,因此 在旁路增加一个 SsoWebApp 用于管理 SSO 的账号,进行身份 ...

  10. /proc/pids/status

    /proc/279/status是一个Linux内核中的文件,其中包含了当前进程的状态信息.每行的含义如下: Name: 进程的名称,例如"java"或"bash&quo ...