Evgenii Legotckoi
Evgenii LegotckoiНаурыз 19, 2023, 10:56 Т.Ж.

Django - Оқулық 061. Бірегей көріністер санын қосу

Форумда мақалалар мен сұрақтарды құрудың басында мен осы мазмұнға қарапайым көзқарастар есептегішін қостым.
Бұл санауыш бүтін түрдегі кәдімгі өріс болды және бет сұралған сайын ол біреуге ұлғайып отырды.
Бірақ жақында мен бұл есептегішті бірегей көріністерді тіркеуге арналған есептегіш үлгісімен ауыстырдым. Мен мұны әдемірек деп ойлағандықтан жасадым.

Есептегіш бірегей кірушілерді IP мекенжайы бойынша, егер пайдаланушы сайтта рұқсат етілмеген болса, немесе осы пайдаланушы сайтта рұқсат етілген болса, пайдаланушы тіркелгісі бойынша санайды.

Ендеше мұны қалай жасау керектігін үйренейік.

Қарау үлгісі

Сайтты қараған бірегей пайдаланушыларды санауға жауапты.

class Viewer(models.Model):
    ipaddress = models.GenericIPAddressField("IP address", blank=True, null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True)

Көріп отырғаныңыздай, бұл модельде тек екі өріс бар, біріншісі - IP мекенжайы, екіншісі - пайдаланушы үлгісінің сыртқы кілті

Мазмұн үлгісіне есептегішті қосу

Ал енді кейбір сайт мазмұны үлгісіне есептегішті қосамыз, мысалы, мақала үлгісіне Мақала

class Article(models.Model):
    viewers = models.ManyToManyField(Viewer)

    # Some another code

Код қосу «Көптен көпке» қатынасы ретінде орындалады. Өйткені бұл жағдайда бірегей келуші біреу болады, бірақ ол көптеген басқа мақалаларды көре алады. Сонымен қатар, мақаланы көптеген басқа пайдаланушылар көре алады.

Мазмұнды қарау есептегішін қалай арттыруға болады

Сірә, кейбір қарау класы немесе көру функциясы сайтыңыздағы мақалаларды көрсетуге жауапты болады. Жеке өзім Джангода заманауи Сыныпқа негізделген көрініс қолданғым келеді.

Сондықтан мен сайттағы мазмұнның бірегей көріністерін тіркеу үшін DetailView көмегімен пайдалануға болатын миксин жазамын.

class CountViewerMixin:

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        if hasattr(self.object, 'viewers'):
            viewer, created = Viewer.objects.get_or_create(
                ipaddress=None if request.user.is_authenticated else get_client_ip(request),
                user=request.user if request.user.is_authenticated else None
            )

            if self.object.viewers.filter(id=viewer.id).count() == 0:
                self.object.viewers.add(viewer)

        return response

Кодтан миксиннің get әдісін жоққа шығаратынын, мазмұн нысанының Көріністе бар екенін тексеретінін және содан кейін ғана бірегей келушіні алатынын және келушінің көрушілер арасында әлі жоқ екенін тексергеннен кейін көруге болады. мазмұн, оны мазмұн көріністеріне қосады.

Осылайша, мазмұн үлгісіндегі бүтін өріс түріндегі есептегішке қарағанда мазмұн нысанының өзі өзгертілмейді. Егер сізде мазмұн үлгісін сақтау әдісін қайта анықтау болса немесе үлгіден сақтау сигналдарын өңдеу үшін қабылдағыш функцияларын жазған болсаңыз, кодты қиындатуы мүмкін. Осы мақалада берілген Көруші есептегіші жағдайында мазмұн үлгісіндегі post_save сияқты сигналдар жай жұмыс істемейді.

Мазмұн көрінісінде араластыру қосылымы келесідей болады:

class ArticleView(CountViewerMixin, DetailView):
    # some another code

Үлгіде пайдалану

Үлгі ішінде сіз келесідей көріністер санын ала аласыз

{{ object.viewers.count }}

клиент_ipін алу

Миксиннің HTTP сұрауынан IP мекенжайын алу функциясы да бар. Мен бұл арнайы функцияны [мақалалардың біріндегі сұраудан пайдаланушының IP мекенжайын алу] үшін сипаттадым (https://evileg.com/ru/post/181/).

Менің Django 3-ке арналған соңғы редакциямда ол осылай көрінеді.

def get_client_ip(request):
    """
    Get client ip address from HTTP request

    :param request: HTTP request
    :return: IP Address
    """
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    return x_forwarded_for.split(',')[-1].strip() if x_forwarded_for else request.META.get('REMOTE_ADDR')

Қорытынды

Мұндай есептегіш мазмұнды сақтауға реакцияларыңыз болса, кодты сақтауды жеңілдетеді, сонымен қатар мазмұн есептегіштеріне алдаулардың әсерін азайтады.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 11:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 9:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 9, 2024, 5:43 Т.Ж.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 12:50 Т.Қ.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 2:15 Т.Қ.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 11 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 3:46 Т.Қ.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 3, 2024, 12:07 Т.Ж.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз