malyshevadv / api_yamdb Goto Github PK
View Code? Open in Web Editor NEWapi_yamdb
api_yamdb
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/urls.py
router.register(r'titles', TitleViewSet, basename='titles')
r нужны для регулярок, давай уберём их оттуда, где их нет
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/reviews/admin.py
Давайте побольше в админке возможностей сделаем)
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/serializers.py
def validate_username(self, value):
if value in self.BANED_USERNAMES:
raise serializers.ValidationError(
'Использовать имя "{}" в качестве username запрещено.'.format(
А почему не f-строкой? :(
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
@api_view(['POST'])
@permission_classes([AllowAny])
def get_token(request):
"""Получение JWT-токена.
Если полученный код подтверждения валиден - отправляет юзеру JWT-токен.
"""
serializer = TokenSerializer(data=request.data)
if serializer.is_valid():
Тут тоже стоит добавить исключение и проверять обратное условие
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
def send_confirmation(user):
"""Отправляет письмо пользователю."""
confirmation_code = default_token_generator.make_token(user)
send_mail(
'Email confirmation',
f'Ваш код для подтверждения почты: {confirmation_code}',
'[email protected]',
Стоит этот email ([email protected]) задать в настройках проекта
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/serializers.py
def validate(self, attrs):
if self.context['request']._request.method == 'POST':
Давай не будем создавать большой вложенный блок и проверим обратное условие
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
@api_view(['POST'])
@permission_classes([AllowAny])
def get_token(request):
"""Получение JWT-токена.
Если полученный код подтверждения валиден - отправляет юзеру JWT-токен.
"""
serializer = TokenSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
К строке if serializer.is_valid(raise_exception=True):
Можно не использовать if, просто пишем эту строку и будем знать, что если что-то не так - то выбросится исключение, если нет - идём дальше, всё норм
https://www.django-rest-framework.org/api-guide/exceptions/#validationerror
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
api_view(['POST'])
@permission_classes([AllowAny])
def signup(request):
"""Регистрация пользователя.
Создает нового пользователя, отправляет на указанный email код
подтверждения.
Если пользователь с полученными username и email уже существует -
отправляет ему код подтверждения.
"""
user = User.objects.filter(
username=request.data.get('username'),
email=request.data.get('email')
).first()
if user:
send_confirmation(user)
return Response('Мы отправили код подтверждения на вашу почту.',
status=status.HTTP_200_OK)
else:
serializer = SignUpSerializer(data=request.data)
if serializer.is_valid():
для if serializer.is_valid():
Вот тут лучше сделать так:
https://www.django-rest-framework.org/api-guide/exceptions/#validationerror
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/filters.py
class Meta:
model = Title
fields = ['name', 'year', 'genre', 'category', ]
Комментарий
fields = ['name', 'year', 'genre', 'category', ] - Давай такие значения в tuple заносить, они неизменяемые, меньше памяти занимают, со всех сторон подходят в общем)
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
class CategoryViewSet(ModelViewSet):
serializer_class = CategorySerializer
queryset = Category.objects.all()
permission_classes = [
(IsAuthenticated & IsAdmin) | ReadOnly
]
pagination_class = PageNumberPagination
filter_backends = [SearchFilter]
search_fields = ['name', ]
def retrieve(self, request, **kwargs):
А может другим способом запретим ненужные методы? Миксинами, например :)
class GenreViewSet(ModelViewSet):
serializer_class = GenreSerializer
queryset = Genre.objects.all()
permission_classes = [
(IsAuthenticated & IsAdmin) | ReadOnly
]
pagination_class = PageNumberPagination
filter_backends = [SearchFilter]
search_fields = ['name', ]
def retrieve(self, request, **kwargs):
И тут)
class TitleViewSet(ModelViewSet):
queryset = Title.objects.all().annotate(rating=Avg('reviews__score'))
Красота!
Отлично
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/api/views.py
def signup(request):
"""Регистрация пользователя.
Создает нового пользователя, отправляет на указанный email код
подтверждения.
Если пользователь с полученными username и email уже существует -
отправляет ему код подтверждения.
"""
user = User.objects.filter(
username=request.data.get('username'),
email=request.data.get('email')
).first()
if user:
send_confirmation(user)
return Response('Мы отправили код подтверждения на вашу почту.',
status=status.HTTP_200_OK)
else:
После return не нужен else
https://github.com/malyshevadv/api_yamdb/blob/master/api_yamdb/reviews/models.py
class Title(models.Model):
name = models.CharField(max_length=256)
year = models.PositiveIntegerField('Год издания')
Нужно валидировать, что не больше текущего :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.