본문 바로가기
TIL

[TIL]2023.04.06 / 고리즘 2주차/장고 기초(2) /

by kming 2023. 4. 30.

목표

 


참고자료


내용

 

매일 아침 9기~10시 알고리즘 풀기로 하였다!

팀구성: https://www.notion.so/A-2-ca3709c2d1a44e3c9eb055514da97430
알고리즘: https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&languages=python3

짝수의 합(공민영)
def solution(n):
#반복문을 사용하여 n이하의 짝수더하기
#짝수를 구하기 위한 조건문 사용
answer = 0
for num in range(2, n+1, 2):
answer += num
return answer
배열의 평균값 (공민영)
def solution(numbers):
#numbers는 매개변수 int가 들어있는 리스트
#반복문을 사용
#평균값을 구하기 위한 연산(리스트 길이로 나눔)
answer = 0
asum = 0
for a in numbers:
asum += a
answer = asum/len(numbers)
return answer


ORM의 활용과 Admin 익숙해지기

  • tweet
  1. 데이터베이스에 적용할 클래스 작성
# tweet/models.py
from django.db import models
# user.models의 UserModel을 가져오겠다는 의미
from user.models import UserModel


# Create your models here.
class TweetModel(models.Model):
    class Meta:
        db_table = "tweet"

	# ForeignKey는 다른 데이터베이스에서 모델,내용을 가져오겠다는 의미
    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  1. 명령어 2개 작성
  • python manage.py makemigrations
  • python manage.py migrate
    잘 들어갔을 때 터미널
  1. admin에 넣어주기
    (내가 생성한 tweet모델이라는 친구를 admin에게 알려주겠다(admin에 등록해주겠다)
from django.contrib import admin
from .models import TweetModel

# Register your models here.
admin.site.register(TweetModel)

사용자 관리와 로그인 - 화면띄우기

  • html 파일
    • signin.html
      base.html이라는 파일 위에 추가해주겠음
    {% extends 'base.html' %}
  • py 파일 추가
  • MVP패턴 이론
  • URL Conf: 우리가 접속할 url을 알려줌
    -> View: 우리가 어떤 동작을 해줄 수 있는지 작성
    -> 뷰에서 Template를 보여줄 수 있도록 만들것!
  • 회원가입 url과 관련된 기능(아래사진)
    • url보고 어떤 url인지 판단 그리고 맞는 url로 이동
  • urls.py에 우리가 추가한 앱을 알려줘야함
    1. user앱에 urls.py를 추가
    2. user앱의 url을 원래있던 djangoproject라는 url에 알려줘야함
  • djangoproject/urls.py에 include 추가
  • from django.urls import path, include
  • urlpatterns = [ ]안에 path 추가-> user의 url과 djangoproject의 url이 연결되었음
  • path('',include('user.urls')),
  • user앱에 views.py 안 내용 입력
# render를 통해서 화면에 보이게 만들어줌
from django.shortcuts import render


# Create your views here.
# 함수를 만들고 html을 연결해줌
def sign_up_view(request):
    return render(request, 'user/signup.html')


def sign_in_view(request):
    return render(request, 'user/signin.html')
  • user앱에 urls.py 안 내용 입력
from django.urls import path
from . import views

urlpatterns = [
	#views 파일에 있는 sign_up_view가 실행
    path('sign-up/', views.sign_up_view, name='sign-up'),
    path('sign-in/', views.sign_in_view, name='sign-in'),
]

-> views파일에 있는 함수 실행 후 html 화면 보여줌


사용자 관리와 로그인 - 회원가입 기능 만들기

인터넷으로 통신하는 방법
get: 값을 읽어올 때
post: 데이터를 넣어주고 싶을 때

회원가입해서 작성한 데이터를 데이터베이스에 저장하는 기능개발

  • 지금부터 모두 user앱에서 할 것임
  • post방식에서 데이터를 전달하는 형식 할 것임
  • view.py>sign_up_view()에 코드 추가 작성
    화면에서 장고 서버로 url요청이 가면(sign_up_view()에 요청이 들어오는 url을 실행 할 때) url의 요청방식을 가장 먼저 확인하는데 이때 if문이 실행
    => 'GET'이면 화면을 보여주겠다는 의미
    => 'POST'면 다른 작업을 하겠다는 의미(데이터베이스를 저장하는 기능들을 추가하면 좋음)
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
  • signup.html로 이동 form에 *method, *action 속성 추가
<form class="form-area" method="post" action="/sign-up">
  • 보안하는 기능을 쓰겠다는 의미
    (form 안에 작성)
{% csrf_token %}
  • 작성내용을 서버에서 받아서 내용을 데이터베이스에 저장하기
    • input 태그의 name주목
    • button 확인 (form을 실행시켜주는 역할)
  • views.py
    • .은 내가 가지고 있는 위치라는 뜻
    • .models 위치에서 UserModel을 가져오겠다는 뜻
    def sign_up_view(request):
        if request.method == 'GET':
            return render(request, 'user/signup.html')
        elif request.method == 'POST':
            #POST로 온 데이터를
            username = request.POST.get('username',None)
            username = request.POST.get('username',None)
            username = request.POST.get('username',None)
            username = request.POST.get('username',None)
            return ''
    • signup.html에서 method를 post로 주었기 때문에 post 아래 내용 작성
    • request.POST는 POST로 온 데이터를 받는다는 의미
    • .get('username',None)는
    • 많은 데이터중에 'username'이라는 이름으로 되어있는 데이터를 가지고 오는데
    • username이 없으면 None으로 빈칸 처리하겠다는 의미
    • 이렇게 가져온 정보를 username이라는 변수에 저장
  • from .models import UserModel
  • password가 같아야 회원가입이 되도록하기
    • password와 password2가 같지 않으면 다시한번 화면을 보여주기
    else:
                new_user = UserModel()
                # request.POST해온 username을  UserModel()의 username에 담는다
                new_user.username = username
                new_user.password = password
                new_user.bio = bio
    • 같으면 user를 저장
    • new_user는 저장이 되어있지만 실제로 우리 데이터베이스에는 저장이 안되어있는 상태임
    new_user.save()
    • 실제로 데이터베이스에 저장하기 위해 코드작성
  • if password != password2: return render(request, 'user/signup.html')
  • 저장이 된 후에 회원가입페이지말고 로그인페이지를 보여주기
    : redirect()함수 사용
    사용하려면 from import 작성
    return redirect('/sign-in')
    • 회원가입이 완료되었을때만 실행
    • return에 redirect()함수를 사용하여 sign-in url을 작성
  • from django.shortcuts import render,redirect

사용자 관리와 로그인 - 로그인 기능 만들기

세션(사용자 정보를 저장하는 공간)
: 누가 요청을 했는지 확인 해주는 기능

  • 세션안에 사용자 정보를 집어 넣어 어떤 유저가 들어가있는지 확인하려고 함
  • user앱의 url, view세팅
    • views.py에 로그인을 처리해줄 함수 만들기(url은 회원가입만들면서 연결함)
# HttpResponse 화면에 글자를 띄울 때 사용
from django.http import HttpResponse
  • 로그인 성공하면 로그인성공이라는 메시지 출력하기
    (get/post가 이해안됨)
def sign_in_view(request):
    if request.method == 'POST':
        return HttpResponse("로그인 성공!")
        
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
  • signin.html로 이동 form에 속성추가
<form class="form-area" method="post" action="/sign-in/">
  • 보안기능 추가
{% csrf_token %}
  • signin.html안에 name을 잘 확인하기
  • views.py로 이동 if문 추가
  • if request.method == 'POST': username = request.POST.get('username',None) password = request.POST.get('password',None)
  • 기존에 유저가 있으면 UserModel을 .objects로 불러오기
    • UserModel은 이미 데이터베이스와 연결되어있는 객체(클래스)라고 생각하면 됨
    • .get(username=username) 어떤 데이터를 가져올껀지 조건을 써줌
    • (username(UserModel안에있던것)=username(post에서 받아온 값))
    • 이러면 me는 회원가입한 사용자들만 불러올 수 있게됨
  • me = UserModel.objects.get(username=username)
  • password 확인
    • 로그인을 요청한 사용자(있을경우)의 password랑 post에서 작성한 password와 같은지 확인
  • if me.password == password:
  • 다 맞으면 로그인
    • if문 안쪽에 적어줌
    • request.session['user'] = me.username(이거 이해못함)
    • .session: 사용자 정보를 저장할 수 있는 공간
    • .session['user']: session에다가 user를 넣음
  • request.session['user'] = me.username return HttpResponse("로그인 성공!")
  • 만약에 password가 다르면
    • redirect() 기능 사용
    • 로그인페이지로 redirect()시켜줌
  • else: return redirect('/signin')

용어사전

  • form: 화면에 있는 데이터를 서버로 전송할 때 많이 사용하는 태그
  • method: get/post 둘 중 하나 사용할 수 있음
  • action: 어떤 url로 전달 될 건지 적어줘야함(슬래시 꼭 적기)
  • {% csrf_token %}: 보안을 지켜주기 위한 기능(장고에서 데이터를 post할 때는 보안 기능을 꼭 추가해야함)
  • button: form 안에 있으면 해당 form을 실행시켜주는 역할을 함(어디로?action속성의 값으로/어떤방식으로?method속성의 값으로)

 


문제 (해결하기 어려웠던 일이나 에러)

 


시도 (문제가 생긴 이유와 해결하기 위해 시도해본 것들)

 


해결 (최종적으로 해결이 되었을 때 시도한 것 정리)

 


마무리 (내가 새롭게 알게 된 것이나 짧은 정리)