diff --git a/blog/comments/services.py b/blog/comments/services.py new file mode 100644 index 0000000..3ef0892 --- /dev/null +++ b/blog/comments/services.py @@ -0,0 +1,14 @@ +import base64 + + +def encode_nickname(nickname: str) -> bytes: + """Кодирует nickname в base64.""" + return base64.b64encode(bytes(nickname, "utf-8")) + + +def decode_nickname(encoded_nickname: str) -> str: + """Декодирует base64, содержащийся в строке encoded_nickname. """ + + # пришлось отрезать кусок b из самой строки, потому что байты были + # всунуты в строку, и base64 не понимал + return base64.b64decode(encoded_nickname[1:]).decode() diff --git a/blog/comments/views.py b/blog/comments/views.py index 88918bc..3351516 100644 --- a/blog/comments/views.py +++ b/blog/comments/views.py @@ -8,6 +8,7 @@ from django.db import IntegrityError import hashlib from typing import Union +from . import services def leave_comment(request, post_id): @@ -36,7 +37,7 @@ def leave_comment(request, post_id): # если секрет не совпал, то польозхватель Anonym author = get_or_create_author(request.POST["name"], request.POST["secret"]) - nickname = request.POST["name"] + nickname = request.POST["name"].strip() if not author: post.comment_set.create( @@ -52,7 +53,7 @@ def leave_comment(request, post_id): reply=parent, ) response = HttpResponseRedirect(reverse("posts:detail", args=(post.id,))) - response.set_cookie("nickname", nickname, max_age=300) + response.set_cookie("nickname", services.encode_nickname(nickname), max_age=300) return response @@ -66,7 +67,7 @@ def get_or_create_author(name: str, secret: str) -> Union[CommentAuthor, None]: try: author, result = CommentAuthor.objects.get_or_create( - author_name=name, author_secret_hash=hash + author_name=name.strip(), author_secret_hash=hash ) except IntegrityError: # если имя/хеш не совпадают, то игнорируем такого автора и отображаем ником diff --git a/blog/posts/views.py b/blog/posts/views.py index feae15a..60c5b76 100644 --- a/blog/posts/views.py +++ b/blog/posts/views.py @@ -4,7 +4,7 @@ from django.http import HttpResponse from .models import Post from comments.models import Comment -import re +from comments import services as comments_services def index(request): @@ -16,12 +16,14 @@ def index(request): def detail(request, post_id): """Страница с просмотром поста.""" # вынести отсюда все. Также надо обработать текст поста тут. + post = get_object_or_404(Post, pk=post_id) comments = post.comment_set.all() comments_count = comments.count() - nickname = ( - request.COOKIES.get("nickname") if request.COOKIES.get("nickname") else "" - ) + + _nickname = request.COOKIES.get("nickname") + nickname = comments_services.decode_nickname(_nickname) if _nickname else "" + return render( request, "posts/post.html",