2023.04.03(Django, 알고리즘)

Vinyl Stage·2023년 4월 3일
0

개발일지

목록 보기
22/42

Django

오늘부터 Django 학습에 들어갔다.

간단하게 Django는
파이썬으로 웹 애플리케이션을 개발하기 위한 무료 오픈소스 Web Framework이다.
이는 MVT패턴을 사용하여 웹 애플리케이션을 개발한다.
MVT = Model-Template-View

이 패턴은 데이터베이스 모델, 템플릿, 뷰를 분리하여 각각 역할을 수행하도록 하며 이를 통해 유지보수와 확장성이 용이해진다.

Django는 다양한 기능을 내장하고 있어서 회원가입, 로그인, 권한 관리, 폼 처리, 관리자 페이지, 데이터베이스 모델링 등의 작업을 쉽고 빠르게 구현할 수 있다.

그럼 어떻게 사용하는가

이와같이 python -m venv venv로 가상환경을 설정해 준다.
보통 폴더이름도 venv로 많이들 하지만 원한다면 바꿔도 무관하다. 바꾸고싶다면 python -m venv 폴더이름으로 설정해주면 된다.

다음은 venv로 옮기는 일이다.

F1을 누르게 된다면

이런식으로 인터프리터를 먼저 venv로 설정해 준다.

그리고 새 터미널을 실행시켜 주면(Ctrl + Shift +`)

이런식으로 (venv)가 생긴걸 볼 수 있다.
다음으로 Django를 설치해 주자.

python -m pip install django
입력하면 주르르륵 뭐가 뜨면서 설치가 될것이다.

필자처럼 버젼이 안맞다고 나오는 경우 업그레이드를 해주면 된다.

python -m pip install --upgrade pip

이러면 설치는 끝이다. 이제 필요한것들을 가져와보자.

Django는 필요한것들은 알아서 다 가지고 있으므로 불러오기만 하면 된다.

django-admin이라고 치게 되면

이런식으로 친절하게 다 알려주는데 여기서 startproject를 해줄거다.

django-admin startproject 프로젝트이름 위치(default는 프로젝트이름으로 된 폴더 하위폴더에 생성됨)

django-admin startproject myproject .
이처럼 뒤에 .을 찍게되면 현 위치에 생성된다. 입력을 안할시에는 껍데기가 하나 더생긴다고 생각하면 된다.
가급적이면 .을 찍고 그 자리에서 하자 안그럼 귀찮아진다.


그러면 이와같이

여러 파일들이 생길것이다.

파일들을 하나씩 보자면

settings.py파일은 프로젝트를 운영하는데 필요한 설정들이 다 들어가있다.
urls.py는 사용자가 접속하는 path에 따라 그 요청을 누가 처리해줄까하는 라우터 역할을 한다.
그리고 이 바깥에 있는 manage.py는 프로젝트에 필요한 여러가지 기능들이 들어가있는 유틸리티정도로 보면 된다.

다음으로
python manage.py라고 치게 되면
여러가지 서브 명령들이 나오는데 여기서

runserver명령을 먼저 해보자

뒤에 runserver을 붙이기만 하면되는데

python manage.py runserver

여기서 manage.py가 없다고 뜨는경우!
맨 처음 startproject를 하는데 하위디렉토리를 따로 설정을 안하고 했을경우 위에서 말했듯이 설정한 폴더이름의 폴더안에 폴더가 또 생겨서 그 안에 생성되기 때문에 이때는 그 폴더로 이동을 해줘야 한다.
cd 폴더이름으로 이동을 한 뒤에 runserver를 해줘야한다.

아무튼 위와같이 떴으면 성공이고 해당 주소를 Ctrl+클릭으로 이동해주자

이렇게 뜨면 성공이다.

만약 서버를 끄고싶으면 터미널에서 Ctrl + c를 누르면 된다

또 만약 이 포트를 사용하고있어서 실행이 안된다고 하면 위데 포트번호를 입력해주면 된다.

python manage.py runserver 해당포트번호

이제 html파일을 연동해보자

먼저 현재 폴더에 views.py라고 만들어주고

from django.http import HttpResponse


def base_response(request):
    return HttpResponse("Welcome to Django!")

이 내용을 넣어주자

urls.py로 이동하고

이와같이 바로 밑에
from . import views라고 적어주자
이는 현재 폴더에 views가져오겠다는 얘기이다.


그런다음 urlpatterns안에 이와같이 적어주자
path('test/', views.base_response, name='test'),

이는 test/라는 url에 views파일 안에 만들어둔 base_rsponse함수를 실행시키겠다는 얘기이다.

처음에 들어갔던 로컬주소뒤에 test/를 넣어주고 접속해보자

이와같이 뜨면 잘 작동한것이다.

그리고 이제 html파일을 연동시켜보자

먼저 바깥에 templates라는 폴더를 만들어 주자

그리고 그 폴더 하위에 대충 hello.html로 html파일을 생성해 준다.

여기서 좀 답답한게 일반적인 곳에서 html파일을 실행시키면 !로 기본 세팅을 불러올수 있었지만 django로 생성된 이놈은 그게 안된다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DJG</title>
</head>
<body>
<h3>Welcome to Django!</h3>
</body>
</html>

대충 이렇게 넣어주고

views로 가서

상단에
from django.shortcuts import render
를 입력해준다. html파일을 render해주는 역할이다.

그리고 해당 함수를 생성해 주자

def first_view(request):
    return render(request, 'hello.html')

그 다음 urls로 가서 연결해주자

path('hello/', views.first_view, name='hello'),
아까와 같이 를 입력해준다

이제 연결해주었으니 확인을 해볼 차례인데

아까 그 주소끝에 hello/를 입력하고 가보면

이딴식으로 뜰거다

여기서 settings로 가서 이 templates를 연결해 줘야한다.

pycham은 자동으로 다 세팅해주는데 vs코드는 안해준다

templates를 찾으면 'DIRTS'에 아무것도 없을것이다.
여기에 연결을 해줘야 한다.
대괄호 안에 BASE_DIR, 'templates'를 입력해 주자

그러면


정상적으로 잘 나오는것을 볼 수 있다.

장고는 여기까지


최빈값 구하기

# 정답
from collections import Counter

def solution(array):
    counter = Counter(array)
    mode_count = max(counter.values())
    mode = [k for k, v in counter.items() if v == mode_count]
    return mode[0] if len(mode) == 1 else -1

열심히 찾아본 결과 Counter을 쓰면 코드가 정말 간단해진다.

collections모듈의 Counter클래스는 객체의 요소들의 개수를 세어 딕셔너리 형태로 반환해주는 컨테이너이다.

예를들면

lst = [5, 4, 6, 8, 4, 6, 6, 7, 7, 8, 9, 9, 10]
counter = Counter(lst)
print(counter)

# Counter({6: 3, 4: 2, 8: 2, 7: 2, 9: 2, 5: 1, 10: 1})

이런식으로 출력이 되는 형태이다.

그래서 정답을 하나씩 뜯어보면

Counter(arraay)counter변수선언을 해서 담고 거기서 values()로 value값만 뽑아낸뒤 최댓값들을 mode_count에 담는다.

counter.items()로 key와 value값을 각각 k와 v변수에 정렬하여 담는다. 이 v, 즉 value값 이 같다면 mode에 리스트[]형태로 담는다.
여기서 mode의 길이가 1이되면 0번째 값(최댓값)을 리턴하고 아닐시에는 -1을 리턴한다.

이 리스트 컴프리헨션으로 줄여놓은 코들을 풀어놓는다면 다음과 같다.

mode = []
for k, v in counter.items():
    if v == mode_count:
        mode.append(k)

마지막줄의 삼항연산자를 풀면 다음과 같다.

if len(mode) == 1:
    return mode[0]
else:
    return -1
profile
Life is Art

0개의 댓글