3 Star 12 Fork 2

X.U. / NJUST_HomeworkCollector

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

环境需求

  • Linux(包括Windows下的WSL/WSL2)
    Windows系统也可以使用Cygwin,已测试✅
  • Python3

功能介绍

这是一个基于Python Flask框架编写的Web应用,用于收集课程的班级作业。

本App使用Nginx配合uWSGI作为Web服务器,同时使用Supervisor对uWSGI进行管理。Nginx只响应从指定端口进入的请求,因此服务可以比较安全地挂在公网上。国内很多云服务提供商都有云服务器免费体验的活动,虽然配置不高,但运行该应用(收集一个班的作业)完全足够。
项目的Nginx配置中采取了限流措施,当Nginx服务器触发限流时,网页会返回503错误,此时可以刷新网页重试。此外,脚本和uWSGI的配置文件中设置了服务的进程数和线程数,可以自行修改。

同学们通过网站上传文件后,项目根目录下会多出uploads/database/目录。其中uploads/x目录存放了第x次提交作业的所有提交文件,而database/x目录存放着第x次提交作业的所有提交记录。

整体结构如下图所示:
结构图

网页运行图(PC端/移动端):
网页预览图

安装方法

1. 创建一个Python虚拟环境

(也可以不使用虚拟环境,但建议在虚拟环境中操作)

pip3 install virtualenv
virtualenv ~/app_env  # 虚拟环境的路径和名称也可以自己指定
cd ~/app_env
source bin/activate  # 激活该虚拟环境,激活成功后命令行会出现 (app_env) 字样

若之后想要取消激活,直接在命令行输入deactivate命令即可。

2. 安装Nginx, uWSGI, uwsgitop和Supervisor

  • Linux:
    (CentOS可以使用yum安装Nginx)
sudo apt update
sudo apt install nginx
pip3 install uwsgi uwsgitop supervisor
  • Cygwin:
    首先安装Nginx,Cygwin安装Nginx的步骤见此
    接着,使用apt-cyg或者原生的包管理器安装python3-devellibintl-devel包。下一步安装过程中,编译whl文件时需要用到。
    最后,安装uWSGI, uwsgitop和Supervisor:
pip3 install uwsgi uwsgitop supervisor

3. 下载本项目到虚拟环境目录;安装Python依赖包

git clone https://github.com/NewComer00/NJUST_HomeworkCollector.git ./app
cd app
pip3 install -r requirements.txt

4. 给“应用管理”脚本添加执行权限

chmod +x app_manager.sh

使用方法

⚠️⚠️⚠️若使用了虚拟环境,请先确保虚拟环境已经激活⚠️⚠️⚠️
觉得麻烦的话,可以将激活环境命令加入app_manager脚本export APP_ROOT=...这行之后:

source ${APP_ROOT}/../bin/activate
  • Cygwin:
    app_manager.sh脚本用到了envsubst命令,Cygwin需要安装gettext包来获取这个命令。

启动应用

./app_manager.sh [options] start

启动命令示例,请不要使用sudo。第一次运行时大概率会报错,不用惊慌,请查看下文“可能出现的问题”:

./app_manager.sh -n 0 -b "测试提交页面" -p 8080 start

⚠️注:

  1. [options]必须放在start等命令之前才会生效。
  2. [options]代表可选参数,具体如下:
    -n <数字><数字>表示这是<第几次>交作业,如1表示第一次。该参数的默认值为1
    -b <字符串><字符串>作为网页的<一级标题>。该参数的默认值为"2021 云数据管理课程"
    -p <数字><数字>表示网页服务所在的<端口号>。该参数的默认值为8080

启动后可以在浏览器中访问网站:

http://<机器的ip地址>:<端口号>/

❓可能出现的问题:

  1. 由于我们之前安装Python包等操作是在普通用户下进行的,./app_manager.sh请一样通过普通用户执行,不需要使用sudo ./app_manager.sh。使用sudo会找不到之前安装的Python包。如执行./app_manager.sh start命令后提示文件无法打开、Permission denied等问题,请参考下一条解决。
  2. 在执行start命令后,Nginx可能会提示一些文件或目录无法找到。如果提示以[alert]开头,这只是一个警告,Nginx正常启动,可以不用管它。如果提示以[emerg]开头,代表这是一个紧急情况,Nginx启动失败,需要根据错误提示操作,比如手动创建那些未找到的文件或目录(如确有需要,可以放宽新建文件的访问权限)。
  3. 上传文件后,项目根目录下会多出uploads/database/目录。uploads/x目录存放了第x次提交作业的文件,database/x目录存放着第x次提交作业的提交记录,x为启动时用-n指定的数字。
  4. 若提交文件后出现CSRF token invalid 报错横幅,表示当前页面的CSRF令牌已经过期,刷新一下页面,重新提交即可。

关闭应用

./app_manager.sh stop

执行后,关闭所有相关进程。

重启应用

在应用已经启动的情况下,若应用的源码或者配置被修改,可以执行重启操作来使改动生效:

./app_manager.sh [options] restart

⚠️注:重启操作必须在应用已经启动的情况下才能正确执行。可以通过top -U <用户名>的方式查看用户当前运行进程。

日志与监控

应用启动后,Nginx, uWSGI和Supervisor的运行日志位于logs/目录下,在应用无法正常运行时可供参考。
Python程序本身的输出和报错不在命令行显示,被重定向并保存至uWSGI相关的日志中。在Nginx和uWSGI的日志中可以查看服务器收到的请求信息。

使用uwsgitop可以查看当前网站服务的负载情况,监控端口在uWSGI的配置文件中默认为5001:

uwsgitop http://localhost:5001/

附录

Cygwin安装Nginx

  1. 以管理员身份运行Cygwin。

  2. 使用apt-cyg或者原生的包管理器安装cygrunsrvnginx包。

  3. 执行cygserver-config命令,在交互时输入yes

  4. 安装Nginx的后台程序:

/etc/rc.d/init.d/nginx install

可能会提示一些路径不存在,但只要最后输出“done”,即表示成功。

  1. 安装好的后台程序位于/usr/sbin/nginx
    /usr/sbin添加至Cygwin的环境变量:
export PATH="$PATH:/usr/sbin"
# 这是临时方法,为避免麻烦可以考虑将这句加入app_manager脚本开头
  1. 运行帮助指令:
nginx -h

若正常输出版本信息和帮助信息,即安装成功。

参考:https://www.cnblogs.com/lantor/p/13829773.html

MIT License Copyright (c) 2021 NewComer00 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

作业提交系统——这是一个基于Python Flask框架编写的Web应用,用于收集班级作业。 展开 收起
Python 等 3 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Python
1
https://gitee.com/xu_wanghao/NJUST_HomeworkCollector.git
git@gitee.com:xu_wanghao/NJUST_HomeworkCollector.git
xu_wanghao
NJUST_HomeworkCollector
NJUST_HomeworkCollector
main

搜索帮助