■ 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':'이메일 또는 패스워드를 확인하세요'})
'DEV > Web 개발' 카테고리의 다른 글
Web 개발 :: Django 머신러닝 프로젝트 Code Review _ User_TIL#37 (1) | 2022.10.26 |
---|---|
Web 개발 :: 파이썬 Django Rest Framework(2) _ 포스트맨, Swagger (0) | 2022.10.26 |
Web 개발 :: 파이썬 Django Rest Framework(1) _ 프로젝트 세팅, 모델 Serializer, CRUD 기능 구현 (0) | 2022.10.25 |
Web 개발 :: HTTP와 웹의 동작 방식 (1) | 2022.10.24 |
Web 개발 :: 머신러닝 프로젝트_TIL#35 (0) | 2022.10.23 |
댓글