FastApi使用jwt-token进行验证

以Depends的方式定义jwt from jose import JWTError, jwt from passlib.context import CryptContext from fastapi.security import OAuth2PasswordBearer from fastapi import Depends, HTTPException, status from db import Curd from typing import Optional from datetime import datetime from config import settings from utils import logger from .db import get_db from datetime import timedelta pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") oauth2_schema = OAuth2PasswordBearer(tokenUrl="/users/login") def hash_password(plain_password: str) -> str: return pwd_context.hash(plain_password) def verity_password(plain_password: str, hashed_password: str) -> bool: return pwd_context.verify(plain_password, hashed_password) async def jwt_authenticate_user(username: str, password: str): db = get_db() user = await Curd.get_user_by_name(await db.__anext__(), username) if not user: return False if not verity_password(password, user.password): return False return user def created_access_token(data: dict, expires_delta: Optional[timedelta] = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=settings.config.ACCESS_TOKEN_EXPIRE_MINUTES) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(claims=to_encode, key=settings.default.SECRET_KEY, algorithm="HS256") return encoded_jwt async def jwt_verity(token: str = Depends(oauth2_schema)): credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) try: playload = jwt.decode(token=token, key=settings.default.SECRET_KEY, algorithms=["HS256"]) except JWTError as e: logger.error("验证出现错误:\n", e) raise credentials_exception else: return playload async def jwt_get_current_user(playload: dict = Depends(jwt_verity)): db = get_db() user_id = int(playload.get("sub")) user = await Curd.get_user_by_id(await db.__anext__(), user_id=user_id) return user async def jwt_verity_admin(playload: dict = Depends(jwt_verity)): db = get_db() user_id = int(playload.get("sub")) is_admin = playload.get("is_admin") if is_admin: user = await Curd.get_user_by_id(await db.__anext__(), user_id=user_id) if user.is_admin: return raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) 需要分发token的url router = APIRouter( prefix="/users", tags=["user"], ) # it defind at dependencies.jwt # oauth2_schema = OAuth2PasswordBearer(tokenUrl="/users/token") @router.post("/register", response_model=UserToken) async def user_register(user: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)): if await Curd.is_user_name_exists(db, user.username): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="username already exists") hashed_password = hash_password(user.password) new_user = UserCreate(id=worker.get_id(), name=user.username, password=hashed_password) await Curd.register_user(db, new_user) @router.post("/login", response_model=UserToken) async def user_login(user: OAuth2PasswordRequestForm = Depends()): user = await jwt_authenticate_user(username=user.username, password=user.password) if not user: raise HTTPException( status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = created_access_token(data={"sub": str(user.id)}) user_token = UserToken(username=user.name, access_token=access_token, token_type="bearer") return user_token 需要token进行访问限制的url router = APIRouter( prefix="/works", tags=["works"], ) @router.get("/get", response_model=Works) async def test( order: int, nsfw: bool, page: int, sort: int, user: User = Depends(jwt_get_current_user), db: AsyncSession = Depends(get_db), ): works = await Curd.get_works(db, user.id, order, nsfw, page, sort) return works

2022-03-12 · 1 min · 422 words · kutake

Sqlalchemy-关于PyhtonORM的各种事

ORM ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),用于实现面向对象编程语言里不同类型系统的数据之间的转换 ...

2022-03-12 · 5 min · 2141 words · kutake
JetBrains 系列关于登录验证的屏蔽方法

JetBrains 系列关于登录验证的屏蔽方法

前言 Pycharm好像是3.X版本上的登录验证,IEDA应该是2.3,登录验证已经无法使用插件来绕过,这里记录一下新的方法。 此方法来源依旧是eval-reset插件的作者,使用到的开源项目地址或网站: ...

2021-12-26 · 2 min · 891 words · kutake

哈夫曼编码的实现(python)

思路 C++实在是弄不懂 代码 from typing import List, Optional class Node: """ 结点 """ def __init__(self): self.name: Optional[str] = None self.weight: Optional[int] = None self.left_child: Optional[Node] = None self.right_child: Optional[Node] = None self.parent: Optional[Node] = None class NodeCode: """ 结点的编码 """ def __init__(self, name: str, code: str): self.name = name self.code = code def __str__(self): return f"{self.name}:{self.code}" class HaffumanTreeCode: """ 哈夫曼树的编码 """ def __init__(self): self.code_list: List[NodeCode] = [] def append(self, code: NodeCode): self.code_list.append(code) def code(self, massage: str): """ 针对编码表编码 :param massage: 需要编码的信息 :return: """ code = "" for i in massage: for n in self.code_list: if n.name == i: code += n.code break # raise ValueError(f"'{i}'不存在") return code def decode(self, code: str): """ 针对编码表解码 :param code:需要解码的哈夫曼码 :return: """ out = "" i = 0 while code: code_need_match = code[0:i+1] for n in self.code_list: if n.code == code_need_match: out += n.name code = code[i+1:] i = 0 break i += 1 return out def __str__(self): """ 打印 :return: """ out = "" for i in self.code_list: out += i.__str__() + "\n" return out.strip() class HaffumanTree: """ 哈夫曼树 """ def __init__(self): self.root = Node() self.nodes: List[Node] = [] self.nodes_raw: List[Node] = [] self.codes: HaffumanTreeCode = HaffumanTreeCode() def inser(self, newnode: Node): for i in range(len(self.nodes)): if self.nodes[i].weight < newnode.weight: self.nodes.insert(i, newnode) return self.nodes.append(newnode) def build_tree(self, name_list: List[str], weight_list: List[int]): """ 创建哈夫曼树 :param name_list: 字符列表 :param weight_list: 权重列表 :return: """ # 队每个字符生成结点 while len(name_list) > 0: max_weight = max(weight_list) max_index = weight_list.index(max_weight) max_name = name_list[max_index] newnode = Node() newnode.name = max_name newnode.weight = max_weight self.nodes.append(newnode) name_list.remove(max_name) weight_list.remove(max_weight) # 保存源结点 self.nodes_raw = self.nodes[:] # 创建新结点并生成树 while len(self.nodes) > 2: left = self.nodes.pop() right = self.nodes.pop() newnode = Node() newnode.weight = left.weight + right.weight newnode.left_child = left newnode.right_child = right left.parent = newnode right.parent = newnode # 根据权重插入 self.inser(newnode) left = self.nodes.pop() right = self.nodes.pop() self.root.weight = left.weight + right.weight self.root.left_child = left self.root.right_child = right left.parent = self.root right.parent = self.root def make_code(self): """ 生成编码表 :return: """ while len(self.nodes_raw): node = self.nodes_raw.pop() name = node.name code = "" while node.parent != self.root: parent = node.parent if parent.left_child == node: code = "0" + code elif parent.right_child == node: code = "1" + code node = parent if self.root.left_child == node: code = "0" + code elif self.root.right_child == node: code = "1" + code self.codes.append(NodeCode(name, code)) def decode(self, code: str): return self.codes.decode(code) def code(self, massage: str): return self.codes.code(massage) if __name__ == '__main__': h = HaffumanTree() name_list = ["a", "b", "c", "d", "e"] wight_list = [5, 11, 6, 21, 19] h.build_tree(name_list, wight_list) h.make_code() print(f"编码表:\n{h.codes}") print(f'bcacce编码为:{h.code("bcacce")}') print(f'01001000001001解码为: {h.decode("0100100000100110")}')

2021-11-21 · 2 min · 668 words · kutake
FastApi应用-bot中挂载web服务

FastApi应用-bot中挂载web服务

轻量web服务 介绍 FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。 FastAPI 框架,高性能,易于学习,高效编码,生产可用 ...

2021-06-15 · 3 min · 1318 words · kutake

all() 一个便利的多条件判断方法

一般的多条件判断 if 判断1 and 判断2 and 判断3: run() 当语句非常长的时候,就显得难懂且不美观 all()方法多条件判断 if all([条件1, 条件2, 条件3]): run() all()传入一个可迭代对象,当所有条件为True时,返回True

2021-05-04 · 1 min · 107 words · kutake
CUAVbot--一个python构成的qq机器人

CUAVbot--一个python构成的qq机器人

这个bot写了有段小时间了,一直没有做个总结之类的,正好最近使用了saya, 代码算是可以看了点,于是就准备做个小总结。 Bot是什么 输入 - 处理 - 结果 大致上就是如此,发送一句话,bot根据这句话进行处理,然后得到预期结果。很明显,bot就是IO密集型程序,使用异步的方式是最便捷也是最高效的,这里就要说下开发框架 ...

2021-05-03 · 4 min · 1553 words · kutake

实战:comic walker漫画多章节爬虫

为什么要做 还在做汉化组的扒图的时候,一直觉得comic walker这个站点的漫画拔起来非常麻烦,因为它自带一个阅读器界面,异步加载图片,而且无法右键,甚至在网页元素中,也无法直接保存图片(这应该是漫画网站的常见配置了),只能一个个在控制台中拖动图片至新的标签页才能加载图片并保存,十分麻烦,正好学习python中,就写了这个小工具。 ...

2020-07-15 · 5 min · 2474 words · kutake

json文件转xls文件

#写成json的文本文件内容,转换为xls文件 import xlwt import os import json def get_(path): with open(path,'r',encoding='utf-8') as f: content=f.read() return content def json_(str): d=json.loads(str) d=sorted(d.items(),key=lambda item:item[0],reverse=False) return d def json_16(str): d=json.loads(str) return d def save_(d,path): workbook=xlwt.Workbook(encoding='utf-8') sheet1=workbook.add_sheet('sheet1') r=0 c=1 for key,value in d: sheet1.write(r,0,key) for i in value: sheet1.write(r,c,i) c+=1 r+=1 c=1 workbook.save(path) def save_16(d,path): workbook=xlwt.Workbook(encoding='utf-8') sheet1=workbook.add_sheet('sheet1') for a,b in enumerate(d): for c,v in enumerate(b): sheet1.write(a,c,v) workbook.save(path) if __name__ == "__main__": p1=r'E:\vscode\code\testwork\txtfile\5.txt' p2=r'E:\vscode\code\testwork\txtfile\5.xls' save_16(json_16(get_(p1)),p2) print('END')

2020-06-27 · 1 min · 92 words · kutake

实战:词云生成

import re import jieba import collections import numpy as np import wordcloud # 词云展示库 from PIL import Image # 图像处理库 import matplotlib.pyplot as plt # 图像展示库 def remove(): with open('remove_words.txt','r',encoding='utf-8') as f: txt=f.read() words = re.findall(r'[^\s]+',txt) list_=[] for i in words: if i in list_: continue else: list_.append(i) return list_ def get_words(path): f=open(path,encoding='utf-8') txt=f.read() f.close() words = jieba.lcut(txt) remove_word=remove() reword = [] for word in words: if len(word) == 1: continue elif word in remove_word: continue else: reword.append(word) word_counts=collections.Counter(reword) return word_counts #统计词频 def wordcount(word_counts): top=word_counts.most_common(20) print(top) def wordc(impath,words): mask=np.array(Image.open(impath)) wc = wordcloud.WordCloud( font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式 mask=mask, # 设置背景图 max_words=600, # 最多显示词数 max_font_size=130 # 字体最大值 ) wc.generate_from_frequencies(words) # 从字典生成词云 image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案 wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案 plt.imshow(wc) # 显示词云 plt.axis('off') # 关闭坐标轴 plt.show() # 显示图像 wc.to_file('ff.png') if __name__ == "__main__": path=r'E:\vscode\code\ff.txt' impath=r'E:\vscode\code\topdodo_2.jpg' wordc(impath,get_words(path))

2020-06-27 · 1 min · 204 words · kutake