-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
89 lines (82 loc) · 3.46 KB
/
Copy pathapp.py
File metadata and controls
89 lines (82 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from flask import Flask, render_template, request
from flasgger import Swagger
from validator import validate_password
app = Flask(__name__)
# Swagger UI 초기화
swagger = Swagger(app)
PROFILE = {
"name": "장성욱",
"tagline": "Computer Science Student & Developer",
"description": "경북대학교 컴퓨터학부 학생으로, 다양한 분야의 프로젝트를 경험하고 있습니다. GPU 공유 시스템, GStreamer 비디오 처리 등 실무 중심의 프로젝트를 진행했습니다.",
"education": "경북대학교 컴퓨터학부",
"interests": "Backend Development, System Programming, AI",
"goals": "성능과 효율성을 고려한 시스템 개발자가 되는 것",
"email": "your.email@example.com",
"github": "https://github.com/SungWookJang8440",
"github_username": "SungWookJang8440",
}
PROJECTS = [
{
"title": "GStreamer Video Analyzer",
"description": "축구 경기 영상에서 태클 장면을 자동으로 감지하고 분석하는 비디오 처리 시스템.",
"tech_stack": ["C", "GStreamer"],
"emoji": "⚽",
"github": "https://github.com/video-ai-2025/summer2025-team1",
"demo": None
},
{
"title": "MLOPS_Image_Clustering",
"description": "MLOPS 이미지 클러스터링",
"tech_stack": ["Node.js", "Docker", "python"],
"emoji": "🧮",
"github": "https://github.com/sang-hash/data-model",
"demo": None
}
]
@app.route("/")
def index():
"""메인 홈페이지 렌더링
사용자의 프로필과 프로젝트 목록을 포함한 메인 페이지를 반환합니다.
"""
return render_template("index.html", **PROFILE, projects=PROJECTS)
@app.route("/profile")
def profile():
"""프로필 페이지 렌더링
"""
return render_template("index.html", **PROFILE, projects=PROJECTS)
@app.route("/register", methods=['GET', 'POST'])
def register():
"""비밀번호 안전성 검증 API
사용자가 입력한 비밀번호가 보안 규칙(길이, 숫자, 대문자)을 충족하는지 검증합니다.
---
tags:
- Authentication
parameters:
- name: pw
in: formData
type: string
required: true
description: 검증할 비밀번호 (8자 이상, 대문자 및 숫자 포함)
responses:
200:
description: 비밀번호 검증 결과 (안전함 또는 실패 원인 반환)
"""
if request.method == 'POST':
pwd = request.form.get('pw')
result = validate_password(pwd)
if result["is_valid"]:
return f"입력하신 비밀번호는 아주 안전합니다! (서버 검증 통과) <br><br><a href='/register'>다시 테스트하기</a>"
else:
return f"비밀번호 검증 실패!<br>원인: {result['reasons']} <br><br><a href='/register'>돌아가기</a>"
else:
return '''
<h3>관리자 회원가입 (비밀번호 검증 테스트)</h3>
<form method="POST" action="/register">
<label>비밀번호 입력 : </label>
<input type="password" name="pw" required minlength="8" placeholder="8자 이상, 대문자/숫자 포함">
<button type="submit">서버로 전송</button>
</form>
<p>※ 클라이언트 검증: 8자 미만 입력 시 브라우저가 자체적으로 경고를 띄웁니다.</p>
'''
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)