蓝桥杯Python在线判题平台完整可运行源码:Django后台+SQLite数据库+前端静态资源

发布时间:2026/7/24 15:22:43
蓝桥杯Python在线判题平台完整可运行源码:Django后台+SQLite数据库+前端静态资源 本文还有配套的精品资源点击获取简介一套开箱即用的蓝桥杯风格Python编程竞赛平台源码基于Django框架构建内置已初始化的SQLite数据库db.sqlite3包含完整前端页面资源web目录、题目代码仓库repository、Monaco字体文件MONACO.TTF及标准Django管理脚本manage.py。项目结构清晰competition_platform为应用主模块.idea为PyCharm配置支持一键启动本地服务。功能覆盖用户注册登录、题目浏览与提交、模拟判题逻辑、权限分级如管理员/普通用户、题型分类组织等典型竞赛平台能力。配套代码经过实际验证无需修改即可运行适合高校学生赛前练习、教学演示或二次开发参考。requirements.txt列明全部依赖环境适配简单部署门槛低本地调试友好。1. 这不是“玩具项目”而是一套真正能跑起来的竞赛判题系统我带过三届蓝桥杯校队也帮学院搭过两套内部练习平台。市面上很多所谓“开源判题系统”点开 README 就是“环境复杂”“依赖难装”“数据库要手动初始化”“前端要单独构建”学生花半天配环境连登录页都打不开哪还有心思刷题这套代码我去年在实验室实测过——从解压到看到首页全程不到90秒。它不追求炫酷的微服务架构或K8s部署而是用最朴素的方式把“判题这件事”做扎实Django负责稳稳兜住业务逻辑SQLite把题目、用户、提交记录全存进一个文件里Monaco字体确保代码编辑器看着舒服web目录里全是现成的HTML/CSS/JS连jQuery版本都锁死了3.6.0杜绝因前端库升级导致页面崩坏。它解决的不是“高并发百万用户”的幻想问题而是大学生备赛时最真实的痛点想立刻写代码、立刻提交、立刻看到结果反馈。关键词里的“蓝桥杯”不是噱头——题型组织完全按蓝桥杯真题风格设计填空题只比对输出字符串编程题支持多组测试用例逐条比对运行超时、内存溢出、编译错误都有对应提示文案“Django判题平台”意味着你打开competition_platform/views.py就能看清整个判题流程怎么串起来“SQLite题库”不是临时占位db.sqlite3里已经预置了27道典型题含历届省赛真题改编字段结构和蓝桥杯官方题库高度一致“Python竞赛系统”则体现在判题核心逻辑上——所有测试用例都是用Python脚本驱动的沙箱执行而非调用外部C编译器既降低环境依赖又精准模拟蓝桥杯Python组的真实判题机制。如果你是学生下载后直接python manage.py runserver就能当本地练习站用如果你是老师删掉repository/里几道题再替换成本校训练题5分钟完成定制如果你是开发者competition_platform/tasks.py里那个轻量级异步判题任务就是最好的学习切口——没有Celery的复杂配置纯用Django自带的threading队列模拟真实判题机行为。2. 整体架构设计与模块分工逻辑2.1 为什么选择DjangoSQLite这个组合很多人第一反应是“判题系统不用MySQL/PostgreSQL吗SQLite扛得住并发”这恰恰是本项目最务实的设计起点。蓝桥杯校内选拔或日常练习场景本质是低并发、高读写局部性的典型应用同一时间可能只有3-5个学生在提交但每个学生会高频刷新自己的提交记录、反复查看题目详情。SQLite在这种场景下反而有独特优势-零配置部署db.sqlite3就是一个文件manage.py migrate后自动建表不需要单独安装数据库服务、配置账号密码、开放端口。学生宿舍电脑没管理员权限没关系SQLite照跑不误。-ACID事务保障判题过程涉及“更新提交状态→写入判题结果→增加用户积分”三个操作必须原子性执行。SQLite的WAL模式Write-Ahead Logging在单机场景下事务可靠性不输主流数据库且transaction.atomic()装饰器用法和Django ORM完全一致代码迁移成本为零。-文件级备份便捷整套题库备份复制db.sqlite3文件。某次学生误删题目回滚就一秒钟的事不用写mysqldump脚本。至于Django的选择核心在于它天然解决了判题系统最耗时的“非判题”工作- 用户认证模块直接复用django.contrib.auth注册/登录/密码重置全部开箱即用连邮箱验证都已集成用的是Django内置的EmailBackend发件配置在settings.py里注释得很清楚- 后台管理界面/admin/让教师能直观增删题目、管理用户权限不用额外开发CRUD接口- URL路由和模板继承机制让web/目录下的静态资源能无缝嵌入Django视图——比如题目详情页problem_detail.html里直接用{{ problem.description|safe }}渲染Markdown格式的题目描述避免前端解析风险。提示项目刻意规避了Docker、Nginx等运维组件。这不是技术保守而是明确区分“功能验证”和“生产部署”两个阶段。学生调试时runserver的实时热重载比任何容器化方案都快等需要上线时Django标准WSGI部署文档uwsginginx网上一搜一大把本项目代码无需任何修改。2.2 目录结构背后的功能映射关系解压后的目录树看似杂乱实则每层都有明确职责边界。我们按实际开发视角拆解├── manage.py # Django入口所有命令从此发起runserver/migrate/shell ├── db.sqlite3 # 已预填充数据的SQLite数据库含27题、3类用户、150模拟提交记录 ├── requirements.txt # 仅6个依赖Django4.2.7 django-crispy-forms pyyaml python-dotenv pillow markdown无多余轮子 ├── MONACO.TTF # Monaco字体文件专为代码编辑器优化等宽、字符间距清晰、中文兼容好 ├── web/ # 前端静态资源根目录非Django static/而是通过View直接serve │ ├── css/ │ ├── js/ │ └── images/ ├── repository/ # 题目代码仓库Git风格组织每道题一个子目录含test_cases/和solution.py │ ├── 1001_hello_world/ │ │ ├── test_cases/ │ │ │ ├── input1.txt │ │ │ └── output1.txt │ │ └── solution.py # 参考答案供判题比对用非学生提交代码 │ └── ... ├── competition_platform/ # Django核心应用所有业务逻辑在此 │ ├── __init__.py │ ├── admin.py # 后台管理配置题目/用户/提交记录的列表展示字段、搜索框、过滤器 │ ├── apps.py # 应用注册Django 4.2要求显式声明 │ ├── models.py # 数据模型Problem/TestCase/Submission/UserProfile四张表字段命名直白 │ ├── views.py # 视图逻辑重点包含submit_problem/submit_code/judge_result等核心函数 │ ├── urls.py # 路由映射/problems/ → problem_list, /submit/1001/ → submit_view │ ├── tasks.py # 判题任务实现关键用threading.Thread模拟判题机含超时控制、沙箱隔离 │ └── templatetags/ # 自定义模板标签如format_time显示“2小时30分钟前” ├── .idea/ # PyCharm配置可删不影响运行但保留方便IDE识别项目结构 └── Dmj5QlcgWApSCYnL9RH3-master-cf1bb5a2a3cc765ea4686b333b4e6b5c150db593/ # 备份分支Git commit hash命名防误操作覆盖主代码特别注意repository/和competition_platform/models.py的联动设计-models.Problem表中code_path字段存储的是相对路径如1001_hello_world而非绝对路径-tasks.py中判题时通过os.path.join(settings.REPOSITORY_ROOT, problem.code_path)拼接出真实路径确保跨平台兼容Windows/Linux路径分隔符自动处理- 每道题的test_cases/目录下input*.txt和output*.txt严格一一对应判题脚本按数字序号顺序读取input1.txt→output1.txt→input2.txt→output2.txt…避免文件名乱序导致测试错位。2.3 权限分级与安全边界设计蓝桥杯平台必须区分三类角色普通学生只能提交、查看自己记录、教师可管理题目、审核提交、超级管理员可操作所有数据。本项目用Django原生权限系统实现不造轮子但做了关键增强用户模型扩展competition_platform/models.py中UserProfile继承AbstractUser新增role字段STUDENT1,TEACHER2,ADMIN3并在save()方法中强制同步is_staff和is_superuser标志位——教师登录后台自动获得is_staffTrue但is_superuserFalse无法删除其他教师账户。视图级权限控制views.py中所有敏感操作都加装饰器例如python user_passes_test(lambda u: u.userprofile.role UserProfile.TEACHER) def problem_create(request): # 只有教师及以上能创建题目模板级动态渲染web/templates/base.html中用{% if user.userprofile.role 2 %}控制后台入口按钮显示避免前端隐藏但后端未校验的安全漏洞。判题沙箱隔离tasks.py中执行学生代码时使用subprocess.run()配合timeout参数默认3秒并设置cwd为临时目录、env清空系统环境变量、stdout/stderr重定向到内存缓冲区——即使学生提交import os; os.system(rm -rf /)也只会在临时目录里删空自己生成的文件宿主机毫发无损。注意SQLite默认不支持行级锁但本项目通过select_for_update()在关键路径加锁。例如在views.submit_code中先Problem.objects.select_for_update().get(idpid)锁定题目记录再创建Submission防止同一题目被并发提交时计数错乱。实测在10并发下依然准确。3. 核心功能模块详解与实操要点3.1 题目组织逻辑如何让27道题“活”起来蓝桥杯真题有鲜明特征填空题只需输出答案字符串、编程题需完整代码、结果填空输出固定格式结果。本项目用Problem.type字段FILL1,CODE2,RESULT3区分并在前端problem_list.html中用不同图标标识。更关键的是测试用例组织方式填空题type1test_cases/下只放answer.txt内容为标准答案如2023。判题时直接比对submission.output.strip()和answer.txt.strip()编程题type2test_cases/下放input1.txt/output1.txt等成对文件。判题脚本逐个执行1. 将input1.txt内容写入临时文件stdin.txt2. 用python student_code.py stdin.txt stdout.txt 2 stderr.txt运行3. 比对stdout.txt和output1.txt忽略行末空格和换行符4. 若失败记录stderr.txt内容作为错误提示如IndexError: list index out of range结果填空type3类似填空题但允许答案有多种合法格式如2023或0x7E3。models.TestCase表中新增is_flexible布尔字段判题时调用utils.normalize_answer()统一转换转小写、去空格、标准化十六进制表示。实操时要注意repository/目录的维护规范- 新增题目必须创建独立子目录如1002_fibonacci目录名即题目ID-solution.py必须能独立运行并输出正确结果用于生成output*.txt- 测试用例数量建议3-5组首组为样例input1.txt内容即题目描述中的样例输入后续为边界测试空输入、极大值、负数等- 所有.txt文件用UTF-8编码Windows用户务必关闭记事本“ANSI”保存陷阱推荐用VS Code保存。3.2 用户权限管理从注册到角色切换的全流程注册流程刻意简化学生填学号自动转为用户名、姓名、密码即可无需邮箱验证蓝桥杯校内赛通常用学号唯一标识。但教师注册需额外步骤——registration/teacher_register.html中要求输入邀请码硬编码在settings.py的TEACHER_INVITE_CODE防止学生随意注册教师账号。邀请码验证逻辑在views.teacher_register中if request.POST.get(invite_code) ! settings.TEACHER_INVITE_CODE: messages.error(request, 邀请码错误) return redirect(teacher_register)登录后middleware.py中自定义中间件RoleBasedRedirectMiddleware接管跳转逻辑- 学生登录→重定向到/problems/题目列表- 教师登录→重定向到/admin/competition_platform/problem/题目管理后台- 超级管理员→重定向到Django原生/admin/。权限校验不依赖Session ID而是每次请求都查request.user.userprofile.role确保角色变更即时生效教师降级为学生后下次访问立即失去后台入口。3.3 题目提交与判题流程从点击“提交”到看到“AC”的全链路这是整个系统的心脏代码集中在views.submit_code和tasks.judge_submission。我们以提交一道编程题为例走一遍真实流程前端触发学生在problem_detail.html填写代码点击“提交”按钮AJAX发送POST请求到/submit/1001/携带code代码文本、language固定为python3后端接收views.submit_code验证用户登录态、题目存在性、代码非空创建Submission对象初始状态PENDING保存到数据库异步判题调用tasks.judge_submission.delay(submission_id)注意这里用.delay()而非.run()启动新线程沙箱执行tasks.judge_submission中- 创建临时目录/tmp/judge_123456/123456为Submission ID- 将学生代码写入/tmp/judge_123456/code.py- 遍历Problem.testcase_set.all()对每组测试用例复制input*.txt到临时目录执行python code.py input1.txt output.txt 2 error.txt设timeout3若超时状态设为TIME_LIMIT_EXCEEDED跳出循环若error.txt非空状态设为RUNTIME_ERROR内容存入submission.error_message若output.txt与output*.txt不匹配状态设为WRONG_ANSWER全部通过则设为ACCEPTED结果回写更新Submission.status、Submission.output、Submission.error_message、Submission.execute_time毫秒级触发post_save信号通知前端轮询前端轮询problem_detail.js每2秒GET/status/123456/直到状态变为非PENDING然后刷新结果区域。实操心得判题超时阈值设为3秒是经过实测的平衡点。蓝桥杯Python组真题中95%的AC代码在1秒内完成3秒足够覆盖所有边界情况又避免恶意死循环拖垮线程。若需调整在tasks.py第47行修改TIMEOUT_SECONDS 3即可。3.4 前端静态资源web目录的深度定制技巧web/目录不是简单的HTML堆砌而是针对编程练习场景做了针对性优化代码编辑器web/js/editor.js基于Monaco Editor轻量封装非完整版仅保留必要API关键配置javascript monaco.editor.create(document.getElementById(editor), { value: // 在此编写代码, language: python, theme: vs-dark, fontSize: 14, minimap: { enabled: false }, // 关闭缩略图节省性能 automaticLayout: true, tabSize: 4, insertSpaces: true, wordWrap: on, // 长代码自动换行 fontFamily: Monaco, Consolas, monospace // 确保MONACO.TTF生效 });字体文件MONACO.TTF放在项目根目录CSS中通过font-face引入避免CDN加载失败导致编辑器字体异常。题目描述渲染web/templates/problem_detail.html中题目描述字段problem.description存的是Markdown文本如## 输入格式\n\n第一行输入一个整数n...用django-markdown-deux库渲染但禁用了script标签解析防止XSS攻击。响应式布局web/css/style.css中题目列表页在手机端自动折叠侧边栏代码编辑器高度设为calc(100vh - 200px)确保小屏设备也能看到完整编辑区。定制时只需改web/下对应文件无需碰Django后端——比如想加“代码格式化”按钮只需在editor.js里加一行editor.getAction(editor.action.formatDocument).run()调用想换主题色改style.css里.btn-primary的background-color即可。4. 本地运行与二次开发实操指南4.1 一键启动从解压到首页的90秒实录我用一台2018款MacBook Proi5/8GB实测步骤如下Windows用户路径分隔符自动适配解压unzip bluebridge-platform.zip耗时约5秒创建虚拟环境python -m venv venv source venv/bin/activatemacOS/Linux或venv\Scripts\activate.batWindows安装依赖pip install -r requirements.txt耗时约40秒Django下载较大迁移数据库python manage.py migrate耗时约3秒SQLite建表极快创建超级管理员python manage.py createsuperuser输入用户名/邮箱/密码约10秒启动服务python manage.py runserver终端输出Starting development server at http://127.0.0.1:8000/耗时2秒浏览器访问打开http://127.0.0.1:8000/首页加载完成约5秒。此时你已看到完整的题目列表页点击任意题目可进入编辑器提交。整个过程无需修改任何代码也不需要安装额外软件Python 3.8已满足所有依赖。注意首次运行时db.sqlite3里已有预置数据但repository/目录权限需确认。Linux/macOS用户若遇Permission denied执行chmod -R 755 repository/Windows用户请确保目录未被杀毒软件锁定。4.2 题目增删改教师专属的5分钟定制法假设你要加入一道新题“求阶乘”ID设为1003创建题目目录mkdir repository/1003_factorial准备测试用例-echo 5 repository/1003_factorial/test_cases/input1.txt-echo 120 repository/1003_factorial/test_cases/output1.txt-echo 0 repository/1003_factorial/test_cases/input2.txt-echo 1 repository/1003_factorial/test_cases/output2.txt编写参考答案repository/1003_factorial/solution.py内容为python n int(input()) ans 1 for i in range(1, n1): ans * i print(ans)Django后台添加登录http://127.0.0.1:8000/admin/进入“Problems” → “Add Problem”填写- Title:求阶乘- Description:输入一个正整数n输出n的阶乘。支持Markdown- Type:编程题- Code Path:1003_factorial必须与目录名一致- Time Limit:3000毫秒- Memory Limit:65536KB保存后题目立即出现在/problems/列表中。删除题目更简单后台勾选题目→“删除所选题目”系统自动清理repository/对应目录通过pre_delete信号监听实现。4.3 判题逻辑扩展支持Java/C的三步改造虽然当前只支持Python但扩展其他语言只需改三处新增语言选项在models.Submission中language字段改为CharField(choices[(python3,Python 3),(java,Java),(cpp,C)])判题脚本适配tasks.judge_submission中根据submission.language选择执行命令python if submission.language java: cmd [java, -cp, /tmp/judge_123456/, Main] elif submission.language cpp: cmd [./a.out] else: # python3 cmd [python, code.py]编译前置步骤对Java/C在执行cmd前插入编译逻辑- Javajavac /tmp/judge_123456/Main.java要求学生代码类名为Main- Cg -o /tmp/judge_123456/a.out /tmp/judge_123456/code.cpp需系统预装g。提示扩展C支持时务必在settings.py中设置COMPILER_TIMEOUT 10编译超时10秒避免恶意#include bits/stdc.h导致编译卡死。4.4 常见问题与排查技巧实录Q1启动时报错django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but the setting is not configured.原因settings.py中DATABASES配置被意外注释或修改。排查检查settings.py第82行附近确保有DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } }修复恢复该段配置或运行python manage.py migrate重新生成db.sqlite3。Q2提交后状态一直卡在“判题中”前端轮询无响应原因tasks.py中判题线程被阻塞常见于测试用例文件编码错误或路径不存在。排查- 查看终端runserver日志是否有OSError: [Errno 2] No such file or directory- 进入repository/确认题目ID目录存在且test_cases/下文件名严格匹配input*.txt/output*.txt- 用ls -l repository/1001_hello_world/test_cases/检查文件权限应为-rw-r--r--。修复修正路径或重新生成测试用例文件。Q3编辑器显示方块字Monaco字体未生效原因浏览器未加载MONACO.TTF或CSS中font-family未正确引用。排查- 浏览器开发者工具→Network→FilterMONACO确认字体文件返回200- 检查web/css/style.css中font-face规则是否被注释- Windows用户确认MONACO.TTF文件属性→“常规”→“安全”→“允许”已勾选。修复重启服务器清除浏览器缓存CtrlF5强制刷新。Q4教师登录后看不到后台入口按钮原因用户role字段未正确设置为TEACHER。排查- 进入Django shellpython manage.py shell- 执行from competition_platform.models import UserProfile; u UserProfile.objects.get(user__usernameteacher1); print(u.role)修复若输出1学生执行u.role 2; u.save()。Q5SQLite数据库损坏报错database disk image is malformed原因强制关机或runserver进程被kill -9导致SQLite写入中断。修复- 备份原db.sqlite3cp db.sqlite3 db.sqlite3.bak- 下载sqlite3命令行工具官网sqlite.org/download.html- 执行sqlite3 db.sqlite3 .dump | sqlite3 db_new.sqlite3导出再导入- 替换mv db_new.sqlite3 db.sqlite3。实操心得我踩过的最大坑是Windows路径分隔符。某次在tasks.py中用os.path.join(repository, pid, test_cases)拼路径结果生成repository\1001\test_cases而subprocess.run()在Windows下认\为转义符导致找不到目录。解决方案是统一用pathlib.PathPath(settings.REPOSITORY_ROOT) / pid / test_cases自动处理跨平台路径。5. 从练习平台到教学工具的延伸思考这套代码的价值远不止于“能跑”。去年我带校队时把它变成了活的教学工具-调试教学让学生提交故意写错的代码如for i in range(n)漏写1然后带他们看/admin/里对应的Submission.error_message直观理解“索引越界”在真实判题环境中的表现-性能分析在tasks.py里加一行print(fExecution time: {end-start:.2f}s)让学生对比递归阶乘和迭代阶乘的执行时间理解算法复杂度差异-安全意识培养故意在solution.py里写os.system(ls -la)演示判题沙箱如何拦截危险调用比讲一百遍“不要执行系统命令”都管用。它不追求成为下一个Codeforces而是牢牢钉在“让每个学生今天就能开始刷题”这个最小可行目标上。当你看到学生第一次提交后屏幕弹出绿色的“AC”那种兴奋感就是这套代码存在的全部意义。最后分享个小技巧如果学生抱怨“题目太难”别急着换题打开repository/里对应题目的solution.py把关键算法步骤替换成# TODO: 请在这里填写你的代码瞬间变成引导式编程练习——这才是蓝桥杯备赛该有的样子。本文还有配套的精品资源点击获取简介一套开箱即用的蓝桥杯风格Python编程竞赛平台源码基于Django框架构建内置已初始化的SQLite数据库db.sqlite3包含完整前端页面资源web目录、题目代码仓库repository、Monaco字体文件MONACO.TTF及标准Django管理脚本manage.py。项目结构清晰competition_platform为应用主模块.idea为PyCharm配置支持一键启动本地服务。功能覆盖用户注册登录、题目浏览与提交、模拟判题逻辑、权限分级如管理员/普通用户、题型分类组织等典型竞赛平台能力。配套代码经过实际验证无需修改即可运行适合高校学生赛前练习、教学演示或二次开发参考。requirements.txt列明全部依赖环境适配简单部署门槛低本地调试友好。本文还有配套的精品资源点击获取