测试平台接口开发日记05

282 篇文章 6 订阅
149 篇文章 0 订阅
本文记录了使用Python进行接口开发的过程,包括密码长度和手机号格式验证、密码加密处理、数据交互、自定义返回值以及注册接口的实现。通过Postman进行接口测试,成功注册新用户。
摘要由CSDN通过智能技术生成

书接上文,上篇文章我们是做了模型定义、数据交互处理以、服务的启动,并及开发了一个接口。上篇只是大概写了一个接口,接下来就是正式进入接口开发环节。

验证密码长度和手机号格式


新建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%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

图片

开发一款日记软件用于鸿蒙系统,需求分析主要包括以下几个关键步骤: 1. 用户需求理解:首先,了解目标用户群体,他们的年龄、性别、职业、使用习惯等,以便设计符合用户喜好的界面和功能。例如,学生可能更关注便捷记录,职场人可能需要时间管理和分类功能。 2. 功能需求: - **记录功能**:用户能轻松添加新日记条目,编辑内容,支持文字、图片、语音等多种形式的记录。 - **分类和标签**:提供日志分类或标签系统,方便用户整理和查找历史记录。 - **隐私保护**:确保用户的日记信息安全,如密码加密存储,以及设置访问权限。 - **同步与备份**:支持多设备间的自动同步,以及云备份以防数据丢失。 - **提醒功能**:定时提醒用户写日记,鼓励形成习惯。 - **美观与易用**:简洁美观的UI设计,易于上手的操作流程。 3. 性能需求:考虑到鸿蒙系统的资源限制,优化内存管理,保证软件运行流畅,响应迅速。 4. 技术选型:研究适合鸿蒙平台开发工具和技术栈,比如使用鸿蒙系统提供的SDK,或者兼容的跨平台开发框架。 5. 设计文档:编写详细的设计文档,包括架构图、数据库设计、接口设计等,为后续的编码工作提供指导。 6. 测试与反馈:在开发过程中,进行功能测试、性能测试和用户体验测试,收集用户反馈,不断迭代优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值