From 18e661ad68e23537a8fb1d2e603be39f92a4b198 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Tue, 15 Sep 2015 20:28:58 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E4=B8=BAUser=20=20=20problems=5Fstatus?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E7=B2=BE=E7=AE=80=E4=BA=86=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/migrations/0003_auto_20150915_2025.py | 19 +++++++++++++++++++ account/models.py | 3 +-- mq/scripts/info.py | 5 +---- problem/views.py | 2 +- submission/views.py | 5 +---- 5 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 account/migrations/0003_auto_20150915_2025.py diff --git a/account/migrations/0003_auto_20150915_2025.py b/account/migrations/0003_auto_20150915_2025.py new file mode 100644 index 00000000..ff6b0ea1 --- /dev/null +++ b/account/migrations/0003_auto_20150915_2025.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_user_problems_status'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='problems_status', + field=models.TextField(default=b'{}'), + ), + ] diff --git a/account/models.py b/account/models.py index 754e178d..32453336 100644 --- a/account/models.py +++ b/account/models.py @@ -31,8 +31,7 @@ class User(AbstractBaseUser): # 0代表不是管理员 1是普通管理员 2是超级管理员 admin_type = models.IntegerField(default=0) # JSON字典用来表示该用户的问题的解决状态 1为ac,2为正在进行 - problems_status = models.TextField(blank=True) - + problems_status = models.TextField(default="{}") USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] diff --git a/mq/scripts/info.py b/mq/scripts/info.py index 41a21273..9df03344 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -43,10 +43,7 @@ class MessageQueue(object): except User.DoesNotExist: logger.warning("Submission user does not exist, submission_id: " + submission_id) continue - if user.problems_status: - problems_status = json.loads(user.problems_status) - else: - problems_status = {} + problems_status = json.loads(user.problems_status) problems_status[str(problem.id)] = 1 user.problems_status = json.dumps(problems_status) user.save() diff --git a/problem/views.py b/problem/views.py index 84ca58d8..3b736c9f 100644 --- a/problem/views.py +++ b/problem/views.py @@ -282,7 +282,7 @@ def problem_list_page(request, page=1): except Exception: pass - if request.user.is_authenticated() and request.user.problems_status: + if request.user.is_authenticated(): problems_status = json.loads(request.user.problems_status) else: problems_status = {} diff --git a/submission/views.py b/submission/views.py index baa81d4d..aad15606 100644 --- a/submission/views.py +++ b/submission/views.py @@ -47,10 +47,7 @@ class SubmissionAPIView(APIView): except Exception: return error_response(u"提交判题任务失败") # 修改用户解题状态 - if request.user.problems_status: - problems_status = json.loads(request.user.problems_status) - else: - problems_status = {} + problems_status = json.loads(request.user.problems_status) problems_status[str(data["problem_id"])] = 2 request.user.problems_status = json.dumps(problems_status) request.user.save() From 83c356f0dbd4b5f6933cecd3bf29b1a546664d1f Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 09:18:41 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contest/views.py b/contest/views.py index 31a6c36c..97cca2cf 100644 --- a/contest/views.py +++ b/contest/views.py @@ -391,7 +391,7 @@ def _cmp(x, y): return -1 -def get_the_time_format(seconds): +def get_the_formatted_time(seconds): if not seconds: return "" result = str(seconds % 60) @@ -427,14 +427,14 @@ def contest_rank_page(request, contest_id): "first_achieved": status.first_achieved, "ac": status.ac, "failed_number": status.total_submission_number, - "ac_time": get_the_time_format(status.ac_time)}) + "ac_time": get_the_formatted_time(status.ac_time)}) if status.ac: result[i]["problems"][-1]["failed_number"] -= 1 except ContestSubmission.DoesNotExist: result[i]["problems"].append({}) result[i]["total_ac"] = submissions.filter(ac=True).count() result[i]["username"] = User.objects.get(id=result[i]["user_id"]).username - result[i]["total_time"] = get_the_time_format(submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]) + result[i]["total_time"] = get_the_formatted_time(submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]) result = sorted(result, cmp=_cmp, reverse=True) r.set("contest_rank_" + contest_id, json.dumps(list(result))) else: From 7f42ad70094fd17dd9ea167d89e714e20325928e Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 09:19:13 +0800 Subject: [PATCH 03/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=A1=B5=E9=9D=A2=E5=B0=81=E6=A6=9C=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index 2358b076..40b3c207 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -20,6 +20,8 @@ from utils.shortcuts import serializer_invalid_response, error_response, success from submission.models import Submission from .serializers import CreateContestSubmissionSerializer from submission.serializers import SubmissionSerializer +from oj.settings import REDIS_CACHE +import redis class ContestSubmissionAPIView(APIView): @@ -85,8 +87,25 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): except Contest.DoesNotExist: return error_page(request, u"比赛不存在") # 以下是本场比赛中所有的提交 - submissions = Submission.objects.filter(contest_id=contest_id). \ - values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + r = redis.Redis(host=REDIS_CACHE["host"], port=REDIS_CACHE["port"], db=REDIS_CACHE["db"]) + if contest.real_time_rank: + # 更新submissions缓存 + submissions = Submission.objects.filter(contest_id=contest_id). \ + values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", + "user_id").order_by("-create_time") + r.set("contest_submissions_" + contest_id, json.dumps(list(submissions))) + else: + # 已封榜 + submissions = r.get("contest_submissions_" + contest_id) + if submissions: + submissions = json.loads(submissions) + else: + submissions = [] + # 除了缓存里的还要加上封榜以后自己的提交 + submissions += Submission.objects.filter(contest_id=contest_id, user_id=request.user, cerate_time__gte=time). \ + values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", + "user_id").order_by("-create_time") + language = request.GET.get("language", None) filter = None if language: @@ -131,7 +150,7 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): return render(request, "oj/contest/submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "contest": contest, "filter":filter}) + "contest": contest, "filter": filter}) class ContestSubmissionAdminAPIView(APIView): From 03ef1e49f3faafbf6706caaec18b0f5d36821883 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 11:30:45 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E9=87=8C=E5=B0=81?= =?UTF-8?q?=E6=A6=9C=E7=9A=84=E8=A1=8C=E4=B8=BA=EF=BC=8C=E5=B0=81=E6=A6=9C?= =?UTF-8?q?=E4=BB=A5=E5=90=8E=E5=8F=AA=E6=98=BE=E7=A4=BA=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E6=8F=90=E4=BA=A4=E6=95=B0=E6=8D=AE=E5=92=8C?= =?UTF-8?q?=E5=B0=81=E6=A6=9C=E5=90=8E=E8=87=AA=E5=B7=B1=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=8C=E5=B0=81=E6=A6=9C=E4=BB=A5=E5=90=8Erank?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E5=88=B7=E6=96=B0=EF=BC=88rank=E9=87=8C?= =?UTF-8?q?=E8=BF=98=E4=B8=8D=E4=BC=9A=E6=98=BE=E7=A4=BA=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E5=B0=81=E6=A6=9C=E4=BB=A5=E5=90=8E=E7=9A=84=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E8=BF=99=E5=A5=BD=E5=83=8F=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9=E5=91=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index 40b3c207..aaa6c6e6 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -1,9 +1,11 @@ # coding=utf-8 import json +from datetime import datetime import redis +import pytz from django.shortcuts import render from django.core.paginator import Paginator - +from django.utils import timezone from rest_framework.views import APIView from judge.judger_controller.tasks import judge @@ -21,7 +23,6 @@ from submission.models import Submission from .serializers import CreateContestSubmissionSerializer from submission.serializers import SubmissionSerializer from oj.settings import REDIS_CACHE -import redis class ContestSubmissionAPIView(APIView): @@ -77,6 +78,20 @@ def contest_problem_my_submissions_list_page(request, contest_id, contest_proble {"submissions": submissions, "problem": contest_problem}) +def get_formatted_datetime(date_time): + date_time = timezone.localtime(date_time) + result = str(date_time.minute) + if date_time.minute < 10: + result = "0" + result + result = str(date_time.hour) + ":" + result + if date_time.hour < 10: + result = "0" + result + result = str(date_time.day) + u"日 " + result + result = str(date_time.month) + u"月" + result + result = str(date_time.year) + u"年" + result + return result + + @login_required def contest_problem_submissions_list_page(request, contest_id, page=1): """ @@ -93,18 +108,26 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): submissions = Submission.objects.filter(contest_id=contest_id). \ values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + # 把datetime类型转换为string + for submission in submissions: + submission["create_time"] = get_formatted_datetime(submission["create_time"]) r.set("contest_submissions_" + contest_id, json.dumps(list(submissions))) else: # 已封榜 submissions = r.get("contest_submissions_" + contest_id) if submissions: submissions = json.loads(submissions) + time = datetime.strptime(submissions[0]["create_time"].encode("utf8"), + '%Y\xe5\xb9\xb4%m\xe6\x9c\x88%d\xe6\x97\xa5 %H:%M') + time = time.replace(tzinfo=pytz.timezone('Asia/Shanghai')) else: submissions = [] + time = contest.start_time # 除了缓存里的还要加上封榜以后自己的提交 - submissions += Submission.objects.filter(contest_id=contest_id, user_id=request.user, cerate_time__gte=time). \ + self_submissions = Submission.objects.filter(contest_id=int(contest_id), user_id=request.user.id, create_time__gte=time). \ values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + submissions = list(self_submissions) + submissions language = request.GET.get("language", None) filter = None From 385f9d190ea3d94e44c4862667ca6cc543f95ee0 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 16 Sep 2015 20:32:00 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B2=A1=E7=94=A8?= =?UTF-8?q?=E7=9A=84=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/urls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/oj/urls.py b/oj/urls.py index eda20bb0..d9373bb9 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -25,7 +25,6 @@ from contest_submission.views import contest_problem_my_submissions_list_page urlpatterns = [ - url(r'^install/$', "install.views.install"), url("^$", "account.views.page_jump", name="page_jump_api"), url(r'^docs/', include('rest_framework_swagger.urls')), url(r'^admin/$', TemplateView.as_view(template_name="admin/admin.html"), name="admin_spa_page"), From f71adf163496524d452c145a8b38267ad351031f Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 09:14:44 +0800 Subject: [PATCH 06/22] fix typo --- contest/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contest/views.py b/contest/views.py index 5bb089bc..bef7bc75 100644 --- a/contest/views.py +++ b/contest/views.py @@ -451,5 +451,5 @@ def contest_rank_page(request, contest_id): {"contest": contest, "contest_problems": contest_problems, "result": result, "auto_refresh": request.GET.get("auto_refresh", None) == "true", - "show_real_name": result.GET.get("show_real_name", None) == "true", + "show_real_name": request.GET.get("show_real_name", None) == "true", "real_time_rank": contest.real_time_rank}) From 12e2c54aad20c2683d7a0dfed6f8bde3735e0b02 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 09:29:59 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E5=9C=A8=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=B8=AD=E5=8F=96=E6=95=B0=E6=8D=AE=E5=BA=93=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/judge/judger_controller/settings.py b/judge/judger_controller/settings.py index e141c525..6e24f590 100644 --- a/judge/judger_controller/settings.py +++ b/judge/judger_controller/settings.py @@ -4,9 +4,10 @@ 此文件包含 celery 的部分配置,但是 celery 并不是运行在docker 中的,所以本配置文件中的 redis和 MySQL 的地址就应该是 运行 redis 和 MySQL 的 docker 容器的地址了。怎么获取这个地址见帮助文档。测试用例的路径和源代码路径同理。 """ +import os # 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息 redis_config = { - "host": "192.168.42.23", + "host": os.environ.get("celery_redis_host"), "port": 6379, "db": 0 } @@ -30,7 +31,7 @@ log_dir = "/root/log/" # 存储提交信息的数据库,是 celery 使用的,与 oj.settings/local_settings 等区分,那是 web 服务器访问的地址 submission_db = { - "host": "192.168.42.32", + "host": os.environ.get("submission_db_host"), "port": 3306, "db": "oj_submission", "user": "root", From aa14962a8588ef67b701e11ee78d49beee4b4231 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 09:35:10 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A4=E9=A2=98?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/submission/views.py b/submission/views.py index baa81d4d..8f9e37d2 100644 --- a/submission/views.py +++ b/submission/views.py @@ -1,5 +1,6 @@ # coding=utf-8 import json +import logging import redis from django.shortcuts import render @@ -21,6 +22,9 @@ from .models import Submission from .serializers import CreateSubmissionSerializer, SubmissionSerializer, SubmissionhareSerializer +logger = logging.getLogger("app_info") + + class SubmissionAPIView(APIView): @login_required def post(self, request): @@ -44,7 +48,8 @@ class SubmissionAPIView(APIView): try: judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) - except Exception: + except Exception as e: + logger.error(e) return error_response(u"提交判题任务失败") # 修改用户解题状态 if request.user.problems_status: From e4533c9b76ffb41ccbb2d8b75989efa873d7c76f Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 09:44:31 +0800 Subject: [PATCH 09/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20redis=20=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/settings.py | 2 +- problem/views.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/judge/judger_controller/settings.py b/judge/judger_controller/settings.py index 6e24f590..4c155b54 100644 --- a/judge/judger_controller/settings.py +++ b/judge/judger_controller/settings.py @@ -7,7 +7,7 @@ import os # 这个redis 是 celery 使用的,包括存储队列信息还有部分统计信息 redis_config = { - "host": os.environ.get("celery_redis_host"), + "host": os.environ.get("REDIS_PORT_6379_TCP_ADDR"), "port": 6379, "db": 0 } diff --git a/problem/views.py b/problem/views.py index 84ca58d8..2e48b401 100644 --- a/problem/views.py +++ b/problem/views.py @@ -24,6 +24,7 @@ import logging logger = logging.getLogger("app_info") + def problem_page(request, problem_id): try: problem = Problem.objects.get(id=problem_id, visible=True) From 4bfdad10deb877b230487385177d8077466aa73b Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 10:15:05 +0800 Subject: [PATCH 10/22] =?UTF-8?q?submission=20=E8=BF=87=E6=BB=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index eb2caf13..59ee7fad 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -87,7 +87,10 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): except Contest.DoesNotExist: return error_page(request, u"比赛不存在") - submissions = Submission.objects.filter(contest_id=contest_id) + submissions = Submission.objects.filter(contest_id=contest_id).\ + values("id", "contest_id", "problem_id", "result", "create_time", + "accepted_answer_time", "language", "user_id").order_by("-create_time") + # 封榜的时候只能看到自己的提交 if not contest.real_time_rank: From 880a5139b229ef3ed91a68706d9ca966c3d79378 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Thu, 17 Sep 2015 10:24:01 +0800 Subject: [PATCH 11/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95=E6=98=AF=E5=90=A6=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E9=AA=8C=E8=AF=81=E7=A0=81=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/views.py | 27 +++++++++++++++++++++++++++ oj/urls.py | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/account/views.py b/account/views.py index 4aa326a9..9d1c8474 100644 --- a/account/views.py +++ b/account/views.py @@ -26,6 +26,14 @@ class UserLoginAPIView(APIView): serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): data = serializer.data + user = User.objects.get(username=data["username"]) + # 只有管理员才适用验证码登录 + if user.admin_type > 0: + if not "captcha" in data: + return error_response(u"请填写验证码!") + captcha = Captcha(request) + if not captcha.check(data["captcha"]): + return error_response(u"验证码错误") user = auth.authenticate(username=data["username"], password=data["password"]) # 用户名或密码错误的话 返回None if user: @@ -64,6 +72,9 @@ class UserRegisterAPIView(APIView): serializer = UserRegisterSerializer(data=request.data) if serializer.is_valid(): data = serializer.data + captcha = Captcha(request) + if not captcha.check(data["captcha"]): + return error_response(u"验证码错误") try: User.objects.get(username=data["username"]) return error_response(u"用户名已存在") @@ -206,3 +217,19 @@ class UserInfoAPIView(APIView): response_serializer: UserSerializer """ return success_response(UserSerializer(request.user).data) + + +class AccountSecurityAPIView(APIView): + def get(self, request): + """ + 判断用户登录是否需要验证码 + --- + """ + username = request.GET.get("username", None) + if username: + try: + User.objects.get(username=username, admin_type__gt=0) + except User.DoesNotExist: + return success_response({"applied_captcha":False}) + return success_response({"applied_captcha":True}) + return success_response({"applied_captcha":False}) \ No newline at end of file diff --git a/oj/urls.py b/oj/urls.py index eda20bb0..1b5d10e4 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -4,7 +4,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, - UserAdminAPIView, UserInfoAPIView) + UserAdminAPIView, UserInfoAPIView, AccountSecurityAPIView) from announcement.views import AnnouncementAdminAPIView @@ -116,4 +116,5 @@ urlpatterns = [ url(r'^api/submission/share/$', SubmissionShareAPIView.as_view(), name="submission_share_api"), url(r'^captcha/$', "utils.captcha.views.show_captcha", name="show_captcha"), + url(r'^api/account_security_check/$', AccountSecurityAPIView.as_view(), name="account_security_check"), ] From a3ff63aacfc590dc41b27f1d94054d18df008124 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Thu, 17 Sep 2015 10:25:02 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=99=BB=E5=BD=95=EF=BC=88=E5=8F=AA=E6=9C=89=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E9=9C=80=E8=A6=81=E9=AA=8C=E8=AF=81=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/serializers.py | 2 + static/src/js/app/oj/account/login.js | 45 +++++++++++++++++--- static/src/js/app/oj/account/register.js | 14 +++++- template/src/oj/account/change_password.html | 7 +-- template/src/oj/account/login.html | 1 + template/src/oj/account/register.html | 6 +++ 6 files changed, 65 insertions(+), 10 deletions(-) diff --git a/account/serializers.py b/account/serializers.py index 4cda3ae0..f60e9cac 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -7,6 +7,7 @@ from .models import User class UserLoginSerializer(serializers.Serializer): username = serializers.CharField(max_length=30) password = serializers.CharField(max_length=30) + captcha = serializers.CharField(required=False,min_length=4,max_length=4) class UsernameCheckSerializer(serializers.Serializer): @@ -22,6 +23,7 @@ class UserRegisterSerializer(serializers.Serializer): real_name = serializers.CharField(max_length=30) password = serializers.CharField(max_length=30, min_length=6) email = serializers.EmailField(max_length=254) + captcha = serializers.CharField(max_length=4, min_length=4) class UserChangePasswordSerializer(serializers.Serializer): diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js index 0a057627..32343c95 100644 --- a/static/src/js/app/oj/account/login.js +++ b/static/src/js/app/oj/account/login.js @@ -1,26 +1,31 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, csrfTokenHeader) { + var applied_captcha = false; $('form').validator().on('submit', function (e) { if (!e.isDefaultPrevented()) { var username = $("#username").val(); var password = $("#password").val(); + var ajaxData = {username: username, password: password}; + if (applied_captcha) { + ajaxData.captcha = $("#captcha").val(); + } $.ajax({ beforeSend: csrfTokenHeader, url: "/api/login/", - data: {username: username, password: password}, + data: ajaxData, dataType: "json", method: "post", success: function (data) { if (!data.code) { //成功登陆 var ref = document.referrer; - if(ref){ + if (ref) { // 注册页和本页的来源的跳转回首页,防止死循环 - if(ref.indexOf("register") > -1 || ref.indexOf("login") > -1){ + if (ref.indexOf("register") > -1 || ref.indexOf("login") > -1) { location.href = "/"; return; } // 判断来源,只有同域下才跳转 - if(ref.split("/")[2].split(":")[0] == location.hostname){ + if (ref.split("/")[2].split(":")[0] == location.hostname) { location.href = ref; return; } @@ -28,6 +33,7 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c location.href = "/"; } else { + refresh_captcha(); bsAlert(data.data); } } @@ -35,5 +41,34 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c }); return false; } - }) + }); + + $('#username').blur(function () { + if ($("#username").val()) { + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/account_security_check/?username=" + $("#username").val(), + method: "get", + success: function (data) { + if (!data.code) { + if (data.data.applied_captcha) { + $('#captcha-area').html('  

'); + applied_captcha = true; + } + else { + $('#captcha-area').html(''); + applied_captcha = false; + } + } + } + }); + } + }); + function refresh_captcha(){ + $("#captcha-img")[0].src = "/captcha/?" + Math.random(); + $("#captcha")[0].value = ""; + } + $("#captcha-img").click(function(){ + refresh_captcha(); + }); }); \ No newline at end of file diff --git a/static/src/js/app/oj/account/register.js b/static/src/js/app/oj/account/register.js index 9537fdbc..e5d22d5b 100644 --- a/static/src/js/app/oj/account/register.js +++ b/static/src/js/app/oj/account/register.js @@ -5,10 +5,11 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c var realName = $("#real_name").val(); var password = $("#password").val(); var email = $("#email").val(); + var captcha = $("#captcha").val(); $.ajax({ beforeSend: csrfTokenHeader, url: "/api/register/", - data: {username: username, real_name: realName, password: password, email: email}, + data: {username: username, real_name: realName, password: password, email: email, captcha:captcha}, dataType: "json", method: "post", success: function (data) { @@ -16,11 +17,20 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c window.location.href = "/login/"; } else { + refresh_captcha(); bsAlert(data.data); } } }); return false; } - }) + }); + function refresh_captcha() { + $("#captcha-img")[0].src = "/captcha/?" + Math.random(); + $("#captcha")[0].value = ""; + } + + $("#captcha-img").click(function () { + refresh_captcha(); + }); }); \ No newline at end of file diff --git a/template/src/oj/account/change_password.html b/template/src/oj/account/change_password.html index ab9200db..0ed8fdc0 100644 --- a/template/src/oj/account/change_password.html +++ b/template/src/oj/account/change_password.html @@ -21,9 +21,10 @@
- - - + +    +

+
diff --git a/template/src/oj/account/login.html b/template/src/oj/account/login.html index 5777fd3f..b09b0f1a 100644 --- a/template/src/oj/account/login.html +++ b/template/src/oj/account/login.html @@ -19,6 +19,7 @@
+
diff --git a/template/src/oj/account/register.html b/template/src/oj/account/register.html index ef242fb4..dd5f6719 100644 --- a/template/src/oj/account/register.html +++ b/template/src/oj/account/register.html @@ -31,6 +31,12 @@ placeholder="确认密码" data-match="#password" data-match-error="两个密码不一致" data-error="请填写确认密码" required>
+
+ +   

+ +
+
From 2b4ec339450408cebae6bfc16cebc5fdde1c5433 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Thu, 17 Sep 2015 10:53:33 +0800 Subject: [PATCH 13/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=94=A8=E6=88=B7=E5=90=8D=EF=BC=8C=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E5=B7=B2=E8=A2=AB=E6=B3=A8=E5=86=8C=E7=9A=84ajax?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/views.py | 48 ++++++++++++--------------- template/src/oj/account/register.html | 4 +-- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/account/views.py b/account/views.py index 9d1c8474..8a3414f3 100644 --- a/account/views.py +++ b/account/views.py @@ -5,15 +5,15 @@ from django.shortcuts import render from django.db.models import Q from rest_framework.views import APIView - +from rest_framework.response import Response from utils.shortcuts import serializer_invalid_response, error_response, success_response, paginate from utils.captcha import Captcha from .decorators import login_required from .models import User from .serializers import (UserLoginSerializer, UsernameCheckSerializer, - UserRegisterSerializer, UserChangePasswordSerializer, - EmailCheckSerializer, UserSerializer, EditUserSerializer) + UserRegisterSerializer, UserChangePasswordSerializer, + EmailCheckSerializer, UserSerializer, EditUserSerializer) class UserLoginAPIView(APIView): @@ -120,39 +120,35 @@ class UserChangePasswordAPIView(APIView): class UsernameCheckAPIView(APIView): - def post(self, request): + def get(self, request): """ - 检测用户名是否存在,存在返回True,不存在返回False + 检测用户名是否存在,存在返回状态码400,不存在返回200 --- - request_serializer: UsernameCheckSerializer """ - serializer = UsernameCheckSerializer(data=request.data) - if serializer.is_valid(): + username = request.GET.get("username", None) + if username: try: - User.objects.get(username=serializer.data["username"]) - return success_response(True) + User.objects.get(username=username) + return Response(status=400) except User.DoesNotExist: - return success_response(False) - else: - return serializer_invalid_response(serializer) + return Response(status=200) + return Response(status=200) class EmailCheckAPIView(APIView): - def post(self, request): + def get(self, request): """ - 检测邮箱是否存在,存在返回True,不存在返回False + 检测邮箱是否存在,存在返回状态码400,不存在返回200 --- - request_serializer: EmailCheckSerializer """ - serializer = EmailCheckSerializer(data=request.data) - if serializer.is_valid(): + email = request.GET.get("email", None) + if email: try: - User.objects.get(email=serializer.data["email"]) - return success_response(True) + User.objects.get(email=email) + return Response(status=400) except User.DoesNotExist: - return success_response(False) - else: - return serializer_invalid_response(serializer) + return Response(status=200) + return Response(status=200) class UserAdminAPIView(APIView): @@ -230,6 +226,6 @@ class AccountSecurityAPIView(APIView): try: User.objects.get(username=username, admin_type__gt=0) except User.DoesNotExist: - return success_response({"applied_captcha":False}) - return success_response({"applied_captcha":True}) - return success_response({"applied_captcha":False}) \ No newline at end of file + return success_response({"applied_captcha": False}) + return success_response({"applied_captcha": True}) + return success_response({"applied_captcha": False}) diff --git a/template/src/oj/account/register.html b/template/src/oj/account/register.html index dd5f6719..ccb09022 100644 --- a/template/src/oj/account/register.html +++ b/template/src/oj/account/register.html @@ -7,7 +7,7 @@
- +
@@ -17,7 +17,7 @@
- +
From 3d01918489e6ecdb9b3601b925103ea0f27fb5f8 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 11:18:11 +0800 Subject: [PATCH 14/22] =?UTF-8?q?pre=20=E7=9A=84=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/global.css | 1 + 1 file changed, 1 insertion(+) diff --git a/static/src/css/global.css b/static/src/css/global.css index 2d4f6181..3eebd701 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -41,4 +41,5 @@ label { pre { font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; + background-color: white; } From 878d71f60e99bb556936a31afe70b7ea1fe31d7b Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 11:18:38 +0800 Subject: [PATCH 15/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=20celery=20?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=20docker=20=E7=9A=84=E6=97=B6=E5=80=99=20can?= =?UTF-8?q?not=20enable=20tty=20mode=20on=20non=20tty=20input=20=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index d120ee34..45749829 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -11,7 +11,7 @@ from settings import docker_config, source_code_dir, test_case_dir, log_dir, sub @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): try: - command = "%s run -t -i --privileged --rm " \ + command = "%s run --privileged --rm " \ "--link mysql " \ "-v %s:/var/judger/test_case/ " \ "-v %s:/var/judger/code/ " \ From 3c1d256cc2855a842c639a71dafddf0f67730bad Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Thu, 17 Sep 2015 11:28:27 +0800 Subject: [PATCH 16/22] =?UTF-8?q?dev=E6=A0=87=E7=AD=BE=E6=9C=AA=E9=97=AD?= =?UTF-8?q?=E5=90=88=EF=BC=8C=E4=BF=AE=E5=A4=8D=EF=BC=8C=E6=95=B4=E7=90=86?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/contest/contest_problem.html | 166 +++++++++---------- 1 file changed, 78 insertions(+), 88 deletions(-) diff --git a/template/src/oj/contest/contest_problem.html b/template/src/oj/contest/contest_problem.html index 06dad2c6..69bec1e3 100644 --- a/template/src/oj/contest/contest_problem.html +++ b/template/src/oj/contest/contest_problem.html @@ -2,107 +2,97 @@ {% block body %}
- -

{{ contest_problem.title }}

+ +

{{ contest_problem.title }}

-

发布时间 : {{ contest_problem.create_time }}   - 时间限制 : {{ contest_problem.time_limit }}ms   - 内存限制 : {{ contest_problem.memory_limit }}M -

- -
-
- - -
{{ contest_problem.description|safe }}
-
-
- - -

{{ contest_problem.input_description }}

+

发布时间 : {{ contest_problem.create_time }}   + 时间限制 : {{ contest_problem.time_limit }}ms   + 内存限制 : {{ contest_problem.memory_limit }}M +

-
- + -

{{ contest_problem.output_description }}

+
{{ contest_problem.description|safe }}
- {% for item in samples %} -
- - 复制 -
-{{ item.input }}
+
+ -
-
+

{{ contest_problem.input_description }}

- -
-{{ item.output }}
-
- {% endfor %} - {% if problem.hint %} -
- - -

{{ contest_problem.hint|safe }}

-
- {% endif %} - {% if contest_problem.hint %} -
- - -
{{ contest_problem.hint|safe }}
-
- {% endif %} - - {% ifequal contest.status 0 %}
- -
- - - +
+ + +

{{ contest_problem.output_description }}

+ {% for item in samples %} +
+ + 复制 +
{{ item.input }}
+
+
+ +
{{ item.output }}
+
+ {% endfor %} + {% if problem.hint %} +
+ +

{{ contest_problem.hint|safe }}

+
+ {% endif %} + {% if contest_problem.hint %} +
+ +
{{ contest_problem.hint|safe }}
+
+ {% endif %} + {% ifequal contest.status 0 %} +
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+ {% endifequal %} + {% if show_warning %} + + {% endif %} +
+
+
- -
- - -
-
- -
- - - -
- {% endifequal %} - - {% if show_warning %} - - {% endif %} - -
-
{% endblock %} From 0f28c0e2ce3f0a65ce0c5d93ae7ca71bcef3080d Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 15:21:08 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20superivisord=20?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=BF=9B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {judge => dockerfiles/judger}/Dockerfile | 0 {judge => dockerfiles/judger}/sources.list | 0 .../oj_web_server/Dockerfile | 3 ++- dockerfiles/oj_web_server/gunicorn.conf | 16 ++++++++++++ dockerfiles/oj_web_server/mq.conf | 16 ++++++++++++ dockerfiles/oj_web_server/supervisord.conf | 26 +++++++++++++++++++ tools/celeryd.conf | 15 +++++++++++ tools/supervisord.conf | 26 +++++++++++++++++++ 8 files changed, 101 insertions(+), 1 deletion(-) rename {judge => dockerfiles/judger}/Dockerfile (100%) rename {judge => dockerfiles/judger}/sources.list (100%) rename Dockerfile => dockerfiles/oj_web_server/Dockerfile (85%) create mode 100644 dockerfiles/oj_web_server/gunicorn.conf create mode 100644 dockerfiles/oj_web_server/mq.conf create mode 100644 dockerfiles/oj_web_server/supervisord.conf create mode 100644 tools/celeryd.conf create mode 100644 tools/supervisord.conf diff --git a/judge/Dockerfile b/dockerfiles/judger/Dockerfile similarity index 100% rename from judge/Dockerfile rename to dockerfiles/judger/Dockerfile diff --git a/judge/sources.list b/dockerfiles/judger/sources.list similarity index 100% rename from judge/sources.list rename to dockerfiles/judger/sources.list diff --git a/Dockerfile b/dockerfiles/oj_web_server/Dockerfile similarity index 85% rename from Dockerfile rename to dockerfiles/oj_web_server/Dockerfile index 113ed588..f566796b 100644 --- a/Dockerfile +++ b/dockerfiles/oj_web_server/Dockerfile @@ -4,4 +4,5 @@ RUN mkdir -p /code/log /code/test_case /code/upload WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt -EXPOSE 8010 \ No newline at end of file +EXPOSE 8010 +CMD superivisord \ No newline at end of file diff --git a/dockerfiles/oj_web_server/gunicorn.conf b/dockerfiles/oj_web_server/gunicorn.conf new file mode 100644 index 00000000..1d784cd6 --- /dev/null +++ b/dockerfiles/oj_web_server/gunicorn.conf @@ -0,0 +1,16 @@ +[program:gunicorn] + +command=gunicorn oj.wsgi:application -b 0.0.0.0:8080 --reload + +directory=/root/qduoj/ +user=root +numprocs=1 +stdout_logfile=/root/log/gunicorn.log +stderr_logfile=/root/log/gunicorn.log +autostart=true +autorestart=true +startsecs=5 + +stopwaitsecs = 6 + +killasgroup=true \ No newline at end of file diff --git a/dockerfiles/oj_web_server/mq.conf b/dockerfiles/oj_web_server/mq.conf new file mode 100644 index 00000000..0460cba8 --- /dev/null +++ b/dockerfiles/oj_web_server/mq.conf @@ -0,0 +1,16 @@ +[program:mq] + +command=python manage.py runscript mq + +directory=/root/qduoj/ +user=root +numprocs=1 +stdout_logfile=/root/log/mq.log +stderr_logfile=/root/log/mq.log +autostart=true +autorestart=true +startsecs=5 + +stopwaitsecs = 6 + +killasgroup=true \ No newline at end of file diff --git a/dockerfiles/oj_web_server/supervisord.conf b/dockerfiles/oj_web_server/supervisord.conf new file mode 100644 index 00000000..1494d7cd --- /dev/null +++ b/dockerfiles/oj_web_server/supervisord.conf @@ -0,0 +1,26 @@ +[unix_http_server] +file=/tmp/supervisor.sock ; path to your socket file + +[supervisord] +logfile=/root/log/supervisord.log ; supervisord log file +logfile_maxbytes=50MB ; maximum size of logfile before rotation +logfile_backups=10 ; number of backed up logfiles +loglevel=info ; info, debug, warn, trace +pidfile=/root/log/supervisord.pid ; pidfile location +nodaemon=false ; run supervisord as a daemon +minfds=1024 ; number of startup file descriptors +minprocs=200 ; number of process descriptors +user=root ; default user +childlogdir=/root/log/ ; where child log files will live + + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock ; use unix:// schem for a unix sockets. + + +[include] + +files=*.conf \ No newline at end of file diff --git a/tools/celeryd.conf b/tools/celeryd.conf new file mode 100644 index 00000000..60e3fc21 --- /dev/null +++ b/tools/celeryd.conf @@ -0,0 +1,15 @@ +[program:celery] +command=celery worker -A judge.judger_controller --loglevel=DEBUG + +directory=/root/qduoj/ +user=root +numprocs=1 +stdout_logfile=/root/log/celery_worker.log +stderr_logfile=/root/log/celery_worker.log +autostart=true +autorestart=true +startsecs=5 + +stopwaitsecs = 6 + +killasgroup=true diff --git a/tools/supervisord.conf b/tools/supervisord.conf new file mode 100644 index 00000000..1494d7cd --- /dev/null +++ b/tools/supervisord.conf @@ -0,0 +1,26 @@ +[unix_http_server] +file=/tmp/supervisor.sock ; path to your socket file + +[supervisord] +logfile=/root/log/supervisord.log ; supervisord log file +logfile_maxbytes=50MB ; maximum size of logfile before rotation +logfile_backups=10 ; number of backed up logfiles +loglevel=info ; info, debug, warn, trace +pidfile=/root/log/supervisord.pid ; pidfile location +nodaemon=false ; run supervisord as a daemon +minfds=1024 ; number of startup file descriptors +minprocs=200 ; number of process descriptors +user=root ; default user +childlogdir=/root/log/ ; where child log files will live + + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock ; use unix:// schem for a unix sockets. + + +[include] + +files=*.conf \ No newline at end of file From 7f72e3f1b0e3136eebd5edcb1b007d357476a972 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 15:27:08 +0800 Subject: [PATCH 18/22] =?UTF-8?q?docker=20file=20=E4=B8=AD=20ADD=20?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=BD=BF=E7=94=A8=E4=B8=8A=E7=BA=A7=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt => dockerfiles/oj_web_server/requirements.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename requirements.txt => dockerfiles/oj_web_server/requirements.txt (100%) diff --git a/requirements.txt b/dockerfiles/oj_web_server/requirements.txt similarity index 100% rename from requirements.txt rename to dockerfiles/oj_web_server/requirements.txt From beb060bf632d17434460322ca771f3bf55bfc1cc Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 15:41:44 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A5=E5=BF=97=E8=B7=AF=E5=BE=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dockerfiles/oj_web_server/gunicorn.conf | 6 +++--- dockerfiles/oj_web_server/mq.conf | 6 +++--- dockerfiles/oj_web_server/supervisord.conf | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dockerfiles/oj_web_server/gunicorn.conf b/dockerfiles/oj_web_server/gunicorn.conf index 1d784cd6..60dcce12 100644 --- a/dockerfiles/oj_web_server/gunicorn.conf +++ b/dockerfiles/oj_web_server/gunicorn.conf @@ -2,11 +2,11 @@ command=gunicorn oj.wsgi:application -b 0.0.0.0:8080 --reload -directory=/root/qduoj/ +directory=/code/qduoj/ user=root numprocs=1 -stdout_logfile=/root/log/gunicorn.log -stderr_logfile=/root/log/gunicorn.log +stdout_logfile=/code/log/gunicorn.log +stderr_logfile=/code/log/gunicorn.log autostart=true autorestart=true startsecs=5 diff --git a/dockerfiles/oj_web_server/mq.conf b/dockerfiles/oj_web_server/mq.conf index 0460cba8..9dbce3e4 100644 --- a/dockerfiles/oj_web_server/mq.conf +++ b/dockerfiles/oj_web_server/mq.conf @@ -2,11 +2,11 @@ command=python manage.py runscript mq -directory=/root/qduoj/ +directory=/code/qduoj/ user=root numprocs=1 -stdout_logfile=/root/log/mq.log -stderr_logfile=/root/log/mq.log +stdout_logfile=/code/log/mq.log +stderr_logfile=/code/log/mq.log autostart=true autorestart=true startsecs=5 diff --git a/dockerfiles/oj_web_server/supervisord.conf b/dockerfiles/oj_web_server/supervisord.conf index 1494d7cd..12b36bef 100644 --- a/dockerfiles/oj_web_server/supervisord.conf +++ b/dockerfiles/oj_web_server/supervisord.conf @@ -2,16 +2,16 @@ file=/tmp/supervisor.sock ; path to your socket file [supervisord] -logfile=/root/log/supervisord.log ; supervisord log file +logfile=/code/log/supervisord.log ; supervisord log file logfile_maxbytes=50MB ; maximum size of logfile before rotation logfile_backups=10 ; number of backed up logfiles loglevel=info ; info, debug, warn, trace -pidfile=/root/log/supervisord.pid ; pidfile location +pidfile=/code/log/supervisord.pid ; pidfile location nodaemon=false ; run supervisord as a daemon minfds=1024 ; number of startup file descriptors minprocs=200 ; number of process descriptors user=root ; default user -childlogdir=/root/log/ ; where child log files will live +childlogdir=/code/log/ ; where child log files will live [rpcinterface:supervisor] @@ -23,4 +23,4 @@ serverurl=unix:///tmp/supervisor.sock ; use unix:// schem for a unix sockets. [include] -files=*.conf \ No newline at end of file +files=gunicorn.conf mq.conf \ No newline at end of file From b163664e9f83609ed4b972175a36cd46c9b7c2e9 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 15:42:38 +0800 Subject: [PATCH 20/22] fix typo --- dockerfiles/oj_web_server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/oj_web_server/Dockerfile b/dockerfiles/oj_web_server/Dockerfile index f566796b..07a73e9f 100644 --- a/dockerfiles/oj_web_server/Dockerfile +++ b/dockerfiles/oj_web_server/Dockerfile @@ -5,4 +5,4 @@ WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt EXPOSE 8010 -CMD superivisord \ No newline at end of file +CMD supervisord \ No newline at end of file From 07f87acae4bc89957213e574bcb361c5691b60a6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 16:07:53 +0800 Subject: [PATCH 21/22] =?UTF-8?q?=E5=A6=82=E6=9E=9C=20nodaemon=3Dtrue=20do?= =?UTF-8?q?cker=20=E4=BC=9A=E8=AE=A4=E4=B8=BA=E6=95=B4=E4=B8=AA=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E5=B7=B2=E7=BB=8F=E7=BB=93=E6=9D=9F=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dockerfiles/oj_web_server/supervisord.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/oj_web_server/supervisord.conf b/dockerfiles/oj_web_server/supervisord.conf index 12b36bef..420b65f4 100644 --- a/dockerfiles/oj_web_server/supervisord.conf +++ b/dockerfiles/oj_web_server/supervisord.conf @@ -7,7 +7,7 @@ logfile_maxbytes=50MB ; maximum size of logfile before rotation logfile_backups=10 ; number of backed up logfiles loglevel=info ; info, debug, warn, trace pidfile=/code/log/supervisord.pid ; pidfile location -nodaemon=false ; run supervisord as a daemon +nodaemon=true ; run supervisord as a daemon minfds=1024 ; number of startup file descriptors minprocs=200 ; number of process descriptors user=root ; default user From 2d1a95aa441f4d8a7680345ef17c7e9518ef8251 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 17 Sep 2015 16:11:14 +0800 Subject: [PATCH 22/22] fix typo --- dockerfiles/oj_web_server/gunicorn.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/oj_web_server/gunicorn.conf b/dockerfiles/oj_web_server/gunicorn.conf index 60dcce12..3ad64967 100644 --- a/dockerfiles/oj_web_server/gunicorn.conf +++ b/dockerfiles/oj_web_server/gunicorn.conf @@ -2,7 +2,7 @@ command=gunicorn oj.wsgi:application -b 0.0.0.0:8080 --reload -directory=/code/qduoj/ +directory=/code/ user=root numprocs=1 stdout_logfile=/code/log/gunicorn.log