view의 모든 기능
[공지사항] 지킬블로그 안내드립니다.
지킬 블로그에 대하여 알아보겠습니다.
1. 사용자 인증 관련 뷰
1.1 회원가입 뷰 (signup)
def signup(request):
if request.user.is_authenticated:
return redirect('/')
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
form = UserCreationForm()
return render(request, 'signup.html', {'form': form})
-
if request.user.is_authenticated:: 사용자가 이미 로그인되어 있는 경우 홈 페이지로 리디렉션합니다. -
if request.method == 'POST':-
POST 요청이 들어오면 사용자가 폼을 제출했다는 것을 의미합니다.
-
form = UserCreationForm(request.POST): 제출된 데이터를 사용해UserCreationForm인스턴스를 생성합니다. -
if form.is_valid():-
폼의 유효성을 검사합니다.
form.save(): 유효한 경우, 새 사용자를 데이터베이스에 저장합니다.username = form.cleaned_data.get('username'): 폼에서 사용자 이름을 가져옵니다.password = form.cleaned_data.get('password1'): 폼에서 비밀번호를 가져옵니다.user = authenticate(username=username, password=password): 사용자를 인증합니다.login(request, user): 인증된 사용자를 로그인 상태로 만듭니다.return redirect('/'): 홈 페이지로 리디렉션합니다.
-
else:-
GET 요청일 경우 빈 폼을 렌더링합니다.
form = UserCreationForm(): 빈 폼을 생성합니다.
return render(request, 'signup.html', {'form': form}): 폼을 포함한 회원가입 페이지를 렌더링합니다.
1.2 로그인 뷰 (signin)
def signin(request):
if request.user.is_authenticated:
return render(request, 'home.html')
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('/profile')
else:
return render(request, 'login.html', {'form': form, 'msg': 'Error Login'})
else:
form = AuthenticationForm()
return render(request, 'login.html', {'form': form})
-
if request.user.is_authenticated:: 사용자가 이미 로그인되어 있는 경우, 홈 페이지를 렌더링합니다. -
if request.method == 'POST':-
POST 요청이 들어오면 로그인 시도를 합니다.
-
form = AuthenticationForm(data=request.POST): 제출된 데이터를 사용해AuthenticationForm인스턴스를 생성합니다. -
if form.is_valid():-
폼이 유효한지 검사합니다.
user = form.get_user(): 인증된 사용자를 가져옵니다.login(request, user): 사용자를 로그인 상태로 만듭니다.return redirect('/profile'): 프로필 페이지로 리디렉션합니다.
else:: 폼이 유효하지 않으면 로그인 페이지를 렌더링하고 오류 메시지를 표시합니다.
-
else:-
GET 요청일 경우 빈 로그인 폼을 렌더링합니다.
form = AuthenticationForm(): 빈 로그인 폼을 생성합니다.
return render(request, 'login.html', {'form': form}): 로그인 폼을 포함한 로그인 페이지를 렌더링합니다.
1.3 로그아웃 뷰 (signout)
def signout(request):
logout(request)
return redirect('/')
logout(request): 현재 사용자의 세션을 종료하고 로그아웃합니다.return redirect('/'): 홈 페이지로 리디렉션합니다.
2. 이메일 관련 뷰
2.1 이메일 전송 뷰 (sendEmail)
def sendEmail(request):
if request.method == 'POST':
input_receiver = request.POST['inputReceiver']
input_title = request.POST['inputTitle']
input_content = request.POST['inputContent']
content = {'inputReceiver': input_receiver, 'inputTitle': input_title, 'inputContent': input_content}
msg_html = render_to_string('email_format.html', content)
msg = EmailMessage(subject=input_title, body=msg_html, from_email="example@example.com", to=[input_receiver])
msg.content_subtype = 'html'
try:
msg.send()
logger.debug("Email sent successfully")
except Exception as e:
logger.error("Error: unable to send email")
logger.error(e)
return HttpResponseRedirect(reverse('email'))
else:
return HttpResponseRedirect(reverse('email'))
-
if request.method == 'POST':-
POST 요청이 들어오면 이메일을 전송합니다.
-
input_receiver = request.POST['inputReceiver']: 수신자 이메일 주소를 가져옵니다. -
input_title = request.POST['inputTitle']: 이메일 제목을 가져옵니다. -
input_content = request.POST['inputContent']: 이메일 내용을 가져옵니다. -
content = {'inputReceiver': input_receiver, 'inputTitle': input_title, 'inputContent': input_content}: 이메일 내용으로 사용할 데이터를 준비합니다. -
msg_html = render_to_string('email_format.html', content): 이메일 내용을 HTML 형식으로 렌더링합니다. -
msg = EmailMessage(subject=input_title, body=msg_html, from_email="example@example.com", to=[input_receiver]):EmailMessage객체를 생성하여 이메일을 설정합니다. -
msg.content_subtype = 'html': 이메일 내용을 HTML로 설정합니다. -
try:-
이메일 전송을 시도합니다.
msg.send(): 이메일을 전송합니다.logger.debug("Email sent successfully"): 전송 성공을 로깅합니다.
-
except Exception as e:-
예외가 발생하면 오류를 로깅합니다.
logger.error("Error: unable to send email"): 오류 메시지를 로깅합니다.logger.error(e): 예외를 로깅합니다.
return HttpResponseRedirect(reverse('email')): 이메일 페이지로 리디렉션합니다.
else:: POST 요청이 아닌 경우 이메일 페이지로 리디렉션합니다.
3. 이미지 업로드 및 처리 관련 뷰
3.1 이미지 업로드 뷰 (upload_image)
def upload_image(request):
if request.method == 'POST':
form = ImageUploadForm(request.POST, request.FILES)
if form.is_valid():
name = form.cleaned_data['name']
image_data = form.cleaned_data['image'].read()
image_instance = ImageModel(name=name, image=image_data)
image_instance.save()
return redirect('image_success', image_id=image_instance.id)
else:
form = ImageUploadForm()
return render(request, 'upload.html', {'form': form})
-
if request.method == 'POST':-
POST 요청일 경우 이미지를 업로드합니다.
-
form = ImageUploadForm(request.POST, request.FILES): 제출된 데이터와 파일을 사용해 폼을 생성합니다. -
if form.is_valid():-
폼이 유효한지 검사합니다.
name = form.cleaned_data['name']: 폼에서 이름을 가져옵니다.image_data = form.cleaned_data['image'].read(): 폼에서 이미지 데이터를 읽습니다.image_instance = ImageModel(name=name, image=image_data):ImageModel인스턴스를 생성합니다.image_instance.save(): 이미지를 데이터베이스에 저장합니다.return redirect('image_success', image_id=image_instance.id): 이미지 성공 페이지로 리디렉션합니다.
-
else:-
GET 요청일 경우 빈 폼을 렌더링합니다.
form = ImageUploadForm(): 빈 폼을 생성합니다.
return render(request, 'upload.html', {'form': form}): 이미지 업로드 폼을 포함한 페이지를 렌더링합니다.
3.2 이미지 업로드 성공 뷰 (image_success)
def image_success(request, image_id):
image_record = get_object_or_404(ImageModel, id=image_id)
if image_record and image_record.image:
image_data = base64.b64encode(image_record.image).decode('utf-8')
else:
image_data = None
return render(request, 'success.html', {'image_data': image_data, 'name': image_record.name})
-
image_record = get_object_or_404(ImageModel, id=image_id): 주어진image_id로ImageModel객체를 조회하고, 없으면 404 오류를 반환합니다. -
if image_record and image_record.image:-
이미지가 존재하면,
image_data = base64.b64encode(image_record.image).decode('utf-8'): 이미지를 Base64로 인코딩하여 문자열로 변환합니다.
-
else:: 이미지가 없으면image_data를None으로 설정합니다. return render(request, 'success.html', {'image_data': image_data, 'name': image_record.name}): 성공 페이지를 렌더링합니다.
3.3 이미지 표시 뷰 (show_image)
def show_image(request):
image_record = ImageModel.objects.first() # 테스트를 위해 첫 번째 레코드 사용
if image_record:
image_data = base64.b64encode(image_record.image).decode('utf-8')
return render(request, 'success.html', {'image_data': image_data, 'name': image_record.name})
else:
return render(request, 'success.html', {'image_data': None, 'name': None})
-
image_record = ImageModel.objects.first():ImageModel에서 첫 번째 이미지를 가져옵니다. -
if image_record:-
이미지가 존재하면,
image_data = base64.b64encode(image_record.image).decode('utf-8'): 이미지를 Base64로 인코딩하여 문자열로 변환합니다.return render(request, 'success.html', {'image_data': image_data, 'name': image_record.name}): 성공 페이지를 렌더링합니다.
else:: 이미지가 없으면 빈 데이터로 성공 페이지를 렌더링합니다.
3.4 이미지 목록 조회 뷰 (image)
def image(request):
image_records = Images.objects.all()
if image_records.exists():
return render(request, 'images.html', {'image_data': image_records})
else:
return render(request, 'images.html', {'image_data_list': None})
-
image_records = Images.objects.all():Images모델에서 모든 레코드를 가져옵니다. -
if image_records.exists():-
이미지 레코드가 존재하면,
return render(request, 'images.html', {'image_data': image_records}): 이미지 목록을 포함한 페이지를 렌더링합니다.
else:: 이미지 레코드가 없으면 빈 목록으로 페이지를 렌더링합니다.
4. 기기 제어, 품질 검사, 로그 기록 페이지 뷰
4.1 기기 제어 페이지 뷰 (deviceState)
def deviceState(request):
return render(request, 'deviceState.html')
return render(request, 'deviceState.html'): 기기 제어 페이지를 렌더링합니다.
4.2 품질 검사 페이지 뷰 (qualityInspect)
def qualityInspect(request):
return render(request, 'qualityInspect.html')
return render(request, 'qualityInspect.html'): 품질 검사 페이지를 렌더링합니다.
4.3 로그 기록 페이지 뷰 (logRecord)
def logRecord(request):
return render(request, 'logRecord.html')
return render(request, 'logRecord.html'): 로그 기록 페이지를 렌더링합니다.
5. API 뷰
5.1 특정 이미지 조회 API (getTestDatas)
@api_view(['GET'])
def getTestDatas(request, id):
datas = Images.objects.get(id=id)
serializer = TestDataSerializer(datas, many=False)
return Response(serializer.data)
@api_view(['GET']): 이 뷰가 GET 요청을 처리한다는 것을 명시합니다.datas = Images.objects.get(id=id): 주어진id로Images모델의 객체를 조회합니다.serializer = TestDataSerializer(datas, many=False): 직렬화하여 JSON 형식으로 변환합니다.return Response(serializer.data): 직렬화된 데이터를 응답으로 반환합니다.
5.2 이미지 데이터 생성 API (createTestDatas)
@api_view(['POST'])
def createTestDatas(request):
serializer = TestDataSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
-
@api_view(['POST']): 이 뷰가 POST 요청을 처리한다는 것을 명시합니다. -
serializer = TestDataSerializer(data=request.data): POST 요청으로 받은 데이터를 직렬화합니다. -
if serializer.is_valid():-
직렬화된 데이터가 유효한지 검사합니다.
serializer.save(): 유효한 경우, 데이터를 데이터베이스에 저장합니다.return Response(serializer.data, status=201): 저장된 데이터를 응답으로 반환하고, HTTP 상태 코드 201을 반환합니다.
return Response(serializer.errors, status=400): 유효하지 않은 경우, 오류 정보를 응답으로 반환하고, HTTP 상태 코드 400을 반환합니다.
5.3 특정 날짜의 데이터 조회 API (getTestDate)
@api_view(['GET'])
def getTestDate(request):
datas = Images.objects.filter(Detection_Time__date=datetime(2024,7,18))
serializer = TestDataSerializer(datas, many=True)
return Response(serializer.data)
@api_view(['GET']): 이 뷰가 GET 요청을 처리한다는 것을 명시합니다.datas = Images.objects.filter(Detection_Time__date=datetime(2024,7,18)):Detection_Time이 2024년 7월 18일인Images모델의 객체를 조회합니다.serializer = TestDataSerializer(datas, many=True): 여러 개의 데이터를 직렬화합니다.return Response(serializer.data): 직렬화된 데이터를 응답으로 반환합니다.
5.4 주 단위 데이터 조회 API (getTestweek)
@api_view(['GET'])
def getTestweek(request):
today = datetime.now().date()
start_date = today - timedelta(days=6)
datas = Images.objects.filter(Detection_Time__date__range=(start_date, today))
serializer = TestDataSerializer(datas, many=True)
return Response(serializer.data)
@api_view(['GET']): 이 뷰가 GET 요청을 처리한다는 것을 명시합니다.today = datetime.now().date(): 현재 날짜를 가져옵니다.start_date = today - timedelta(days=6): 7일 전 날짜를 계산합니다.datas = Images.objects.filter(Detection_Time__date__range=(start_date, today)): 주어진 날짜 범위 내의Images모델의 객체를 조회합니다.serializer = TestDataSerializer(datas, many=True): 여러 개의 데이터를 직렬화합니다.return Response(serializer.data): 직렬화된 데이터를 응답으로 반환합니다.
5.5 월 단위 데이터 조회 API (getTestmonth)
@api_view(['GET'])
def getTestmonth(request):
today = datetime.now().date()
start_date = today - timedelta(days=31)
datas = Images.objects.filter(Detection_Time__date__range=(start_date, today))
serializer = TestDataSerializer(datas, many=True)
return Response(serializer.data)
@api_view(['GET']): 이 뷰가 GET 요청을 처리한다는 것을 명시합니다.today = datetime.now().date(): 현재 날짜를 가져옵니다.start_date = today - timedelta(days=31): 한 달 전 날짜를 계산합니다.datas = Images.objects.filter(Detection_Time__date__range=(start_date, today)): 한 달 동안의 데이터를 조회합니다.serializer = TestDataSerializer(datas, many=True): 여러 개의 데이터를 직렬화합니다.return Response(serializer.data): 직렬화된 데이터를 응답으로 반환합니다.
5.6 연단위 데이터 조회 API (getTestyear)
@api_view(['GET'])
def getTestyear(request):
today = datetime.now().date()
start_date = today - timedelta(days=365)
datas = Images.objects.filter(Detection_Time__date__range=(start_date, today))
serializer = TestDataSerializer(datas, many=True)
return Response(serializer.data)
@api_view(['GET']): 이 뷰가 GET 요청을 처리한다는 것을 명시합니다.today = datetime.now().date(): 현재 날짜를 가져옵니다.start_date = today - timedelta(days=365): 1년 전 날짜를 계산합니다.datas = Images.objects.filter(Detection_Time__date__range=(start_date, today)): 1년 동안의 데이터를 조회합니다.serializer = TestDataSerializer(datas, many=True): 여러 개의 데이터를 직렬화합니다.return Response(serializer.data): 직렬화된 데이터를 응답으로 반환합니다.
댓글남기기