You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:05:24