끝나고 팀원들과 KPT회고를 작성하였다.

토요일 부터 친누나 결혼식이 있어 전날부터 수면부족에 시달렸다.

아버지의 대가족도 집에 찾아오셔서 엄청 피곤했다.

주말동안 겨우 4시간을 잤다.

그러다 보니 미완성인 팀프로젝트에 집중을 할 수가 없었다.

팀원에게 미안하고 오늘은 그저 잠을 짬짬히 잤다.

그래도 피곤하다... 컨디션 관리를 잘하자.

 

https://velog.io/@migdracios/DRF-DRF-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-Pagination%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%98%EC%9E%90

 

[DRF] DRF 공식문서로 Pagination을 구현하자

DRF 공식문서를 참조하여 Pagination API를 구현해보자. 거기에 Generic View와 Viewset을 곁들인...

velog.io

팀 프로젝트중 페이지네이션을 해보려고 했다.

drf에서 구현을 하고 어떻게 백으로 가져와야할까 고민을 많이 했다.

친누나 결혼식이어서 컨디션을 위해 마저 구현하지 못하고 자야했다.

다음엔 꼭 해봐야겠다.

위에 링크를 따라서 페이지네이션을 만들었고 프론트로는 fetch로 요청하고 고민을 해보았으나 실패.

 

팀프로젝트에서 좋아요를 누른 글과 북마크 한 글만 보도록 하는 기능을 구현하였고

그것을 프론트에 보여주는 것을 하기위해 자바스크립트를 채연님에게 도움을 받으며 해결했다.

글 작성 부분도 자꾸 400에러가 나서 도움을 받았고, 이유는 프론트에서 백으로 제이슨을 줄 때

잘못된 이름으로 데이터를 전달해서 그랬다.

 

그리고 헤더 부분을 어떻게 담아줘야할까 를 고민했는데 강의에 나온 내용이 있었다.

하지만 jqurey로는 해본적이 없어서 여러가지 방법을 시도하다 실패하고

강의에서의 내용으로 바닐라 자바스크립트로 다시 작업을 하였다.

여기부분 또한 채연님에게 도움을 받아서 해결을 할 수 있었다.

 

무엇보다 공부를 제대로 할 필요가 있다. 좀 하루를 소비해서 제대로 고민 좀 해보자

SMTP(Simple Mail Transfer Protocol) : 메일 전송, 포워딩
메일 포워딩 : 메일을 전달하는 기능. 발송과 전달은 다르다.
 
IMAP(Internet Messaging Access Protocol) : 메일 읽어오기
 
POP3 (Post Office Protocol Version 3) : 보관
 
장고 기본 비밀번호 변경 기능
 
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
#    EMAIL_BACKEND 는 어떤 backend 를 사용해서 메일을 보낼거냐를 정해주게 됩니다.
#    디폴트 값이 있기 때문에 적지 않아도 좋다.
EMAIL_HOST = 'smtp.naver.com' 		 # 메일 호스트 서버
EMAIL_PORT = '587' 			 # 서버 포트
EMAIL_HOST_USER = '메일@naver.com' 	 # 우리가 사용할 메일
EMAIL_HOST_PASSWORD = '비번'		 # 우리가 사용할 메일 비번
EMAIL_USE_TLS = True			 # TLS 보안 설정
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
 
urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

accounts url에는 아래와 같은 url이 포함되어 있다.

accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
#밑에 네개만 필요하다.
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
 
 
from django.contrib.auth import views as auth_views   

path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
   path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
   path('password_reset_confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
   path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),

위에서 봤던 네개의 url을 커스터마이징 할 수 있다.

회원가입 인증은 아직 하다 말았다. 공부하자 공부!

 

데이터베이스의 관계
One-To-Many : 하나가 여러개를 가질 수 있다. 예, 한 계정의 여러 개의 게시글
One-To-One : 하나가 하나만 가질 수 있다. 예, 한 계정 당 하나의 프로필
Many-To-Many : 서로 많은 것을 가질 수 있다. 예, 좋아요.
 
Many-To-Many 만들어 보기
restaurant 앱 만들기 : python manage.py startapp restaurant
restaurant 등록하기 : 'restaurant'
모델 코드 복붙
makemigrations : python manage.py makemigrations
migrate : python mange.py migrate
관리자 페이지에 모델 등록 하기 : admin.site.register(restaurant)
데이터 만들고 넣어주기
 
장고 shell로 테스트하기
피자에서 토핑 가져오기
shell 시작 : python manage.py shell
모델 가져오기 : from restaurant.models import MyPizza, MyTopping
피자 전부 보기 : MyPizza.objects.all()
피자 하나씩 가져오기 : MyPizza.objects.get(pizza_name = '피자이름')
각 피자 토핑 불러오기 : MyPizza.objects.get(pizza_name  = '피자이름').MyTopping.all()
 
토핑에서 피자 가져오기
shell 시작 : python manage.py shell
모델 가져오기 : from restaurant.models import MyPizza, MyTopping
토핑 전부 가져오기 : MyTopping.objects.all()
토핑 하나씩 가져오기 :  MyTopping.objects.get(topping_name = '토핑이름')
각 토핑이 들어간 피자 불러오기 : MyTopping.objects.get(topping_name='토핑이름').mypizza_set.all()
 
좋아요 모델 만들기
follow로 manytomany. settings에서 유저모델로. 역참조 이름은 followee
 
views.py에 복붙
urls 복붙
user_list.html 만들기, 복붙
이메일 인증은 지금 공부를 하고 있다. 잘 정리해서 내일 TIL로 써야할 것 같다. 너무 늦었다.

 

장고 기본 유저에 기능 추가하여 사용하기
AbstractUser : 장고의 기본 유저 모델
장고 유저 모델 상속받아 사용하기 bio 추가하기 : bio = models.CharField(max_length=256, default='')
장고에서 기본 유저 모델 바꾸기 : AUTH_USER_MODEL = 'user.UserModel'
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 기본 유저 기능 추가하여 회원가입 하기
get_user_model : 사용자가 DB에 있는지 확인하는 함수
create_user : 장고 기본 유저를 사용하면 쓸 수 있는 함수
exist_user 변수에 get_user_model 사용하기 : exist_user =  get_user_model.objects.filter(username=username) #get_user_model() 괄호를 주의하자.
회원가입 views를 create_user로 변경하기 : UserModel.objects.create_user(username=username, password=password, bio=bio)
 
장고 기본 유저 기능 추가하여 로그인 하기
비번 암호화 : 장고 기본 유저 모델 사용하면 비번은 자동으로 암호화 됌.
authenticate : 아이디와 비번을 확인하는 함수. DB에 있는지 확인한다.
login : 장고에서 로그인 할 수 있도록 해주는 함수.
authenticate 사용하기 : me = authenticate(username=username, password=password)
login 함수 사용하기 : auth.login(request,me)
 
로그인 이후 페이지 이동하기
tweet 폴더 만들고 home.html 만들고 복붙
is_authenticated : 유저가 로그인 되어 있는지 확인.
tweet views home 작성
def home(request):
    user = request.user.is_authenticated
    if user:
        return redirect('/tweet')
    else:
        return redirect('sign-in')
tweet views tweet 작성
def tweet(request):
    if request.method == 'GET':
        return render(request, 'tweet.home.html') #폴더를 타고 들어갈때는 슬래시.
urls 작성 복붙
tweet urls 연결하기 '' :path('', include('tweet.urls')),
username 띄워주는 화면을 다시 지시 '/' 화면 보여주기 : return redirect('/')
 
사용자 카드에 데이터 띄워주기
home.html 수정
h6 없애기.
title에 유저네임, text에 바이오 :{{user.username}} {{user.bio}}    #me.username이 아니였다. user다.
 
네비바 수정
로그인 회원가입 버튼은 로그인 되어있다면 username을 띄워주고 아니라면 버튼 보이기 :  {{user.username}} 님 반갑습니다!
 
로그인해야 home.html 볼 수 있도록 수정하기
만약 user가 is_authenticated 라면 보여주고
아니라면 로그인 화면으로 다시 지시 해주기 :
user = request.user.is_authenticated
    if request.method == 'GET':
        if user:
            return render(request, 'tweet/home.html')
        else:
            return redirect('/sign-in')
 
로그인 되어있다면 회원가입 페이지 못가도록 수정
만약 로그인 되어있다면
'/' 다시 지시
아니라면 회원가입 페이지 보여주기 :
user = request.user.is_authenticated
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        if not user:
            return render(request, 'user/signup.html')
        else:
            return redirect ('/')
 
로그인 되어있다면 로그인 페이지 못가도록 수정
만약 로그인 되어있다면:
'/' 다시 지시:
아니라면 로그인 페이지 보여주기 :
elif request.method == 'GET':
        if not user:
            return render(request, 'user/signin.html')
        else:
            return redirect('/')
 
로그아웃 기능  추가하기
logout 함수 만들기:
auth.logout() 함수 사용하기 :
'/' 다시 지시 :  
def logout(request):
    auth.logout(request)
    return redirect('/')
 
 
로그아웃 함수에 로그인 필요하다는 데코레이터 추가하기 :
from django.contrib.auth.decorators import login_required

@login_required
def logout(request):
    auth.logout(request)
    return redirect('/')
로그아웃 url  설정하기 'logout/' 별칭 logout : path('logout/',views.logout, name='logout'),
 
로그아웃 버튼 만들기
if 부터 else 까지 복사해서 이름 보여주는 곳에 붙여넣기:
로그인 부분 없애고 수정 <span class ='nav-link'> {{이름 보여주기 }}
바로 윗줄 disabled로 변경:
회원가입을 logout으로 변경 span 부분은 제거 :
<form class="form-inline my-2 my-lg-0">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item disabled">
                    <span class="nav-link">{{user.username}}</span>
                </li>
                <li class="nav-item active">
                    <a class="nav-link" href="/logout/"> 로그아웃</a>
                </li>
            </ul>
        </form>
 
게시글 작성하기
home.html 수정하기
action tweet, method post:
csrf_token :
<div class="form-group mb-2" method="post" action="/tweet/"> # 이건 틀린거다. form 에 넣어야 한다. 
{%csrf_token%}

<form method="post" action="/tweet/">
                    {%csrf_token%} # 이게 맞는 코드다.
 
tweet 함수 수정하기
 elif request.method =='POST':
        user = request.user
        my_tweet = TweetModel()
        my_tweet.author = user
        my_tweet.content = request.POST.get('my-content','')
        my_tweet.save()
        return redirect('/')
 
게시글 보여주기
views 수정
all_tweet = TweetModel.objects.all().order_by('-created_at')
            return render(request, 'tweet/home.html', {'tweet':all_tweet})
home.html 수정
코드 복붙
 
게시글 삭제하기
@login_required 
def detail_tweet(request,id):
    my_tweet = TweetModel.objects.get(id=id)
    tweet_comment = TweetComment.objects.all().filter(tweet_id = id).order_by('-created_at')
    return render(request, 'tweet/tweet_detail.html', {'tweet':my_tweet, 'comment':tweet_comment})
url 수정
tweet/delete/id, 별칭 delete-tweet : path('tweet/delete/<int:id>/',views.delete_tweet,name='delete-tweet'),
 
home.html 에 삭제 버튼 만들기 복붙 :
 
숙제
게시글 자세히 보기 부분에서는 특정글과 특정글의 댓글만 가져와야한다.
이걸 어떻게 해야할지 몰랐다. 특정 html에 그저 특정 글과 댓글만 띄워주면 되는 것 이었다.
 
tweet_detail.html 코드 복붙.
urls.py 작성.
path('tweet/<int:id>',views.detail_tweet,name='detail-tweet'),
path('tweet/comment/<int:id>',views.write_comment, name='write-comment'),
path('tweet/comment/delete/<int:id>',views.delete_comment, name='delete-comment'),
모델 복붙.
views 작성
여기서 가져오는 아이디는 게시글의 아이디.
@login_required 
def detail_tweet(request,id):
    my_tweet = TweetModel.objects.get(id=id).order_by('-created_at')
    tweet_comment = TweetComment.objects.all().filter(tweet_id = id)
    return render(request, 'tweet/tweet_detial.html', {'tweet':my_tweet, 'comment':tweet_comment})

여기서 가져오는 아이디는 게시글의 아이디.
@login_required 
def write_comment(request, id):
    if request.method == 'POST':
        comment = request.POST.get('comment','')
        current_tweet = TweetModel.objects.get(id=id)
        TC = TweetComment()
        TC.comment = comment
        TC.author = request.user
        TC.tweet = current_tweet
        TC.save()
        return redirect('/tweet/'+str(id))

여기서 가져오는 아이디는 코멘트의 아이디.
@login_required
def delete_comment(request, id):
    comment = TweetComment.objects.get(id=id)
    current_tweet = comment.tweet.id
    comment.delete()
    return redirect('/tweet/'+str(current_tweet))
 
 
 
 
 
 

역참조 공부가 필요하다.

게시글 중에 좋아요를 누른 아이디 중 내 아이디가 있는 것을 가져와야한다.

    def get(self,request):
        user = request.user
        article = user.hearts.all()
        serializer = ArticlesSerializer(article, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

 

기능별로 앱 만들기
user 앱 만들기 :    python manage.py startapp user
tweet 앱 만들기 : python manage.py startapp tweet
setting.py에 user, tweet 앱 추가하기 : 'user', 'tweet',
 
DB 연결
setting.py에 DATABASES 부분을 확인, 장고 실행 후 파일 생성 확인
 
user 모델 만들기
코드 스니펫 복붙
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 admin 기능 사용
관리자 계정 만들기 : python manage.py createsuperuser
관리자 페이지에 User 모델 등록 : admin.site.register(UserModel)
 
 
Tweet 모델 만들기
코드 스니펫 복붙
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 admin 기능 사용
관리자 페이지에 Tweet 모델 등록 : admin.site.register(TweetModel)
 
base.html 복붙
user폴더 만들기.
폴더 안에 signup.html 복붙.
폴더 안에 signin.html 복붙.
템플릿 언어 : html에 파이썬 문법을 사용하거나 템플릿을 확장할 때 사용.
 
signup 과 signin 연결하기
유저앱의 urls.py 사용하기 url='' : path('', include('user.urls'))
유저앱 view.py 복붙.
유저앱 urls.py 복붙.
 
GET과 POST
인터넷으로 통신하는 방법들.
GET : 값을 읽어 올 때
POST : 값을 전해 줄 때
 
회원가입 기능 만들기
def sign_up_view(request):
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        return render(request, 'user/signup.html')
    elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)
        if UserModel.objects.filter(username=username):
            return HttpResponse('존재하는 username 입니다.')
        if password != password2:
            return render(request, 'user/signup.html')
        else:
            new_user = UserModel()
            new_user.username = username
            new_user.password = password
            new_user.bio = bio
            new_user.save()
        return redirect('/sign-in')
회원가입 html 수정
form : 화면에 있는 데이터를 서버로 전송 할 때 사용하는 태그
post 방식으로 회원가입 url로 보냄 : <form class="form-area" method="POST" action="/sign-up/">
csrf_token 사용 : {%csrf_token%}
 
로그인 기능 만들기
세션 : 같은 사람이 요청을 하는지 확인 할 수 있도록 도와줌. 사용자의 정보를 저장  할 수 있다. 정도로 생각한다.
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        me = UserModel.objects.get(username=username)
        if me.password == password:
            request.session['user'] = me.username
            return HttpResponse(username)
        else:
            return redirect('/sign-in')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
로그인 html 수정
post 방식으로 회원가입 url로 보냄 : <form class="form-area" method="POST" action="/sign-in/">
csrf_token 사용 : {%csrf_token%}
 
숙제
  1. 지금 회원가입은 데이터베이스에 동일한 사용자가 있어도 가입이 됩니다.
사용자는 유일하게 만들어져야 하기 때문에 회원가입 시에 이미 있는 사용자 인지 확인하는 코드를 작성 해 주세요
if UserModel.objects.filter(username=username): 
    return HttpResponse('존재하는 username 입니다.')
 
  1. 사용자가 로그인을 성공 한 후에 HttpResponse를 사용해서 화면에 '사용자 이름'을 출력 해 주세요
 
return HttpResponse(username)

오늘 팀 프로젝트 시작이어서 회의하면서 어떤 사이트를 만들지 정하고 , API, 와이어프레임, 역할 정하고 프로젝트 시작.

 

장고 실무 기초 다시 시작 1주차

 

1주차
 
클라이언트 : 요청을 보내는 곳.
서버 : 요청을 받아서 응답을 해주는 곳.
API : url이 API.
 
Web Framework : 개발을 도와주는 하나의 틀
최소한의 기능 제공 : Pyramid , Flask
많은 기능 제공 : Django
MVT
Model(ORM) : 데이터베이스의 모델, 저장되고 사용되는 데이터의 형태.
View : 실질적으로 프로그램이 동작하는 부분. 요청과 응답 사이  서비스가 존재하는 곳.
Template : 사용자에게 보여지는 화면.
ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도구.
관계형 데이터베이스(RDBMS) : 테이블, 행, 열의 정보를 구조화하는 방식.
 
mySpartaSns 로 새 프로젝트 생성 : django-admin startproject mySpartaSns .
 
장고의 구조
settings.py : 장고의 환경설정 내용을 담고 있다.
urls.py : 장고 전체의 API를 담당.
 
장고 실행하기 : python manage.py runserver
 
글씨 띄우기
views.py에서 base_response 만들기
from django.http import HttpResponse

def base_response(request):
    return HttpResponse("안녕하세요! 장고의 시작입니다!")
urls.py에 test로 base_response 연결하기. 별칭은 first_test
from . import views

path('test/', views.base_response,name = 'first_test'
 
HTML 띄우기
my_test.html 만들기 그리고 코드 복붙.
views.py에 first_view 만들기
from djagno.shortcuts import render

def first_view(request):
    retrun render(request, 'my_test.html')
urls.py에 first로 first_view 연결하기. 별칭은 first_view
path('first/', views.first_view, name = 'first_view'
 
숙제
2. project_01.py를 만들고, 주어진 데이터를 반복문으로 모두 출력하는 station_list 함수를 작성하세요.
데이터 : my_station=['야탑','모란','이매','선릉','한티','왕십리']
my_station=['야탑','모란','이매','선릉','한티','왕십리']
def station_list(my_station):
    print('station_list')
    for station in my_station:
        print(station)

station_list(my_station)
3. proejct_01.py에 주어진 데이터를 반복문과 조건문을 사용하여 '선릉'만 출력 하는 station_point 함수를 작성하세요
def station_point(my_station):
    print('station_point')
    for station in my_station:
        if station == '선릉':
            print(station)

station_point(my_station)
4. proejct_02.py에 게시글을 저장하는 class를 만들려고 합니다.
클래스 안에 들어갈 변수는 ( id, title, author, content) 으로 모두 빈 문자열로 저장하고, 게시글 한 개를 저장해 보세요!
class post:
    id = ''
    title = ''
    author = ''
    content = ''

first = post()
first.id = 1
first.title = '장고의 시작!'
first.author = 'JJJ'
first.content = '파이썬 기반인 장고는 처음 시작하기 좋은 프레임워크!'
print(first)
파이썬 음수 나눗셈
5 // -2 = -3
5 // 2 = 2
 
Git
git diff = 파일 변경 사항 확인.
git log = 커밋 목록 확인. q 누르면 나가기.
git add (특정 폴더 파일) = 특정 파일만 add
git status = 스테이지 확인.
git remote = 현재 원격저장소 확인.
git remote -v = 현재 원격저장소 url 확인
git fetch = 병합을 해주지 않지만 로컬로 가져온다.
git pull = 병합을 하면서 로컬로 가져온다.
 
 
*
클론을 하게 되면 자동으로 원격저장소가 추가 된다.
*
 
*
강민철 튜터님의 조언
배우면 바로 실습을 해야 기억에 남는다.
 
최단 경로 찾기 문항
- 다익스트라 알고리즘
- 벨만 포드 알고리즘
그래프, 트리
- 이를 활용한 완전탐색 (bfs, dfs)
- 비트마스킹
*
 
후발대 강의
permission class = 뷰에 접근 할 수 있는 권한을 설정 할 수 있다.
 
기본값 설정 = view 전체에 접근 할 수 있는 권한을 설정 할 수 있다.
 
view내부 권한 vs 기본값 = view내부 권한이 더 높다.
 
permissions 커스터마이징 = 퍼미션즈 파일을 만들어서 복붙을 하고 커스터마이징을 한다.
 
부족한 금액 계산하기
 
"""""
성우님
def solution(price, money, count):
    answer = 0
    num = 0
    pricecount = 0
    while num < count:
        num += 1
        pricecount += price * num
    answer += pricecount - money
    if money < pricecount:
        return answer
    elif money >= pricecount:
        return 0
print(solution(3,20,4))
"""
"""
재준님
def solution(price, money, count):
    answer = -1
    sum_price = 0
    for i in range(1,(count+1)):
        sum_price += price*i
        if sum_price > money:
            answer=sum_price-money
        else:
            answer=0
    return answer
    while count > 1:
"""​
while의 조건 부분이 num이 4가 되면 while이 멈추게 된다.
sorted key lambda
출처 https://daeun-computer-uneasy.tistory.com/74?category=983126
  • 최빈값 구하기
def solution(array):
    answer = 0
    a_dict = {}
    for i in array:
        if i not in a_dict:
            a_dict[i] = 1
        else:
            a_dict[i] += 1
    
    sorted_a = sorted(a_dict.items(),reverse=True,key=lambda x:x[1])
    if len(sorted_a) > 1:
        if sorted_a[0][1] != sorted_a[1][1]:
            answer = sorted_a[0][0]
        else:
            answer = -1
    else:
        answer = sorted_a[0][0]
    return answer
문제를 잘 봐야한다. answer는 최빈값을 구하는 것이다. 최빈값의 빈도수를 구하는게 아니라!

 

배열 두 배 만들기
def solution(numbers):
    answer = []
    for i in numbers:
        answer.append(i * 2)
    return answer
 
배열 뒤집기
def solution(num_list):
    answer = []
    for i in range(len(num_list)):
        answer.append(num_list[(len(num_list)-1)-i])
    return answer
 
문자열 뒤집기
def solution(my_string):
    answer = ''
    for i in range(len(my_string)):
        answer += my_string[(len(my_string)-1)-i]
    return answer
 
가위 바위 보
def solution(rsp):
    answer = ''
    for i in rsp:
        if i == '2':
            answer += '0'
        elif i == '0':
            answer += '5'
        else:
            answer += '2'
    return answer
 
  • 점의 위치 구하기
def solution(dot):
    answer = 0
    if dot[0] > 0 and dot[1] > 0:
        answer = 1
    elif dot[0] < 0 and dot[1] > 0:
        answer = 2
    elif dot[0] < 0 and dot[1] < 0:
        answer = 3
    elif dot[0] and dot[1] < 0:
        answer = 4
    return answer
 
  • 최댓값 만들기 (1)
def solution(numbers):
    answer = 0
    numbers.sort(reverse=True)
    answer = numbers[0] * numbers[1]
    return answer
 
문자열 정렬하기
def solution(my_string):
    answer = []
    for i in my_string:
        if i in ['0','1','2','3','4','5','6','7','8','9']:
            answer.append(int(i))
            answer.sort()
    return answer
 
중복된 문자 제거
def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer += i
    return answer
 
대문자와 소문자
def solution(my_string):
    answer = ''
    for i in my_string:
        if i.islower():
            answer += i.upper()
        else:
            answer += i.lower()
    return answer
인덱스 바꾸기
def solution(my_string, num1, num2):
    answer = ''
    a_list = list(my_string)
    a_list[num1],a_list[num2] = a_list[num2],a_list[num1]
    answer = ''.join(a_list)
    return answer
  • 배열의 유사도
def solution(s1, s2):
    answer = 0
    for i in s1:
        if i in s2:
            answer += 1
    return answer
숫자 찾기
def solution(num, k):
    answer = 0
    if str(k) in str(num):
        answer += (str(num).index(str(k))+1)
    else:
        answer += -1
    return answer​
문자열 정렬하기 2
def solution(my_string):
    answer = ''
    a = sorted(my_string.lower())
    b = ''.join(a)
    answer = b
    return answer
머쓱이보다 키 큰 사람
def solution(array, height):
    answer = 0
    for i in array:
        if height < i:
            answer += 1
    return answer
알고리즘
직사각형 넓이 구하기
def solution(dots):
    answer = 0
    x_list = [dot[0] for dot in dots]
    y_list = [dot[1] for dot in dots]
    가로 = max(x_list) - min(x_list)
    세로 = max(y_list) - min(y_list)
    answer = 가로 * 세로
    return answer
알고리즘 300제 233
str을 list로 바꿀 때는 list(str)을 쓰는게 좋다. for을 사용하지 않아도 된다.
 
알고리즘 300제 227
def print_mxn(line, num):
    chunk_num = int(len(line) / num)
    for x in range(chunk_num + 1) :
        print(line[x * num: x * num + num])
 
알고리즘 300제 235
replace와 split
내가 많이 사용해 봤던 메소드가 먼저 떠오른다. 생각을 더 해보자.
 
파이썬 모듈 = 파이썬 파일을 의미.
 
GIT
깃 클론 = git clone [URL]
디렉토리 이동 = cd 디렉토리
현재경로 = pwd
디렉토리 내용 출력 = ls
 
클론 하고 클론 폴더로 이동 하고 브랜치 만들고(작업 브랜치와 머지 브랜치를 나눈다.)

 

몫 구하기
def solution(num1, num2):
    answer = 0
    answer = num1 // num2
    return answer
 
배열의 유사도
# 방법1: for문
def solution(s1, s2):
    answer = 0
    for i in s1:
        if i in s2:
            answer += 1
    return answer
# 방법2: set
def solution(s1, s2):
    return set(s1) & set(s2)
# 방법3: 함수
def solution(s1, s2):
    return len(set(s1).intersection(set(s2)))
숫자 찾기
def solution(num, k):
    answer = []
    for i in str(num):
        answer.append(i)
    if str(k) in answer:
        return (answer.index(str(k))+1)
    else:
        return -1
# 방법2: 추후 공개
def solution(num, k):
    if str(k) in str(num):
        return str(num).find(str(k))+1
    else:
        return -1
def solution(num, k):
    answer = str(num).find(str(k))+1
    return -1 if answer == 0 else answer
def solution(num, k):
    return str(num).find(str(k))+1 if str(num).find(str(k)) != -1 else -1
find 함수는 인덱싱 값을 리턴. 없으면 -1 리턴.

str.find(sub[,start[,end]])

 
개인과제 해설
pip 의존성 : pip에 의존성이라는 것이 있어, 필요한 것을 설치하게 된다.
 
작업 순서 : 모델링 , views 필요한 기능 함수와 주석을 적어놓는다. , urls, 포스트맨으로 기능 동작 확인. views 코딩하면서 sirializer 작성.
 
세션과 jwt의 로그아웃 :
콘서트장 입장 시 입장 권한은 티켓으로 확인.
세션 : 주문번호
세션은 서버 DB에서 관리하기 때문에 핸들링이 쉽다.
jwt : 구매자,구매일자, 만료기간, 티켓 서명(데이터의 유효성)
서버는 티켓서명과 만료기간을 확인
 
is_valid() 사용 시 두가지 방법이 있다.
is_valid(raise_exception=True)
에러시 에러만 띄워줄 때.
is_valid() 
에러시 특정 로직 추가 할 시 사용.
 
시리얼라이즈
extra_kwargs 로 각 필드에 속성을 줄 수 있다.
 
write_only 와 exclude 차이.
exclude는 필드를 제외시켜 필드를 사용 할 수 없게 된다.
 
patch 와 put의 차이
put은 모든 필드를 다 보내줘야 하지만, patch는 수정할 필드만 보내도 수정이 가능하다.
 
회원탈퇴 시 데이터를 지우면 안된다.
실예로 회원탈퇴된 아이디 입니다를 출력해준다.
즉 비활성화만 시켜준다는 뜻.
is_active가 있는 이유가 그것이다.
 
실제 서비스에선 회원탈퇴와 휴먼계정을 구분해줘야한다.
 
행은 가로
열은 세로
 
파이썬 300제 195
result = []
data = [
    [ 2000,  3050,  2050,  1980],
    [ 7500,  2050,  2050,  1980],
    [15450, 15050, 15550, 14900]
]
for i in data:
    sub=[]
    for v in i:
        sub.append(v * 1.00014)
    result.append(sub)
print(result)
 
파이썬 300 197
ohlc = [["open", "high", "low", "close"],
        [100, 110, 70, 100],
        [200, 210, 180, 190],
        [300, 310, 300, 310]]
for i in ohlc[1::]:
    if i[3] >= i[0]:
        print(i[3])
#문제를 잘보자. 이상인지 초과인

+ Recent posts