{"id":303528,"date":"2020-05-13T15:01:10","date_gmt":"2020-05-13T15:01:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=303528"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=303528","title":{"rendered":"\u041f\u0438\u043b\u0438\u043c \u0432\u0435\u0431-\u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a \u043a\u0430\u043a \u0443 Meduza: \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/leader-id\/blog\/501570\/\">\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0433\u043e\u0440, \u044f Full-stack \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 Leader-ID. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u043c \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a\u0430 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0435\u0445, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Meduza. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u0431\u0430\u043b\u043b, \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0448\u0430\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0441\u043e\u0446\u0441\u0435\u0442\u0438. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b Django, DRF, Python \u0438 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7u\/zb\/_k\/7uzb_kbkkksnvvcvo-auqbxjjli.png\"><\/p>\n<p>  \u0412\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0421\u043f\u0443\u0441\u0442\u044f \u0447\u0430\u0441 \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u0438\u0440\u043f\u0438\u0447\u043d\u043e\u0439 \u043a\u043b\u0430\u0434\u043a\u0438 <s>(\u0437\u0430\u043b\u0438\u043f\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e)<\/s> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0443\u0441\u0442\u044f \u0434\u0435\u0441\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0431\u044b\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0414\u0436\u0430\u043d\u0433\u0435.<\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439, \u0442\u043e \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u043e\u0439\u0442\u0438 <a href=\"https:\/\/docs.djangoproject.com\/en\/3.0\/intro\/tutorial01\/\">Djnago tutorial<\/a>, \u0442\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043f\u0440\u043e\u0441\u0430. \u0418 \u0432\u0434\u043e\u0433\u043e\u043d\u043a\u0443 <a href=\"https:\/\/www.django-rest-framework.org\/tutorial\/quickstart\/\">DRF tutorial<\/a>, \u0447\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u043c\u0443.<\/p><\/blockquote>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b:<\/p>\n<ul>\n<li>Django 3.0.3. \u0414\u043b\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u0430;<\/li>\n<li>django-rest-framework. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f rest-api;<\/li>\n<li>Python;<\/li>\n<li>PostgreSQL \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0411\u0414;<\/li>\n<li>Front-end \u2014 Nuxt.js, Axios, Element-UI.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0448\u0430\u0433\u0430\u043c <\/h2>\n<p>  pip install Django \u2014 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>  django-admin startproject core \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0434\u0436\u0430\u043d\u0433\u0435.<\/p>\n<p>  cd core \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p>  python manage.py startapp pools \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 models.py \u0432 polls \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440 \u0434\u043b\u044f DRF.<\/p>\n<pre><code class=\"python\">class Question(models.Model):     title = models.CharField(max_length=4096)     visible = models.BooleanField(default=False)     max_points = models.FloatField()      def __str__(self):            return self.title  class Choice(models.Model):     question = models.ForeignKey(Question, on_delete=models.DO_NOTHING)     title = models.CharField(max_length=4096)     points = models.FloatField()     lock_other = models.BooleanField(default=False)      def __str__(self):         return self.title  class Answer(models.Model):     user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)     question = models.ForeignKey(Question, on_delete=models.DO_NOTHING)     choice = models.ForeignKey(Choice, on_delete=models.DO_NOTHING)     created = models.DateTimeField(auto_now_add=True)      def __str__(self):         return self.choice.title <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8c3\/7ba\/154\/8c37ba154bafe39cf5eec6dd3dbaac95.png\"><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0442\u0443\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"django\">from rest_framework import serializers from .models import Answer, Question, Choice   class ChoiceSerializer(serializers.ModelSerializer):     percent = serializers.SerializerMethodField()      class Meta:         model = Choice         fields = ['pk', 'title', 'points', 'percent', 'lock_other', ]      def get_percent(self, obj):         total = Answer.objects.filter(question=obj.question).count()         current = Answer.objects.filter(question=obj.question, choice=obj).count()         if total != 0:             return float(current * 100 \/ total)         else:             return float(0)   class QuestionSerializer(serializers.ModelSerializer):     choices = ChoiceSerializer(many=True, source='choice_set', )      class Meta:         model = Question         fields = ['pk', 'title', 'choices', 'max_points', ]   class AnswerSerializer(serializers.Serializer):     answers = serializers.JSONField()      def validate_answers(self, answers):         if not answers:             raise serializers.Validationerror(&quot;Answers must be not null.&quot;)         return answers      def save(self):         answers = self.data['answers']         user = self.context.user         for question_id, in answers:  # \u0442\u0443\u0442 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043b\u0438\u0448\u043d\u044f\u044f \u0437\u0430\u043f\u044f\u0442\u0430\u044f , \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435             question = Question.objects.get(pk=question_id)             choices = answers[question_id]             for choice_id in choices:                 choice = Choice.objects.get(pk=choice_id)                 Answer(user=user, question=question, choice=choice).save()                 user.is_answer = True                 user.save()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0435 \u0432\u044c\u044e\u0448\u043a\u0438 DRF \u0432 views.py, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0434\u0430\u044e\u0442 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u0441\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/265\/4f6\/b88\/2654f6b886c10a5bd003e382c484fe2b.png\"><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0442\u0443\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"django\">from .serializers import QuestionSerializer, AnswerSerializer from rest_framework.permissions import IsAuthenticated from rest_framework.generics import GenericAPIView from rest_framework.response import Response from .models import Question   class GetQuestion(GenericAPIView):     permission_classes = (IsAuthenticated,)     serializer_class = QuestionSerializer      def get(self, request, format=None):         questions = Question.objects.filter(visible=True, )         last_point = QuestionSerializer(questions, many=True)         return Response(last_point.data)   class QuestionAnswer(GenericAPIView):     permission_classes = (IsAuthenticated,)     serializer_class = AnswerSerializer      def post(self, request, format=None):         answer = AnswerSerializer(data=request.data, context=request)         if answer.is_valid(raise_exception=True):             answer.save()             return Response({'result': 'OK'}) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 urls.py:<\/p>\n<pre><code class=\"django\">urlpatterns = [     path('', GetQuestion.as_view()),     path('answer\/', QuestionAnswer.as_view()), ]<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 admin.py:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b3f\/f0e\/c5b\/b3ff0ec5b75f58c53d53b4ec217702b4.png\"><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0442\u0443\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"django\">from django.contrib import admin from .models import Question, Answer, Choice   class QuestionAdmin(admin.ModelAdmin):     list_display = (         'title',         'visible',         'max_points',     )   class ChoiceAdmin(admin.ModelAdmin):     list_display = (         'title',         'question',         'points',         'lock_other',     )     list_filter = ('question',)   class AnswerAdmin(admin.ModelAdmin):     list_display = (         'user',         'question',         'choice',     )     list_filter = ('user',)   admin.site.register(Question, QuestionAdmin) admin.site.register(Choice, ChoiceAdmin) admin.site.register(Answer, AnswerAdmin) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 settings.py (\u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 core) \u0432 INSTALLED_APPS \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 polls. \u0418 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<ul>\n<li>python manage.py makemigrations \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 <\/li>\n<li>python manage.py migrate \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u0432 \u0411\u0414<\/li>\n<li>python manage.py createsuperuser \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0443\u043f\u0435\u0440\u044e\u0437\u0435\u0440\u0430 (\u0430\u0434\u043c\u0438\u043d\u0430)<\/li>\n<li>python manage.py runserver \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440<\/li>\n<\/ul>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u0431\u0430\u043b\u043b \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u043c\u0435\u0442\u043e\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0441\u0447\u0435\u0442\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u043b\u043e\u0432. \u041a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f \u043d\u0435 \u0432\u044b\u043b\u043e\u0436\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c \u043d\u0430\u0448 \u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u00ab\u0432\u0435\u0441\u00bb.<\/p>\n<p>  \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (<a href=\"http:\/\/127.0.0.1:8000\">http:\/\/127.0.0.1:8000<\/a>\/admin \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043a \u043d\u0438\u043c, \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0430\u043b\u043b\u044b. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kd\/f2\/gk\/kdf2gky1wgn96cen49mmz9da6ss.png\"><\/p>\n<p>  \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438\u043c \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430\u043c \u0441\u043f\u0438\u0441\u043a\u0438 \u043b\u044e\u0434\u0435\u0439, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043e\u043f\u0440\u043e\u0441, \u0438 \u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u044b. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u2014 \u00ab\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b\u00bb. \u0422\u0430\u043a \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u044e\u0437\u0435\u0440\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0445 \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0411\u0414 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l5\/wd\/fo\/l5wdfosbz5rmfe2etlllyfoxxm0.png\"><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0440\u043e\u043d\u0442.<\/p>\n<p>  \u0412 \u043d\u0435\u043c \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0438 \u0441\u0442\u0438\u043b\u0435\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0431\u044d\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0430\u043b\u043b\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043b\u043b\u043e\u0432 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0431\u0430\u043b\u043b\u043e\u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c.<\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0432\u0441\u0435, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d: \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u043b\u043b\u043e\u0432 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u044e\u0448\u043a\u0438<\/h2>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b management command.<\/p>\n<p>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0435\u0449\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0440\u0438\u043d\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u043f\u0440\u043e\u0441\u0430 \u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. \u041e\u041a. \u041f\u0438\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0441 \u0431\u0430\u043b\u043b\u0430\u043c\u0438 \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0438 Facebook.<\/p>\n<p>  \u0413\u0435\u043d\u0435\u0440\u0438\u043c \u0441\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0445 \u0431\u0430\u043b\u043b\u044b, \u0434\u043b\u044f \u0412\u041a \u0438 Facebook \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f). \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0447\u0430\u0441\u0442\u0438. \u0421 \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0435 \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 image \u0441 \u043f\u0440\u044f\u043c\u044b\u043c URL-\u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043d\u0443\u0436\u043d\u043e\u0439. \u0410 \u0432\u043e\u0442 \u0441 Facebook \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043c\u0435\u0434\u0438\u0430 \u043f\u043e API, \u0438 \u0435\u0441\u043b\u0438 \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b image \u0438\u043b\u0438 picture \u0441 URL \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0442\u043e \u0432 \u043f\u043e\u0441\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435. \u041a\u0430\u043a \u043f\u043e\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0431\u0435\u0440\u0435\u0442 \u043e\u043d \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u044b (og:image) \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c (\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u0441\u0441\u044b\u043b\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 u). \u0410 \u0435\u0435, \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0447\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c. \u041c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0432 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a \u043d\u0430 \u0431\u044d\u043a\u0435, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c SPA (single page app) \u043d\u0430 SSR (server-side render) \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u0435\u043d\u044f\u043b\u0441\u044f url \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u0431\u0430\u043b\u043b\u043e\u043c \u0432 head-meta \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 JavaScript \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u0411\u043b\u0430\u0433\u043e, \u0432\u0437\u044f\u0442\u044b\u0439 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Nuxt.js \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c client-only \u0442\u0435\u0433\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043c\u0435\u043d\u044b head \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f query \u0431\u0430\u043b\u043b\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fba\/fda\/bfc\/fbafdabfcd1a30f0f8a825946f504604.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zk\/fq\/6m\/zkfq6m_h_ggdohwro3dhdkqvhci.png\"><\/div>\n<p>  \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c daemon \u0441\u0435\u0440\u0432\u0438\u0441, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0430 \u0441\u0442\u0430\u0442\u0438\u043a\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a \u0436\u0435 nginx\u0443. \u0412\u0441\u0435, \u043f\u0440\u043e\u0444\u0438\u0442!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/255\/7f6\/a64\/2557f6a645add5ef8b7797bbf505d9b4.png\"><\/p>\n<h2>\u041e\u0436\u0438\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a<\/h2>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u043e\u0441\u0430, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043a\u0430\u0437 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443. \u041e\u0442\u0432\u0435\u0442\u0438\u0432 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442, \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0418\u043d\u043e\u0433\u0434\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u0435\u043c\u0443 \u0437\u0430\u0434\u0430\u044e\u0442 \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u043c\u0438 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u0443 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0440\u044e\u043a \u043f\u043e \u043e\u0436\u0438\u0432\u043b\u0435\u043d\u0438\u044e \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/18\/sq\/3h\/18sq3hmdvlgrncanos4tax252wc.png\"><\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>  \u0422\u0430\u043a\u0438\u0435 \u043c\u0435\u0434\u0438\u0439\u043d\u044b\u0435 \u043e\u043f\u0440\u043e\u0441\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432 \u0445\u0432\u043e\u0441\u0442 \u0438 \u0432 \u0433\u0440\u0438\u0432\u0443: \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\/\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0430\u0439\u0442\u0430\u0445 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, welcome \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u044d\u0442\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e \u044d\u0442\u0438\u043c \u0434\u0432\u0443\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c: <a href=\"https:\/\/healthcare.leader-id.ru\/\">healthcare.leader-id.ru<\/a> \u0438 <a href=\"https:\/\/covid.leader-id.ru\/\">covid.leader-id.ru<\/a>.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/leader-id\/blog\/501570\/\"> https:\/\/habr.com\/ru\/company\/leader-id\/blog\/501570\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/leader-id\/blog\/501570\/\">\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0433\u043e\u0440, \u044f Full-stack \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 Leader-ID. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u043c \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a\u0430 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0435\u0445, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Meduza. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u0431\u0430\u043b\u043b, \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0448\u0430\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0441\u043e\u0446\u0441\u0435\u0442\u0438. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b Django, DRF, Python \u0438 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7u\/zb\/_k\/7uzb_kbkkksnvvcvo-auqbxjjli.png\"><\/p>\n<p>  \u0412\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-303528","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=303528"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303528\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=303528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=303528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=303528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}