基于Django Rest Framework的五张牌抽牌扑克API开发问询
Django 扑克手牌API实现方案
一、API编写步骤
1. 环境与项目初始化
- 先安装依赖:
pip install django djangorestframework - 新建项目和APP:
django-admin startproject poker_api cd poker_api python manage.py startapp poker - 打开
poker_api/settings.py,在INSTALLED_APPS里添加'rest_framework'和'poker'
2. 核心代码拆分与视图分工
把你现有的洗牌、发牌、评级逻辑抽成独立工具函数,放在poker/utils.py里——这部分和Django完全无关,纯业务逻辑;视图只负责对接HTTP请求、调用工具、返回JSON。
工具函数示例(poker/utils.py)
import random # 生成标准52张牌 def make_deck(): suits = ['H', 'D', 'S', 'C'] # 红桃、方块、黑桃、梅花 ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] return [f"{r}{s}" for s in suits for r in ranks] # 洗牌 def shuffle_deck(deck): shuffled = deck.copy() random.shuffle(shuffled) return shuffled # 发5张手牌 def deal_hand(deck): return deck[:5] # 手牌评级(替换成你自己的逻辑) def get_hand_rank(hand): # 示例:判断同花 suits = [card[-1] for card in hand] if len(set(suits)) == 1: return "Flush" # 这里补全你已有的其他评级逻辑(比如顺子、四条等) return "High Card"
视图实现(poker/views.py)
用DRF的APIView写最基础的接口:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .utils import make_deck, shuffle_deck, deal_hand, get_hand_rank class PokerHandAPI(APIView): def get(self, request): try: # 按流程执行:做牌堆→洗牌→发牌→评级 deck = make_deck() shuffled_deck = shuffle_deck(deck) player_hand = deal_hand(shuffled_deck) hand_rank = get_hand_rank(player_hand) # 构造符合要求的JSON响应 return Response({ "your_hand": player_hand, "your_rank": hand_rank }, status=status.HTTP_200_OK) except Exception as e: # 捕获异常,返回友好错误 return Response( {"error": f"生成手牌失败:{str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR )
3. 配置路由
- 在
poker目录下新建urls.py:from django.urls import path from .views import PokerHandAPI urlpatterns = [ path('get-hand/', PokerHandAPI.as_view(), name='get_poker_hand'), ] - 项目根目录的
urls.py里引入APP路由:from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('poker.urls')), ]
4. 测试接口
启动服务:python manage.py runserver,访问http://localhost:8000/api/get-hand/,就能拿到类似这样的JSON:
{ "your_hand": ["5K", "8H", "2S", "3D", "9S"], "your_rank": "Flush" }
二、关键设计考量
- 单一职责:工具函数只管业务逻辑,视图只管HTTP交互——以后要改评级规则,直接动
utils.py就行,不用碰视图;要改响应格式,只动视图,不影响业务逻辑。 - 可扩展性:如果以后要支持多人发牌、自定义手牌数量,可以在视图里接收请求参数(比如
http://localhost:8000/api/get-hand/?num_cards=7),再传给工具函数处理。 - HTTP规范:用GET请求生成新手牌没问题(因为只是读取新结果,不修改服务器状态);如果要做带状态的游戏(比如保存牌堆剩余牌),就得用POST,配合数据库或会话存储。
- 错误处理:一定要加异常捕获,避免服务器直接抛500错误,返回清晰的错误信息方便调试。
- 格式规范:响应键名用小写蛇形(
your_hand),符合REST API的通用习惯,前端解析起来更顺畅。 - 性能优化:如果接口请求频繁,不用每次都重新生成牌堆,可以缓存一个洗牌后的牌堆,但要注意随机性;或者用更高效的洗牌算法(Python的
random.shuffle已经实现了Fisher-Yates算法,足够高效)。
三、代码分配逻辑
- 工具层(utils.py):纯业务逻辑,和框架解耦——就算以后换用FastAPI或者Flask,这部分代码直接就能用。
- 视图层(views.py):作为HTTP接口和业务逻辑的桥梁,负责接收请求、调用工具、组装响应、处理HTTP状态。
- 路由层(urls.py):定义API的访问路径,把用户的请求导向对应的视图。
内容的提问来源于stack exchange,提问作者Jean-Luc
相关产品推荐
相关产品推荐

