From 6c2057baeea67892e0865b589aa80e16f70f7e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CROHYUNSEO=E2=80=9D?= <“hyunseo224@gmail.com”> Date: Tue, 8 Aug 2023 16:45:39 +0900 Subject: [PATCH 1/2] main page update --- Users/admin.py | 9 +++- Users/models.py | 11 ++++- Users/templates/login.html | 19 +++++++++ Users/templates/main.html | 19 +++++++++ Users/templates/signup_complete.html | 12 ++++++ Users/templates/signup_form.html | 29 +++++++++++++ Users/views.py | 61 +++++++++++++++++++++++++++- config/settings.py | 2 +- config/urls.py | 10 ++++- 9 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 Users/templates/login.html create mode 100644 Users/templates/main.html create mode 100644 Users/templates/signup_complete.html create mode 100644 Users/templates/signup_form.html diff --git a/Users/admin.py b/Users/admin.py index 8c38f3f..0530d34 100644 --- a/Users/admin.py +++ b/Users/admin.py @@ -1,3 +1,10 @@ from django.contrib import admin +from .models import Country -# Register your models here. +class CountryAdmin(admin.ModelAdmin): + pass + +admin.site.register(Country, CountryAdmin) + +# 'Countrys' 텍스트를 'Countries'로 수정 +admin.site.verbose_name_plural = 'Countries' diff --git a/Users/models.py b/Users/models.py index 71a8362..acb7b9c 100644 --- a/Users/models.py +++ b/Users/models.py @@ -1,3 +1,12 @@ from django.db import models -# Create your models here. +class Country(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + +class User(models.Model): + name = models.CharField(max_length=100) + password = models.CharField(max_length=100) + country = models.ForeignKey(Country, on_delete=models.CASCADE) \ No newline at end of file diff --git a/Users/templates/login.html b/Users/templates/login.html new file mode 100644 index 0000000..c6e1923 --- /dev/null +++ b/Users/templates/login.html @@ -0,0 +1,19 @@ + + + + 로그인 + + +

로그인

+
+ {% csrf_token %} + +

+ + +

+ + +
+ + diff --git a/Users/templates/main.html b/Users/templates/main.html new file mode 100644 index 0000000..d365e37 --- /dev/null +++ b/Users/templates/main.html @@ -0,0 +1,19 @@ + + + + 메인 페이지 + + +

메인 페이지

+ {% if user.is_authenticated %} +

로그인된 사용자: {{ user.username }}

+
+ {% csrf_token %} + +
+ {% else %} +

로그인 안 됨

+ 로그인 + {% endif %} + + diff --git a/Users/templates/signup_complete.html b/Users/templates/signup_complete.html new file mode 100644 index 0000000..ce98a3a --- /dev/null +++ b/Users/templates/signup_complete.html @@ -0,0 +1,12 @@ + + + + 회원가입 완료 + + +

회원가입이 완료되었습니다!

+

이름: {{ name }}

+

나라: {{ country }}

+

메인페이지로 가기

+ + diff --git a/Users/templates/signup_form.html b/Users/templates/signup_form.html new file mode 100644 index 0000000..871c439 --- /dev/null +++ b/Users/templates/signup_form.html @@ -0,0 +1,29 @@ + + + + 회원가입 + + +

회원가입

+
+ {% csrf_token %} + +

+ + +

+ + +

+ + +
+ + diff --git a/Users/views.py b/Users/views.py index 91ea44a..07fbd5e 100644 --- a/Users/views.py +++ b/Users/views.py @@ -1,3 +1,62 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from django.contrib.auth.hashers import make_password +from django.contrib.auth import authenticate, logout +from django.conf import settings +import jwt from django.shortcuts import render -# Create your views here. +from .models import User +from .models import Country +from django.contrib.sessions.backends.db import SessionStore + +class CountriesListView(APIView): + def get(self, request): + countries = Country.objects.all() + return render(request, 'signup_form.html', {'countries': countries}) + # countries = Country.objects.all().values_list('name', flat=True) + # return Response(countries) + +class SignupView(APIView): + def get(self, request): + countries = Country.objects.all() + context = {'countries': countries} + return render(request, 'signup_form.html', context) + + def post(self, request): + name = request.data.get('name') + password = request.data.get('password') + country = request.data.get('country') + + hashed_password = make_password(password) + user = User.objects.create(name=name, password=hashed_password, country=country) + + payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore + token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256') + + # 회원가입이 완료되었다는 문구와 메인페이지로 가기 버튼을 포함한 페이지 렌더링 + context = {'name': name} + return render(request, 'signup_complete.html', context) + +class LoginView(APIView): + def get(self, request): + return render(request, 'login.html') + + def post(self, request): + name = request.data.get('name') + password = request.data.get('password') + + user = authenticate(request, username=name, password=password) + if user: + payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore + token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256') + return Response({'token': token}) + else: + return Response({'message': 'Login failed.'}, status=status.HTTP_401_UNAUTHORIZED) + +class LogoutView(APIView): + def post(self, request): + # 로그아웃은 클라이언트 측에서 JWT를 삭제하면 됩니다. + logout(request) + return Response({'message': 'Logged out.'}) diff --git a/config/settings.py b/config/settings.py index d014560..a5100fa 100644 --- a/config/settings.py +++ b/config/settings.py @@ -78,7 +78,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ diff --git a/config/urls.py b/config/urls.py index ee45a6b..eb0df30 100644 --- a/config/urls.py +++ b/config/urls.py @@ -18,8 +18,16 @@ from django.urls import path from django.conf import settings from django.conf.urls.static import static +from Users import views +from Users.views import SignupView, LoginView, LogoutView, CountriesListView + urlpatterns = [ path('admin/', admin.site.urls), + path('signup/', SignupView.as_view(), name='signup'), + path('api/signup/', SignupView.as_view(), name='api-signup'), + path('login/', LoginView.as_view(), name='login'), + path('logout/', LogoutView.as_view(), name='logout'), + path('countries/', CountriesListView.as_view(), name='countries-list'), ] -+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) +#+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) From 1023d14e8cfb0866e2e56ffd706aebd6b206c365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CROHYUNSEO=E2=80=9D?= <“hyunseo224@gmail.com”> Date: Thu, 10 Aug 2023 16:42:53 +0900 Subject: [PATCH 2/2] Users models update --- Users/models.py | 27 ++++++++++++++++++++++++++- Users/views.py | 3 +-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Users/models.py b/Users/models.py index acb7b9c..cd214a6 100644 --- a/Users/models.py +++ b/Users/models.py @@ -1,12 +1,37 @@ from django.db import models +from django.contrib.auth.models import BaseUserManager class Country(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name +from django.contrib.auth.models import BaseUserManager + +class UserManager(BaseUserManager): + def create_user(self, email, password=None, **extra_fields): + if not email: + raise ValueError('The Email field must be set') + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email, password=None, **extra_fields): + extra_fields.setdefault('is_staff', True) + extra_fields.setdefault('is_superuser', True) + + if extra_fields.get('is_staff') is not True: + raise ValueError('Superuser must have is_staff=True.') + if extra_fields.get('is_superuser') is not True: + raise ValueError('Superuser must have is_superuser=True.') + + return self.create_user(email, password, **extra_fields) class User(models.Model): name = models.CharField(max_length=100) + email = models.EmailField(unique=True) password = models.CharField(max_length=100) - country = models.ForeignKey(Country, on_delete=models.CASCADE) \ No newline at end of file + country = models.ForeignKey(Country, on_delete=models.CASCADE) + objects=UserManager() \ No newline at end of file diff --git a/Users/views.py b/Users/views.py index 07fbd5e..da98c45 100644 --- a/Users/views.py +++ b/Users/views.py @@ -35,7 +35,7 @@ def post(self, request): payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256') - # 회원가입이 완료되었다는 문구와 메인페이지로 가기 버튼을 포함한 페이지 렌더링 + # 회원가입이 완료되었다는 문구, 메인페이지로 가기 버튼 있는 페이지로 context = {'name': name} return render(request, 'signup_complete.html', context) @@ -57,6 +57,5 @@ def post(self, request): class LogoutView(APIView): def post(self, request): - # 로그아웃은 클라이언트 측에서 JWT를 삭제하면 됩니다. logout(request) return Response({'message': 'Logged out.'})