隨著編程教育的普及,在線代碼測評系統成為學習者和企業的重要工具。本文將詳細介紹如何使用輕量級框架Flask和關系型數據庫MySQL,開發一個功能完整的在線Python測評網站。
一、項目概述與技術選型
在線測評網站的核心功能包括用戶注冊登錄、題目管理、代碼提交、自動評測和結果展示。Flask作為Python輕量級Web框架,具有靈活、易擴展的特點,適合快速開發原型。MySQL則提供穩定的數據存儲,用于管理用戶信息、題目數據和提交記錄。
二、環境搭建與項目結構
首先確保安裝Python 3.x、Flask和MySQL數據庫。使用虛擬環境隔離依賴,通過pip安裝Flask、Flask-SQLAlchemy、Flask-Login、Flask-WTF等擴展庫。項目目錄結構建議如下:
- app/: 主應用目錄
- templates/: 存放Jinja2模板文件
- static/: 存放CSS、JavaScript等靜態資源
- models.py: 定義數據模型
- views.py: 處理路由和視圖邏輯
- forms.py: 定義表單類
- config.py: 配置文件
- run.py: 應用啟動入口
三、數據庫設計與模型實現
使用Flask-SQLAlchemy操作MySQL,定義核心數據模型:
1. User模型:存儲用戶ID、用戶名、密碼哈希、郵箱等。
2. Problem模型:包含題目ID、標題、描述、輸入輸出示例、測試用例等。
3. Submission模型:記錄用戶提交的代碼、提交時間、執行結果、得分等。
通過建立外鍵關聯,實現用戶與提交記錄、題目與提交記錄的一對多關系。
四、核心功能開發
1. 用戶認證模塊:利用Flask-Login實現用戶注冊、登錄、會話管理和權限控制。密碼采用Werkzeug的哈希加密,確保安全。
2. 題目管理模塊:提供管理員后臺,支持題目的增刪改查。前端使用富文本編輯器增強題目描述的表現力。
3. 代碼提交與評測模塊:用戶在前端編輯Python代碼并提交,后端使用subprocess模塊創建隔離環境執行代碼,與預期輸出對比,返回評測結果。考慮安全性,可使用Docker沙箱隔離代碼執行。
4. 結果展示模塊:實時顯示提交狀態(如等待、通過、錯誤),并生成個人成績排行榜。
五、前端界面與交互設計
使用Bootstrap框架快速構建響應式界面,通過Ajax實現代碼提交的異步處理,提升用戶體驗。主要頁面包括:
- 首頁:展示題目列表和系統公告
- 題目詳情頁:呈現題目內容和代碼編輯器
- 提交記錄頁:分頁顯示歷史提交及結果
- 排名頁:按通過題目數或得分排序的用戶榜單
六、安全與性能優化
1. 安全措施:防止SQL注入(使用ORM自動參數化)、XSS攻擊(模板轉義)、CSRF攻擊(Flask-WTF集成Token驗證)。
2. 性能優化:數據庫查詢使用索引,對頻繁訪問的題目列表進行緩存,評測任務采用Celery異步隊列避免阻塞請求。
七、部署與運維
使用Gunicorn或uWSGI作為WSGI服務器,Nginx做反向代理和靜態資源服務。MySQL配置連接池,定期備份數據。通過日志監控系統運行狀態,及時處理異常。
結語
通過本實戰項目,我們不僅掌握了Flask和MySQL的協同開發,還深入理解了在線評測系統的架構設計。未來可擴展支持多語言評測、實時在線IDE等功能,進一步提升系統的實用性和競爭力。代碼已開源至GitHub,供開發者參考與協作。