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

目录结构, 由于我也是刚开始学这个框架,只是了解了怎么注册蓝图,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. cvc-complex-type.2.3: Element 'servlet' cannot have character [children], because the type's content

    错误原因:粘贴代码 <servlet> <servlet-name>barServlet</servlet-name> <servlet-class>S ...

  2. MySQL8.0配置文件详解

    mysql8.0配置文件一.关键配置1. 配置文件的位置 MySQL配置文件 /etc/my.cnf 或者 /etc/my.cnf.d/server.cnf几个关键的文件:.pid文件,记录了进程id ...

  3. 一文搞懂指标采集利器 Telegraf

    作者| 姜闻名 来源|尔达 Erda 公众号 ​ 导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...

  4. 了解 Linkerd Service Mesh 架构

    从较高的层次上看,Linkerd 由一个控制平面(control plane) 和一个 数据平面(data plane) 组成. 控制平面是一组服务,提供对 Linkerd 整体的控制. 数据平面由在 ...

  5. OSGi系列 - 使用Eclipse查看Bundle源码

    使用Eclipse开发OSGi Bundle时,会发现有很多现成的Bundle可以用.但如何使用这些Bundle呢?除了上网搜索查资料外,阅读这些Bundle的源码也是一个很好的方法. 本文以org. ...

  6. Spring MVC入门(二)—— URI Builder模式

    URI Builder Spring MVC作为一个web层框架,避免不了处理URI.URL等和HTTP协议相关的元素,因此它提供了非常好用.功能强大的URI Builder模式来完成,这就是本文重点 ...

  7. 拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    参考文献:https://www.cnblogs.com/sddai/p/5728195.html 在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush ...

  8. 测试工具_siage

    目录 一.简介 二.例子 三.参数 一.简介 Siege是一个多线程http负载测试和基准测试工具. 1.他可以查看每一个链接的状态和发送字节数 2.可以模拟不同用户进行访问 3.可以使用POST方法 ...

  9. 「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

    前言 资源是影响 Spark 应用执行效率的一个重要因素.Spark 应用中真正执行 task 的组件是 Executor,可以通过spark.executor.instances 指定 Spark ...

  10. ciscn_2019_s_6

    例行检查 没有开启nx保护,考虑用shellcode来做这道题 程序放入ida查看 我们可以输入48个字符覆盖0使printf打印出bp的值 继续看这里,buf的大小实际上只有0x38的大小,但是re ...