GitHub 블로그
유튜브 영상     깃허브 프로필

6 분 소요

[공지사항] 지킬블로그 안내드립니다.

지킬 블로그에 대하여 알아보겠습니다.

버튼입니다

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_idImageModel 객체를 조회하고, 없으면 404 오류를 반환합니다.

  • if image_record and image_record.image:

    이미지가 존재하면,

    • image_data = base64.b64encode(image_record.image).decode('utf-8'): 이미지를 Base64로 인코딩하여 문자열로 변환합니다.
  • else:: 이미지가 없으면 image_dataNone으로 설정합니다.

  • 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): 주어진 idImages 모델의 객체를 조회합니다.
  • 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): 직렬화된 데이터를 응답으로 반환합니다.

댓글남기기