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

目录结构, 由于我也是刚开始学这个框架,只是了解了怎么注册蓝图,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. Flume(一)【概述】

    目录 一.Flume定义 二.Flume基础架构 1.Agent 2.Source 3.Sink 4.Channel 5.Event 一.Flume定义 ​ Flume是Cloudera公司提供的一个 ...

  2. "delete this" in C++

    Ideally delete operator should not be used for this pointer. However, if used, then following points ...

  3. 【Java基础】Java反射——Private Fields and Methods

    Despite the common belief it is actually possible to access private fields and methods of other clas ...

  4. Appium获取toast消息(二)

    刚接触appium进行移动端设备的UI自动化,在遇到toast消息的时候很是苦恼了一阵,最后通过强大的搜索引擎找到了个相对解决方法,废话不多说,直接贴代码↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ...

  5. matplotlib画散点图和柱状图,等高线图,image图

    一:散点图: scatter函数原型   其中散点的形状参数marker如下:   其中颜色参数c如下:     n = 1024 # 均值是0, 方差是1, 取1024个数 x = np.rando ...

  6. matplotlib画直线图的基本用法

    一  figure使用 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 # 从-3到中取50个数 5 x = np.linspac ...

  7. 通过js禁用浏览器的回退事件

    js代码: <script> history.pushState(null, null, document.URL); window.addEventListener('popstate' ...

  8. Set数据结构基本介绍

    构造 const set = new Set([1, 2, 3, 4, 4]); 可接受的参数为所有具有iterable 接口的数据 特性: 类似数组,无重复值. const set = new Se ...

  9. STL模板前言(1)

    STL提供以下数据结构方便使用: 顺序容器: vector(动态数组):从后面直接插入删除元素,直接访问任何元素. deque(双端队列):从前面和后面快速插入删除,直接访问任何元素. list(双链 ...

  10. KNN分类

    1. KNN简介 K近邻(K-Nearest Neighbor)简称KNN.它可以做分类算法,也可以做回归算法.个人经验:KNN在做分类问题时非常有效. 2. KNN算法思想 在样本空间中,我们认为两 ...