본문 바로가기
DEV/Web 개발

Web 개발 :: Django 머신러닝 프로젝트 Code Review _ User_TIL#36

by 올커 2022. 10. 25.

■ JITHub 개발일지 36일차

□  TIL(Today I Learned) ::

Django 머신러닝 프로젝트 Code Review _ User

  - 전주 진행했던 머신러닝 프로젝트에 대해 기본 Backend부분에 대해서 코드 Review를 진행하기로 했다.

  - 첫날은 user부분을 손보기로 했다.

 

  - views.py에서 user 템플릿을 불러올 때 TemplateDoesNotExist 오류가 발생했다.

   user는 현재 구조가 아래와 같이 되어있다.

│  └─ user
│     ├─ admin.py
│     ├─ apps.py
│     ├─ migrations
│     │  ├─ 0001_initial.py
│     │  └─ __init__.py
│     ├─ models.py
│     ├─ templates
│     │  └─ user
│     │     ├─ account
│     │     │  ├─ signin.html
│     │     │  ├─ signup.html
│     │     │  ├─ test.html
│     │     │  └─ user_list.html
│     │     └─ user_base
│     │        └─ base.html
│     ├─ tests.py
│     ├─ urls.py
│     ├─ validators.py
│     ├─ views.py
│     └─ __init__.py

 - 정상적으로 연결되었는지 간단하게 작성한 로그인 함수는 아래와 같다. 

# user/views.py

def signin(request):
    if request.method == "GET":
        return render(request, 'user/account/test.html')

 - 프로젝트 폴더의 urls.py에 include도 정확히 들어가 있었고, App level의 urls.py에도 아래와 같이 입력하였다.

# user/uirls.py

urlpatterns = [
    path('', views.signin, name='signin'),
]

 - 어? path의 url에 slash가 없어서 그런가? 추가해주니 다른 오류가 발생한다.

django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'user.USER' that has not been installed

 - 저건 Settings.py에 AUTH_USER_MODEL = 'user.USER'로 추가해준 부분에서 발생하는 오류였다.

    → Settings.py에서 AUTH_USER_MODEL로 알려주어야 하는 것으로 알고있는데 다시 한번 체킹해봐야겠다.

 - 오류를 해결하니 또다른 오류가..

?: (urls.W002) Your URL pattern '/' [name='signin'] has a route beginning with a '/'. Remove this slash as it is unnecessary. If this pattern is targeted in an include(), ensure 
the include() pattern has a trailing '/'.

 - 추가해준 트레일링 슬래쉬가 필요없다고 한다. 다시 삭제해주었는데, 다시 TemplateDoesNotExist가 발생한다.

   조치가 아무래도 잘못된 것 같다.

 - 기존의 프로젝트를 지우고 시작하려니 내가 모르는 무언가가 충돌하는 중인 것 같다. 😂

   싹 다 지우고 새로 프로젝트를 만들기로 결심했다. (모두 동일하게 했는데 이번에는 작동했다.)


 ?) 작업을 하던 중 테스트를 위해 템플릿 파일을 render하도록 코드를 짰는데 css적용이 안되었다. css파일은 현재 app 폴더레벨의 static 파일에 저장되어있다. 그렇기 때문에 settings에서 base directory 설정을 해주어야 하는데, 매번 어떻게 생겨먹은 코드인지 잘 잊어서 이번에도 찾아보았다.

 

 !) 아래처럼 STATIC_URL은 기본적으로 적혀있다. STATICFILES_DIRS를 넣고 BASE_DID / 'static' 으로 지정하자 CSS가 아주 잘 적용되었다. (물론 html 파일에서 {% load static %} 을 통해 static을 불러와야 사용할 수 있다.)

STATIC_URL = 'static/'

STATICFILES_DIRS = [ BASE_DIR / 'static']

 - 회원가입 기능은 아래 코드를 사용했다.

def signup(request):
    if request.method == "GET":
        user = request.user.is_authenticated
        if user:
            return redirect('temp_index')
        else:
            return render(request, 'user/account/signup.html')

    elif request.method == "POST":
        username = request.POST.get('username', '')
        email = request.POST.get('email', '')
        password = request.POST.get('password', '')
        password2 = request.POST.get('repeatpassword', '')

        if password != password2:
            return render(request, 'user/account/signup', {'error':'비밀번호가 다릅니다'} )
        elif username == '' or email == '':
            return render(request, 'user/account/signup', {'error':'공백은 입력할 수 없습니다.'} )
        else:
            User.objects.create_user(email=email, username=username, password=password)
            return redirect('signin')

   아직도 가물가물한 부분이 많았다고 한다... 예를 들면 유저의 인증여부를 확인할 때 사용하는 아래 코드

request.user.is_authenticated

   또는 입력된 값을 가져올 때, 괄호안의 공백을 추가해주는 부분(변수값이 없다면 default로 빈 값을 임의로 넣어줌)

username = request.POST.get('username', '')

    다른 조건을 만족할 경우 유저를 생성하는 부분

    (User.objects.create_user(email=email, username=username, password=password)

...
else:
            User.objects.create_user(email=email, username=username, password=password)
            return redirect('signin')

 - 로그인 기능은 심지어 글을 쓰고 있는 지금도 에러와 싸우고 있다. 

def signin(request):
    if request.method == "GET":
        user = request.user.is_authenticated
        if user:
            return redirect('temp_index')
        else:
            return render(request, 'user/account/signin.html')

    elif request.method == "POST":
        email = request.POST.get('email', '')
        password = request.POST.get('password', '')

        me = auth.authenticate(request, email=email, password=password)        
        if me is not None:
            auth.login(request, me)
            return redirect('temp_index')
        else:
            return render(request, 'user/account/signin.html', {'error':'이메일 또는 패스워드를 확인하세요'})

 

반응형

댓글