基于Django的程序设计实践教学与竞赛平台
2019-05-07马嘉成朱雨许少钧唐川子
马嘉成 朱雨 许少钧 唐川子
摘要:随着互联网技术的发展,集处理数据分析数据为一体的互联网平台大行其道。Online Judge作为在线判题系统,为师生课后学习交流、竞赛练习,提供系统规范化的服务,成为学生学习的工具、教师教学的帮手。
1 引言
随着各种智能终端用户的增长和互联网技术的发展,各类大学online judge应运而生。最初使用于ACM-ICPC国际大学生程序设计竞赛和OI信息学奥林匹克竞赛中的自动判题和排名。现广泛应用于世界各地高校学生程序设计的训练、参赛队员的训练和选拔、各种程序设计竞赛以及数据结构和算法的学习和作业的自动提交判断中。其使学生和老师之间的教学互动更简单便捷,线上发布题目测试,成为学习方式新潮流,也增添了较多的学习乐趣,与未知的问题,奇怪的逻辑,繁杂的分支条件作斗争。
Online Judge系统是一个在线判题系统。通过接收用户提供的源代码,对其进行编译、运行,并与预先存放的测试数据或者测试用代码来验证其正确性。用户提交的代码一般会在限制条件下运行,包括时间限制、内存限制、安全权限限制等,用户可以选择在竞赛模式以及普通模式以达到在不同要求下完成程序的编写,程序判断结果由后端返回至用户界面。
本文介绍使用python的Django框架搭建OJ平台的方法。
2 Django框架搭建的Web平台
开发Web服务器所需要的MTV模式是由模型、控制器和视图这三层以松耦合方式连接在一起,其中模块负责对象与数据库的映射,视图负责用户与前端的交互,控制器则负责接收用户请求并调用相应的模型和视图来完成用户的请求。本文所述的系统中以OJ测评系统为其核心,包括用户管理模块、题库模块、测评数据模块、数据统计分析模块。
(1)用户管理模块:包括学生、教师、管理员不同等级的用户,各有不同的权限以及操作。学生可以做题并进行讨论,教师可以发布题目并得到学生作答的详细信息,管理员可以发布题目以及修改普通用户的信息。
(2)题库模块:完成题目的描述、测试数据、测试代码的添加、修改、删除等功能,以及对做题数据的数量、正确率等的统计。
(3)测评数据模块:OJ的核心内容,对用户提交的代码进行评测。
(4)数据分析模块:对正确率、错误原因进行统计和分析,并包括数据查重等功能。
3 OJ系统的搭建
Online Judge的实现,能很快地运用到现实的学习生活中去,有效的考核学生的真实水平,促使学生更好的学习计算机知识,强化学生的实践能力,给学生和老师带来立杆见影的效果;极大地提高了学生和老师双方面的效率,减轻了老师在实验教学管理上的负担。因此,并发这样一个面向程序设计语言初学者的Online Judge在线实些系统,是很有实际意义的。
3.1 OJ运行原理
用户提交的代码通过前端传给后端Docker所部署的GCC编译器中,并接收测试数据传人编译器中,将得到的数据与后端的正确数据进行比对并返回结果;或者接收测试代码,将随机的测试数据分别传人用户提交的代码以及测试代码中,比对两者是否一致并返回结果。如图一所示,其流程大致如下:
(1)从前端接收代码,创建一个Docker镜像,并将代码放入进行编译,如果代码有错误返回错误信息CompileError,编译通过则进行下一步。
(2)运行代码,传入测试数据,得到结果,如果有使用系统限制的函数则返回RestrictedFunction;如果有运行时错误,则返回运行错误RuntimeEorror,运行成功则进入下一步。
(3)提取运行时系统的数据,包括运行时间、使用内存大小、输出内容大小,如果不符合要求则分别返回TimeLimitError、MemoryLimitError、OutputLimitError,没有问题则进行下一步。
(4)将获得的数据与正确结果相比对,不相同则返回WrongAnswer,正确则返回AnswerCorrect。
OJ主要负责对用户代码的结果的检验,并返回正确或错误的信息,然而对于用户提交代码的安全性,是否提交了会使系统超时、内存溢出等问题的代码时,需要利用Docker的沙盒机制来保证这些代码不会给系统的正常运行造成影响。
3.2 OJ的沙盒机制
对于运行在服务器上的系统,系统的安全性是最重要的,不安全的系统对于系统的健全来说是致命的。如果从前端传入的代码通过获取非法的权限占用系统资源,破坏系统中存储的数据,结果将是毁灭性的,所以代码必须在安全可控的环境下面运行。
Docker利用Namespace实现了6项隔离,Docker在安全性上也做了很多工作,大致包括下面几个方面:
(1)Linux内核 Capability 能力限制
Docker支持为容器设置Capabilities,指定开放给容器的权限。这样在容器中的root用户比实际的root少很多权限。
(2)镜像签名机制
(3)Apparmor的MAC访问控制
Apparmor可以将进程的权限与进程Capabilities能力联系在一起,实现对进程的强制性访问控制(MAC)。在Docker中,我们可以使用Apparmor来限制用户只能执行某些特定命令、限制容器网络、文件读写权限等功能。
(4)Seccomp系統调用过滤
使用Seccomp可以限制进程能够调用的系统调用(system call)的范围,Docker提供的默认Seccomp配置文件已经禁用了大约44个超过300+的系统调用,满足大多数容器的系统调用诉求。
(5)User Namespace隔离
(6)SELinux
4 总结
本文所研发的教学与竞赛平台,体现了便携化、智能化的生活方式是社会发展的必然趋势,迎合了当前国家“互联网+教育”的号召。面向庞大的教育机构市场,多种校园化平台软件竞争激烈,高校迫切需要一个学生信息分析综合性、一站式平台我们力求做到人机交互友好,数据处理高效,功能全面便捷。本平台的核心竞争力在于身为大学生的我们能从学生的视角发掘问题,紧跟潮流。平台基于 Django 技术,实现跨平台,多终端的新型教务系统。切实方便学生生活,增强学习氛围,提高师生互动,丰富课余生活,促进大学生可持续全面发展;同时有利于学校教务管理、学工管理,加强学生评定和数据分析信息化建设,改善学风教风,增强软实力和竞争力。
参考文献
[1] 浅谈Docker安全性支持