废话不多说,直接上代码。

目录结构, 由于我也是刚开始学这个框架,只是了解了怎么注册蓝图,JWT的集成,数据库的集成,想了解更多,自行打开官方文档去详细阅读。fastapi官网文档链接

创建一个main.py文件, 我这个是添加了蓝图,  关键字:

  1. from fastapi import FastAPI
  2. from text import demo
  3. from wx import test_client
  4. from sql_conf import models, database
  5.  
  6. models.Base.metadata.create_all(bind=database.engine)
  7.  
  8. app = FastAPI()
  9. app.include_router(demo.router, prefix="/api")
  10. app.include_router(test_client.router, prefix="/wx")
  11.  
  12. if __name__ == '__main__':
  13. import uvicorn
  14. uvicorn.run(
  15. app='main:app',
  16. host="0.0.0.0",
  17. port=8082,
  18. reload=True,
  19. debug=True
  20. )

auth.py用来jwt的校验和生成

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 3:25 下午
  6.  
  7. import jwt
  8. from fastapi import HTTPException, Security, status
  9. from fastapi.security import HTTPAuthorizationCredentials, HTTPBasic
  10. from passlib.context import CryptContext
  11. from datetime import datetime, timedelta
  12.  
  13. class AuthHandler():
  14. security = HTTPBasic()
  15. pwd_content = CryptContext(schemes=['bcrypt'], deprecated='auto')
  16. secret = 'SECRET'
  17.  
  18. # 密码加密
  19. def get_password_has(self, password):
  20. return self.pwd_content.hash(password)
  21.  
  22. # 密码校验
  23. def verify_password(self, plain_password, hashed_password):
  24. return self.pwd_content.verify(plain_password, hashed_password)
  25.  
  26. # 生成token
  27. def encode_token(self, user_id):
  28. payload = {
  29. 'exp': datetime.utcnow() + timedelta(days=0, minutes=120),
  30. 'iat': datetime.utcnow(),
  31. 'sub': user_id
  32. }
  33. return str(jwt.encode(payload, self.secret, algorithm='HS256'))
  34.  
  35. # token解码
  36. def decode_token(self, token):
  37. try:
  38. payload = jwt.decode(token, self.secret, algorithms=['HS256'])
  39. return payload['sub']
  40. except jwt.ExpiredSignatureError:
  41. raise HTTPException(
  42. status_code=status.HTTP_401_UNAUTHORIZED,
  43. detail="签名已过期"
  44. )
  45. except jwt.InvalidTokenError:
  46. raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='签名无效!')
  47.  
  48. def auth_wrapper(self, oauth: HTTPAuthorizationCredentials = Security(security)):
  49. return self.decode_token(oauth.credentials)

wx,test两个目录,都是单独的一个app。

wx目录下的test_client.py

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 4:00 下午
  6.  
  7. from fastapi import status, APIRouter, Depends, Path, Query
  8. from fastapi.responses import JSONResponse
  9. from sql_conf.database import SessionLocal
  10. from typing import Union, Any
  11. from sql_conf.models import User
  12. from sql_conf.crud import db_create
  13. from sqlalchemy.orm import Session
  14. from sql_conf.db_session import get_db
  15. from .data_model import UserItem, USerLgoin
  16. from auth import AuthHandler
  17. auth_middle = AuthHandler()
  18.  
  19. router = APIRouter(
  20. tags=["wx"],
  21. responses={404: {"description": "未找到接口!"}}
  22. )
  23.  
  24. @router.get('/')
  25. async def read_main(token_data: Union[str, Any] = Depends(auth_middle.decode_token),):
  26. content = {"msg": "hello wx"}
  27. return JSONResponse(status_code=status.HTTP_200_OK, content=content)
  28.  
  29. @router.post('/create_user')
  30. async def create_user_info( Item: UserItem, db: Session = Depends(get_db)):
  31. result = {'code': 0, "message": ""}
  32. request_dict = Item.dict()
  33. login = request_dict.get('login')
  34. email = request_dict.get('email')
  35. pwd = request_dict.get("hashed_password")
  36. if not login:
  37. return JSONResponse(status_code=status.HTTP_201_CREATED, content={"code": 201, "msg": '请输入账号!'})
  38. has_pwd = auth_middle.get_password_has(pwd)
  39. save_user_info = {
  40. 'email': email,
  41. 'login': login,
  42. 'hashed_password': has_pwd
  43. }
  44. comiit_user = db_create(db=db, payload=save_user_info)
  45. if comiit_user:
  46. result['code'] = 200
  47. result['message'] = '注册成功!'
  48. else:
  49. result['code'] = 201
  50. result['message'] = '注册失败!'
  51.  
  52. return JSONResponse(status_code=status.HTTP_200_OK, content=result)
  53.  
  54. @router.post('/login_user')
  55. async def user_login(Data: USerLgoin, db: Session=Depends(get_db)):
  56. result = {}
  57. user_dict = Data.dict()
  58. user_name = user_dict.get('username')
  59. pwd = user_dict.get('password')
  60. filter_data = db.query(User).filter_by(login=user_name).first()
  61. version_pwd = auth_middle.verify_password(plain_password=pwd, hashed_password=filter_data.hashed_password)
  62. print(version_pwd)
  63. if version_pwd:
  64. token = auth_middle.encode_token(user_id=filter_data.id)
  65. print(token)
  66. result['code'] = 200
  67. result['msg'] = '登录成功!'
  68. result['token'] = token
  69. else:
  70. result['code'] = 201
  71. result['msg'] = '登录失败!'
  72. return JSONResponse(status_code=status.HTTP_200_OK, content=result)
  73.  
  74. @router.get('/get_user/', summary="获取用户信息")
  75. async def get_user_info(token_data: Union[str, Any] = Depends(auth_middle.decode_token), db: Session = Depends(get_db)):
  76. result = {}
  77. filter_user = db.query(User).filter_by(id=int(token_data)).first()
  78. if filter_user:
  79. result['code'] = 200
  80. result['message'] = '用户信息'
  81. result['userinfo'] = {
  82. 'login': filter_user.login,
  83. 'email': filter_user.email,
  84. 'pwd': filter_user.hashed_password
  85. }
  86. else:
  87. result['code'] = 201
  88. result['message'] = "未获取到用户信息!"
  89. return JSONResponse(status_code=status.HTTP_200_OK, content=result)

data_model.py 用来创建数据模型

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 4:02 下午
  6. from pydantic import BaseModel
  7.  
  8. class UserItem(BaseModel):
  9. login: str
  10. email: str
  11. hashed_password: str
  12.  
  13. class USerLgoin(BaseModel):
  14. username: str
  15. password: str

text目录demo.py文件

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 3:48 下午
  6.  
  7. from typing import Optional
  8. from fastapi import FastAPI, Body, status, APIRouter
  9. from pydantic import BaseModel
  10. from fastapi.responses import JSONResponse
  11.  
  12. router = APIRouter(
  13. tags=["items"],
  14. responses={404: {"description": "Not found"}}
  15. )
  16.  
  17. class Item(BaseModel):
  18. name: str
  19. price: float
  20. is_offer: Optional[bool] = None
  21.  
  22. @router.get('/')
  23. def index():
  24. content = {"hello": "world"}
  25. return JSONResponse(status_code=status.HTTP_200_OK, content=content)
  26.  
  27. @router.get("/items/{item_id}")
  28. def read_item(item_id: int, q: Optional[str] = None):
  29. return {'itrm_id': item_id, "q": q}
  30.  
  31. @router.put("/items/{item_id}")
  32. def update_item(item_id: int, item: Item):
  33. print(item_id)
  34. print(item)
  35. return {"item_name": item.name, "item_id": item_id}

sql_conf目录用于配置数据库

创建 crud.py, database.py, db_session.py, models.py

crud.py 数据库的增删改查

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 4:52 下午
  6.  
  7. from sql_conf import models
  8. from sqlalchemy.orm import Session
  9.  
  10. def db_create(db: Session, payload):
  11. try:
  12. db_user = models.User(**payload)
  13. db.add(db_user)
  14. db.flush()
  15. db.commit()
  16. return db_user
  17. except Exception as e:
  18. print("错误: {}".format(e))

数据库的连接 databases.py

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 4:52 下午
  6.  
  7. from sqlalchemy import create_engine
  8. from sqlalchemy.ext.declarative import declarative_base
  9. from sqlalchemy.orm import sessionmaker
  10.  
  11. db_conf = {
  12. 'user': 'user',
  13. 'password': '密码',
  14. 'host': 'ip',
  15. 'port': '3306',
  16. 'name': 'demo'
  17. }
  18.  
  19. # 数据库访问地址
  20. SQLALCHEMY_DATABASE_URL = "mysql+pymysql://{user}:{password}@{host}:{port}/{name}".format(
  21. user=db_conf['user'],
  22. password=db_conf['password'],
  23. host=db_conf['host'],
  24. port=db_conf['port'],
  25. name=db_conf['name']
  26. )
  27.  
  28. # 启动引擎
  29. engine = create_engine(
  30. SQLALCHEMY_DATABASE_URL
  31. )
  32. # 创建会话
  33. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  34. # 数据模型基类
  35. Base = declarative_base()

models.py创建模型

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 4:52 下午
  6.  
  7. from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
  8. from sqlalchemy.orm import relationship
  9. from .database import Base
  10.  
  11. class User(Base):
  12. __tablename__ = "users"
  13.  
  14. id = Column(Integer, primary_key=True, index=True)
  15. login = Column(String(length=60), index=True)
  16. email = Column(String(length=255), unique=True, index=True, )
  17. hashed_password = Column(String(length=255))
  18. is_active = Column(Boolean, default=True)

db_session.py 数据库会话信息

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Eamil: 1922878025@qq.com
  4. # @Author: Wyc
  5. # @Time: 2:59 下午
  6. from .database import SessionLocal
  7.  
  8. def get_db():
  9. db = ""
  10. try:
  11. db = SessionLocal()
  12. yield db
  13. finally:
  14. db.close()

fastapi(一)的更多相关文章

  1. FastAPI框架

    目录 FastAPI框架 安装 基本使用 模版渲染 安装jinja2 基本使用 form表单数据交互 基本数据 文件交互 静态文件配置 FastAPI框架 该框架的速度(天然支持异步)比一般的djan ...

  2. FastAPI 快速搭建一个REST API 服务

    最近正好在看好的接口文档方便的工具, 突然看到这个, 试了一下确实挺方便 快速示例 from fastapi import FastAPI from pydantic import BaseModel ...

  3. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  4. FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置

    安装 pip install fastapi[all] pip install unicorn 基本使用(不能同时支持,get, post方法等要分开写) from fastapi import Fa ...

  5. python fastApi实战项目 - 爱投票管理系统(一)

    一.闲来无事,在工作之余自己研究了一下python的异步框架 - fastapi,并写包括 1.部门管理 2.角色管理 3.用户管理 4.菜单管理 5.登录日志 6.操作日志 六个基础功能模块,演示链 ...

  6. fastapi+vue搭建免费代理IP网站部署至heroku

    说明 最近需要用到一些HTTP的代理,用于爬虫去爬取信息,搜索了一些网站,貌似现在这类提供免费代理IP的网站很多,刚好最近看了点vue的视频,弄个网站练练. 部署到heroku,预览地址:点击这里 F ...

  7. FastAPI学习: 个人博客的后端API

    前言 学习FastAPI中把官方文档过了一遍,看了些大佬的文章,也借鉴(抄袭)了部分代码,写了一套个人博客的API,目前还比较简陋,统计的API基本没有,而且目前基本都停留在单表查询,所以含量不高,接 ...

  8. FastApi 进阶

    前言 终于有了第一个使用 FastApi 编写的线上服务, 在开发的过程中还是遇到了些问题, 这里记录一下 正文 目录结构 我们知道, FastApi 的启动方式推荐使用 uvicorn, 其启动方式 ...

  9. FastApi学习(二)

    前言 继续学习 此为第二篇, 还差些知识点就可以结束, 更多的比如用户的身份校验/ swagger 文档修改等以后会单独写 正文 使用枚举来限定参数 可以使用枚举的方式来限定参数为某几个值之内才通过 ...

  10. FastApi学习(一)

    前言 学习不止 正文 介绍 FastApi是PythonWeb框架的'新晋干员',虽然年轻但是很能打 目前已有 12k start GitHub 官网 为什么说他能打呢?它内部使用了 Python 的 ...

随机推荐

  1. 大数据学习day39----数据仓库02------1. log4j 2. 父子maven工程(子spring项目的创建)3.项目开发(埋点日志预处理-json数据解析、清洗过滤、数据集成实现、uid回补)

    1. log4j(具体见log4j文档) log4j是一个java系统中用于输出日志信息的工具.log4j可以将日志定义成多种级别:ERROR  /  WARN  /  INFO  /  DEBUG ...

  2. 大数据学习day14-----第三阶段-----scala02------1. 元组 2.类、对象、继承、特质 3.函数(必须掌握)

    1. 元组 映射是K/V对偶的集合,对偶是元组的最简单的形式,元组可以装着多个不同类型的值 1.1 特点 元组相当于一个特殊的数组,其长度和内容都可变,并且数组中可以装任何类型的数据,其主要用处就是存 ...

  3. 【Reverse】每日必逆0x01

    附件:https://files.buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev 题解 查壳 64位ELF文件,无壳 IDApro处 ...

  4. 【swift】CoreData Crash(崩溃)(Failed to call designated initializer on NSManagedObject class)

    感谢另一篇博客:https://blog.csdn.net/devday/article/details/6577985 里面的图片和介绍,发现问题如他描述的一样,没有bundle 我的Xcode版本 ...

  5. Java8使用并行流(ParallelStream)注意事项

    Java8并行流ParallelStream和Stream的区别就是支持并行执行,提高程序运行效率.但是如果使用不当可能会发生线程安全的问题.Demo如下: public static void co ...

  6. 【力扣】454. 四数相加 II

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...

  7. 【HarmonyOS】【DevEco Studio】NOTE04:How to Jump to a Page(页面间的跳转)

    页面创建与基本设置 创建页面 创建两个新页面,分别为AbilityPage1.AbilityPage2 设置页面基本内容 以AbilityPage1为例 导包 import com.example.m ...

  8. JAVA日志发展史

    JAVA日志发展史 第一阶段 2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err 缺点: 产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出 输出 ...

  9. Linux中定时任务

    目录 一.简介 二.crondtab file 三.crond命令的调试 四.精确到秒的任务计划 一.简介 定时任务在线测试网站 定时任务基本概念: (1).crond是一个daemon类程序,路径为 ...

  10. MySQL获取对应时间

    一.查询当前时间包含年月日 SELECT CURDATE(); SELECT CURRENT_DATE(); 二.查询当前时间包含年月日时分秒 SELECT NOW(); SELECT SYSDATE ...