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

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

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

from fastapi import FastAPI
from text import demo
from wx import test_client
from sql_conf import models, database models.Base.metadata.create_all(bind=database.engine) app = FastAPI()
app.include_router(demo.router, prefix="/api")
app.include_router(test_client.router, prefix="/wx") if __name__ == '__main__':
import uvicorn
uvicorn.run(
app='main:app',
host="0.0.0.0",
port=8082,
reload=True,
debug=True
)

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

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 3:25 下午 import jwt
from fastapi import HTTPException, Security, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBasic
from passlib.context import CryptContext
from datetime import datetime, timedelta class AuthHandler():
security = HTTPBasic()
pwd_content = CryptContext(schemes=['bcrypt'], deprecated='auto')
secret = 'SECRET' # 密码加密
def get_password_has(self, password):
return self.pwd_content.hash(password) # 密码校验
def verify_password(self, plain_password, hashed_password):
return self.pwd_content.verify(plain_password, hashed_password) # 生成token
def encode_token(self, user_id):
payload = {
'exp': datetime.utcnow() + timedelta(days=0, minutes=120),
'iat': datetime.utcnow(),
'sub': user_id
}
return str(jwt.encode(payload, self.secret, algorithm='HS256')) # token解码
def decode_token(self, token):
try:
payload = jwt.decode(token, self.secret, algorithms=['HS256'])
return payload['sub']
except jwt.ExpiredSignatureError:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="签名已过期"
)
except jwt.InvalidTokenError:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='签名无效!') def auth_wrapper(self, oauth: HTTPAuthorizationCredentials = Security(security)):
return self.decode_token(oauth.credentials)

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

wx目录下的test_client.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 4:00 下午 from fastapi import status, APIRouter, Depends, Path, Query
from fastapi.responses import JSONResponse
from sql_conf.database import SessionLocal
from typing import Union, Any
from sql_conf.models import User
from sql_conf.crud import db_create
from sqlalchemy.orm import Session
from sql_conf.db_session import get_db
from .data_model import UserItem, USerLgoin
from auth import AuthHandler
auth_middle = AuthHandler() router = APIRouter(
tags=["wx"],
responses={404: {"description": "未找到接口!"}}
) @router.get('/')
async def read_main(token_data: Union[str, Any] = Depends(auth_middle.decode_token),):
content = {"msg": "hello wx"}
return JSONResponse(status_code=status.HTTP_200_OK, content=content) @router.post('/create_user')
async def create_user_info( Item: UserItem, db: Session = Depends(get_db)):
result = {'code': 0, "message": ""}
request_dict = Item.dict()
login = request_dict.get('login')
email = request_dict.get('email')
pwd = request_dict.get("hashed_password")
if not login:
return JSONResponse(status_code=status.HTTP_201_CREATED, content={"code": 201, "msg": '请输入账号!'})
has_pwd = auth_middle.get_password_has(pwd)
save_user_info = {
'email': email,
'login': login,
'hashed_password': has_pwd
}
comiit_user = db_create(db=db, payload=save_user_info)
if comiit_user:
result['code'] = 200
result['message'] = '注册成功!'
else:
result['code'] = 201
result['message'] = '注册失败!' return JSONResponse(status_code=status.HTTP_200_OK, content=result) @router.post('/login_user')
async def user_login(Data: USerLgoin, db: Session=Depends(get_db)):
result = {}
user_dict = Data.dict()
user_name = user_dict.get('username')
pwd = user_dict.get('password')
filter_data = db.query(User).filter_by(login=user_name).first()
version_pwd = auth_middle.verify_password(plain_password=pwd, hashed_password=filter_data.hashed_password)
print(version_pwd)
if version_pwd:
token = auth_middle.encode_token(user_id=filter_data.id)
print(token)
result['code'] = 200
result['msg'] = '登录成功!'
result['token'] = token
else:
result['code'] = 201
result['msg'] = '登录失败!'
return JSONResponse(status_code=status.HTTP_200_OK, content=result) @router.get('/get_user/', summary="获取用户信息")
async def get_user_info(token_data: Union[str, Any] = Depends(auth_middle.decode_token), db: Session = Depends(get_db)):
result = {}
filter_user = db.query(User).filter_by(id=int(token_data)).first()
if filter_user:
result['code'] = 200
result['message'] = '用户信息'
result['userinfo'] = {
'login': filter_user.login,
'email': filter_user.email,
'pwd': filter_user.hashed_password
}
else:
result['code'] = 201
result['message'] = "未获取到用户信息!"
return JSONResponse(status_code=status.HTTP_200_OK, content=result)

data_model.py 用来创建数据模型

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 4:02 下午
from pydantic import BaseModel class UserItem(BaseModel):
login: str
email: str
hashed_password: str class USerLgoin(BaseModel):
username: str
password: str

text目录demo.py文件

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 3:48 下午 from typing import Optional
from fastapi import FastAPI, Body, status, APIRouter
from pydantic import BaseModel
from fastapi.responses import JSONResponse router = APIRouter(
tags=["items"],
responses={404: {"description": "Not found"}}
) class Item(BaseModel):
name: str
price: float
is_offer: Optional[bool] = None @router.get('/')
def index():
content = {"hello": "world"}
return JSONResponse(status_code=status.HTTP_200_OK, content=content) @router.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {'itrm_id': item_id, "q": q} @router.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
print(item_id)
print(item)
return {"item_name": item.name, "item_id": item_id}

sql_conf目录用于配置数据库

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

crud.py 数据库的增删改查

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 4:52 下午 from sql_conf import models
from sqlalchemy.orm import Session def db_create(db: Session, payload):
try:
db_user = models.User(**payload)
db.add(db_user)
db.flush()
db.commit()
return db_user
except Exception as e:
print("错误: {}".format(e))

数据库的连接 databases.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 4:52 下午 from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker db_conf = {
'user': 'user',
'password': '密码',
'host': 'ip',
'port': '3306',
'name': 'demo'
} # 数据库访问地址
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://{user}:{password}@{host}:{port}/{name}".format(
user=db_conf['user'],
password=db_conf['password'],
host=db_conf['host'],
port=db_conf['port'],
name=db_conf['name']
) # 启动引擎
engine = create_engine(
SQLALCHEMY_DATABASE_URL
)
# 创建会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 数据模型基类
Base = declarative_base()

models.py创建模型

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 4:52 下午 from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from .database import Base class User(Base):
__tablename__ = "users" id = Column(Integer, primary_key=True, index=True)
login = Column(String(length=60), index=True)
email = Column(String(length=255), unique=True, index=True, )
hashed_password = Column(String(length=255))
is_active = Column(Boolean, default=True)

db_session.py 数据库会话信息

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Eamil: 1922878025@qq.com
# @Author: Wyc
# @Time: 2:59 下午
from .database import SessionLocal def get_db():
db = ""
try:
db = SessionLocal()
yield db
finally:
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. PowerToys插件扩展(类似Alfred)

    在mac系统除了自带的Spotlight还有一个很好用的工具叫Alfred image 在windows系统也有一个很好用的工具叫PowerToys,是微软的一个开源项目 image https:// ...

  2. day02 Rsyuc备份服务器

    day02 Rsyuc备份服务器 一.备份 1.什么是备份 备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的, ...

  3. python格式化输出的两种方式对比

    1.%符号方法和format()函数方法 2.对比: 1 print('我今年%d岁' %22.125) 2 print('我今年{0:f}'.format(22.125)) 3 #报错 4 #槽中类 ...

  4. 如何让Linux 机器CPU使用率变高

    如何让Linux 机器CPU使用率变高 一.实现 1.单行命令搞定 for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" ...

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

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

  6. ubantu打开摄像头失败

    摘要-针对ubantu20 sudo apt install v4l-utils v4l2-ctl --list-devices - cv2 install on ubantu20```针对ubant ...

  7. 【编程思想】【设计模式】【其他模式】blackboard

    Python版 https://github.com/faif/python-patterns/blob/master/other/blackboard.py #!/usr/bin/env pytho ...

  8. 强化学习实战 | 表格型Q-Learning玩井字棋(四)游戏时间

    在 强化学习实战 | 表格型Q-Learning玩井字棋(三)优化,优化 中,我们经过优化和训练,得到了一个还不错的Q表格,这一节我们将用pygame实现一个有人机对战,机机对战和作弊功能的井字棋游戏 ...

  9. 【划重点】Python xlrd简介

    一.用xlrd获取对应数据,并获取所有sheet的名字 import xlrd data=xlrd.open_workbook(r'C:\Users\ASUS\Desktop\重新开始\Python获 ...

  10. LuoguB2029 大象喝水 题解

    Update \(\texttt{2021.12.4}\) 修改了原先的错误代码,给各位造成影响,在此表示很抱歉. Content 大象要喝 \(20\) 升水,但现在只有一个深 \(h\) 厘米,半 ...