书接上文,上篇文章我们是做了模型定义、数据交互处理以、服务的启动,并及开发了一个接口。上篇只是大概写了一个接口,接下来就是正式进入接口开发环节。
验证密码长度和手机号格式
新建alembic目录,并在alembic中新建verification.py文件,主要功能是处理密码长度和手机号格式。具体代码如下:
import re
from typing import AnyStr
__all__ = [
"VerificationData"
]
class VerificationData:
@staticmethod
def verification(*, mobile: str):
"""
验证手机号码是否符合规范
@param :
@return :
"""
try:
pattern = r'^1[3456789]\d{9}$'
return re.match(pattern, mobile.strip()) is not None
except Exception as exc:
raise exc
@staticmethod
def verification_lenth(*, var: AnyStr, max_len: int = 25, min_len: int = 5):
"""
验证账号和密码的长度是否符合
@param :
@return :
"""
try:
return False if (len(var.strip()) > max_len) or (len(var.strip()) < min_len) else True
except Exception as exc:
raise exc
密码进行加密处理
在core目录中新增一个hash_pwd.py文件,主要功能是处理密码加密和密码验证(需要安装passlib库)。具体代码如下:
from passlib.context import CryptContext
__all__ = [
"HashPassword"
]
class HashPassword:
def __init__(self) -> None:
self.pwd_context = CryptContext(
schemes=["bcrypt", "sha256_crypt"]
)
# 加密密码的函数
def get_password_hash(self, password: str):
return self.pwd_context.hash(password)
# 验证密码的函数
def verify_password(self, password: str, hashed_password: str):
return self.pwd_context.verify(password, hashed_password)
数据交互处理
在crud目录中新建crud_user.py文件,主要是处理和数据表的数据交互,代码如下:
from sqlalchemy.orm import Session
from sqlalchemy import select
from src.app.schemas.user import UseRregister
from src.app.models.models_user import User
from src.app.core.hash_pwd import HashPassword
from src.app.core.base_redis import redis_client
from src.app.cabinet.transition import Transition
from src.app.cabinet.verification import VerificationData
from src.app.core.dependencies import DependenciesProject
__all__ = [
"UsersCrud"
]
class UsersCrud:
def __init__(self, *, session: Session) -> None:
self.u = User
self.db = session
self.hash = HashPassword()
def register(self, user: UseRregister):
"""
注册接口数据和数据库交互
@param :
@return :
"""
try:
# 验证账号长度
if not VerificationData.verification_lenth(var=user.username):
raise Exception("账号长度为5-25个字符...")
# 验证密码长度
if not VerificationData.verification_lenth(var=user.password, max_len=25):
raise Exception("密码长度为5-25个字符...")
# 首先查询账号是否重复
user_info = self.db.execute(
select(self.u).where(self.u.username == user.username)
)
if user_info.scalars().first():
raise Exception("账号已存在...")
# 对密码进行加密, 再赋值给password变量
password = self.hash.get_password_hash(password=user.password)
# 获取到数据并赋值给users_info变量
user_info = self.u(username=user.username, password=password)
# 往数据库添加数据
self.db.add(user_info)
# 往数据库提交数据
self.db.commit()
# 刷新提交的数据
self.db.refresh(user_info)
result = self.db.execute(
select(
self.u.id, self.u.username, self.u.created_time
).where(self.u.username == user.username)
).first()._asdict()
return Transition.proof_timestamp(result)
except Exception as exc:
raise exc
自定义返回方法
在core目录中新建code_response.py,主要是处理返回值(嫌弃麻烦就直接使用官方提供的方法处理)。具体代码如下:
from fastapi.encoders import jsonable_encoder
__all__ = [
"CodeResponse"
]
class CodeResponse:
@staticmethod
def succeed(status: int = 1, data: dict = None, err_msg=""):
"""
接口成功需要返回的固定数据
@param :
@return :
"""
return jsonable_encoder(
dict(
status=status,
data=data if data else {},
err_code=0,
err_msg=err_msg
)
)
@staticmethod
def defeated(
status: int = 0, data: dict = None, err_code: int = 1000, err_msg: str = "数据失败或被移除"
):
"""
接口失败需要返回的固定数据
@param :
@return :
"""
return jsonable_encoder(
dict(
status=status,
data=data if data else {},
err_code=err_code,
err_msg=err_msg
)
)
定义注册接口
在routers/v_api目录中新建api_users.py文件,主要是设置接口的路由。具体代码如下:
from fastapi import APIRouter
from fastapi import Depends
from sqlalchemy.orm import Session
from src.app.schemas.user import UseRregister
from src.app.core.db.session import session
from src.app.crud.crud_user import UsersCrud
from src.app.core.code_response import CodeResponse
router = APIRouter(
prefix="/user"
)
@router.post("/register")
async def user_register(users: UseRregister, db: Session = Depends(session)):
"""
注册接口
@param :
@return :
"""
try:
response = UsersCrud(session=db).register(user=users)
return CodeResponse.succeed(data=response)
except Exception as exc:
return CodeResponse.defeated(err_msg=str(exc.args))
其次在routers目录中新建一个api_router.py文件,用于汇集接口的引包,具体代码如下:
from fastapi import APIRouter
from src.app.routers.v_api import api_users
api_router = APIRouter()
api_router.include_router(router=api_users.router, tags=["用户模块接口"])
最后再进入根目录下main.py文件中,写入我们启动代码,具体代码如下:
import uvicorn
from fastapi import (
FastAPI,
Request,
Response
)
from typing import Optional, Callable, Any
from src.app.routers.api_router import api_router
app = FastAPI()
@app.middleware
async def add_header(request: Request, response: Response, next: Optional[Callable[..., Any]]):
headers = {"Content-Type": "application/json"}
request.headers.update(headers)
response.headers.update(headers)
return await next(response)
app.include_router(router=api_router)
if __name__ == "__main__":
uvicorn.run(app="src.main:app", reload=True)
请求并注册用户
在postman中输入参数并发送请求,开始注册新用户。
POST:http://127.0.0.1:8000/user/register
Request:
{
"password": "debugfeng",
"username": "debugfeng"
}
Response:
{
"status": 1,
"data": {
"id": 6,
"username": "debugfeng",
"created_time": "2023-07-10 18:30:35"
},
"err_code": 0,
"err_msg": ""
}
The end…
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。