Skip to content

Commit 25c2e77

Browse files
Merge pull request #6 from RustamovAkrom/main
Main
2 parents bc6483b + cfb1938 commit 25c2e77

File tree

159 files changed

+288
-31960
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+288
-31960
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,5 @@ GitHub.sublime-settings
139139

140140
# private_key.pem
141141
# public_key.pem
142+
143+
db.sqlite3

apps/blog/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class HomePageView(TemplateView):
4141
template_name = "blog/home.html"
4242

4343
def get(self, request):
44-
if request.user and request.user.is_authenticated:
44+
if request.user is not None and request.user.is_authenticated:
4545
posts = Post.objects.exclude(author=request.user)
4646
else:
4747
posts = Post.objects.all()

apps/shared/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import os
2+
3+
from dotenv import load_dotenv
4+
load_dotenv()
5+
6+
from django.contrib.auth import get_user_model
7+
from django.core.management.base import BaseCommand
8+
9+
10+
ADMIN_USERNAME = str(os.getenv("ADMIN_USERNAME"))
11+
ADMIN_PASSWORD = str(os.getenv("ADMIN_PASSWORD"))
12+
ADMIN_EMAIL = str(os.getenv("ADMIN_PASSWORD"))
13+
14+
15+
class Command(BaseCommand):
16+
def handle(self, *args, **options):
17+
User = get_user_model()
18+
self.create_superuser(User, ADMIN_USERNAME, ADMIN_EMAIL, ADMIN_PASSWORD)
19+
def create_superuser(self, User, username, email, password):
20+
if not User.objects.filter(username=username).exists():
21+
User.objects.create_superuser(username, email, password)
22+
self.stdout.write(
23+
self.style.SUCCESS(f"Superuser {username} created successfully.")
24+
)
25+
else:
26+
self.stdout.write(
27+
self.style.ERROR(f"Superuser {username} already exists.")
28+
)

apps/users/forms.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,36 @@
66

77
class LoginForm(forms.Form):
88
username = forms.CharField(
9-
max_length=28,
9+
max_length=150,
1010
widget=forms.TextInput(
1111
attrs={"placeholder": "Username...", "class": "form-control rounded-4"}
1212
),
13+
error_messages={
14+
"required": "Username is required!",
15+
'max_length': "Username is too lang, max length is 150 charecters."
16+
}
1317
)
1418
password = forms.CharField(
1519
max_length=60,
1620
widget=forms.PasswordInput(
1721
attrs={"placeholder": "Password...", "class": "form-control rounded-4"}
1822
),
23+
error_messages={
24+
"required": "Password is required!",
25+
"max_length": "Password is to long, max length is 60 charecters."
26+
}
1927
)
2028

2129

2230
class RegisterForm(forms.ModelForm):
2331
password1 = forms.CharField(
32+
label="Password",
2433
max_length=28,
2534
widget=forms.PasswordInput(attrs={"id": "password", "type": "password"}),
35+
2636
)
2737
password2 = forms.CharField(
38+
label="Password (Confirm)",
2839
max_length=28,
2940
widget=forms.PasswordInput(attrs={"id": "password", "type": "password"}),
3041
)
@@ -39,7 +50,7 @@ def save(self, commit=True):
3950
user.set_password(password1)
4051
user.save()
4152
else:
42-
raise ValidationError("Password must be match")
53+
return ValidationError("Passwords must be match!")
4354

4455
def __init__(self, *args, **kwargs):
4556
super().__init__(*args, **kwargs)

apps/users/middleware.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from rest_framework_simplejwt.tokens import AccessToken
1+
from rest_framework_simplejwt.tokens import AccessToken, TokenError
22
from django.utils.deprecation import MiddlewareMixin
33
from django.contrib.auth import get_user_model
4+
from django.contrib.auth.models import AnonymousUser
5+
from django.core.cache import cache
46

57

68
User = get_user_model()
@@ -10,11 +12,20 @@ class JWTAuthMiddleware(MiddlewareMixin):
1012
def process_request(self, request):
1113
access_token = request.COOKIES.get("access_token")
1214

13-
if access_token:
14-
try:
15-
token = AccessToken(access_token)
16-
user_id = token['user_id']
17-
request.user = User.objects.get(id=user_id)
18-
except Exception as e:
19-
request.user = None
20-
15+
if not access_token:
16+
request.user = AnonymousUser()
17+
18+
cached_user = cache.get(access_token)
19+
if cached_user:
20+
request.user = cached_user
21+
return
22+
23+
try:
24+
token = AccessToken(access_token)
25+
user_id = token['user_id']
26+
user = User.objects.get(id=user_id)
27+
28+
cache.set(access_token, user, timeout=60 * 15)
29+
request.user = user
30+
except (TokenError, User.DoesNotExist):
31+
request.user = AnonymousUser()

apps/users/views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ def get(self, request):
2020

2121
def post(self, request):
2222

23-
form = RegisterForm(request.POST, request.FILES)
23+
form = RegisterForm(request.POST)
2424

2525
if form.is_valid():
2626
form.save()
2727
messages.success(request, "User succesfully registered")
2828
return redirect(reverse("users:login"))
2929

30-
messages.warning(request, "Error registered!")
30+
messages.warning(request, "Invalid registration fields!")
3131
return render(request, "auth/register.html", {"form": form})
3232

3333

@@ -43,6 +43,7 @@ def post(self, request):
4343
if form.is_valid():
4444
username = form.cleaned_data.get("username")
4545
password = form.cleaned_data.get("password")
46+
4647
user = authenticate(username=username, password=password)
4748

4849
if user is not None:
@@ -58,7 +59,7 @@ def post(self, request):
5859
response.set_cookie("access_token", access_token, httponly=True)
5960
response.set_cookie("refresh_token", refresh_token, httponly=True)
6061

61-
messages.info(request, f"You are logged in as { username }")
62+
messages.success(request, f"You are logged in as { username }")
6263
return response
6364

6465
else:

core/config/apps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@
2121
"rest_framework",
2222
"rest_framework_simplejwt",
2323
"rest_framework_simplejwt.token_blacklist",
24+
2425
]

core/config/jwt.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
from datetime import timedelta
44

5+
from dotenv import load_dotenv
6+
load_dotenv()
57

6-
with open(str(os.getenv("PRIVATE_KEY_PATH", "security_settings/private_key.pem")), "r") as f:
8+
with open(str(os.getenv("PRIVATE_KEY_PATH")), "r") as f:
79
PRIVATE_KEY = f.read()
810

9-
with open(str(os.getenv("PUBLIC_KEY_PATH", "security_settings/public_key.pem")), "r") as f:
11+
with open(str(os.getenv("PUBLIC_KEY_PATH")), "r") as f:
1012
PUBLIC_KEY = f.read()
1113

1214

@@ -32,6 +34,6 @@
3234
"TOKEN_TYPE_CLAIM": "token_type",
3335
"JTI_CLAIM": "jti",
3436
"SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
35-
"SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
37+
"SLIDING_TOKEN_LIFETIME": timedelta(seconds=1),
3638
"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
3739
}

0 commit comments

Comments
 (0)