Django регистрирует все запросы GET - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь поместить все запросы GET, которые появляются в консоли, в базу данных от django.Например:

консольный журнал:

[23/May/2019 13:58:44] "GET /testapp/ HTTP/1.1" 200 409
[23/May/2019 13:58:45] "GET /testapp/page2/ HTTP/1.1" 200 172

Я пытаюсь получить из него временную метку, URL страницы и имя пользователя и поместить в базу данных, поэтому записи выглядят примерно такв базе данных:

id  user    pageURL        timeStamp
96  naeem   /testapp/       2019-05-23 09:37:12.640613
97  naeem   /testapp/page2/ 2019-05-23 09:37:13.317271

Это код, который я написал для промежуточного программного обеспечения:

from TestApp.models import ActivityLog


class AccessLogs(object):

    # One-time config
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        # Add the user and page info into DB
        try:
            ActivityLog(user=request.user, pageURL=request.path).save()
        except Exception as e:
            print(e)

        return response

Проблема в том, что он дает мне желаемый результат, но он не получаетрезультаты, если я нажму на загружаемый файл или изображение.Как у меня есть статическое изображение на веб-сайте, которое загружается при нажатии, например:

<a href="{% static 'TestApp/media/cat.jpg' %}" download>Click here to open image</a>

Так что, если я нажму на это, в консоли будет показано, что изображение было загружено, но оно не помещаетсячто в базе данных.Есть ли способ сделать эту работу?Любая помощь будет оценена!

РЕДАКТИРОВАТЬ : settings.py:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = ''

DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestApp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'TestApp.middleware.LoggingMiddleware.AccessLogs',
]

ROOT_URLCONF = 'Test.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'Test.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'
MEDIA_URL = '/media/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'media')
]

Модели:

from django.db import models

class ActivityLog(models.Model):
    user = models.CharField(max_length=1024)
    pageURL = models.CharField(max_length=1024)
    timeStamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "activity_logs"

EDIT2 : Файл, к которому я пытаюсь получить доступ, хранится в TestWebsite / TestApp / static / TestApp / media / cat.jpg

TestWebsite / TestApp / url.py:

from django.urls import path

from . import views

urlpatterns = [
    path('', views.homePage, name='homePage'),
    path('page2/', views.homePage2, name='homepage2')
]

TestWebsite/TestWebsite/urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve
from django.views.decorators.cache import never_cache

nocache_serve = never_cache(serve)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('testapp/', include('TestApp.url')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT, view=nocache_serve)

TestWebsite / TestApp / views.py:

from django.shortcuts import render, HttpResponse
import datetime

def homePage(request):
    time = datetime.datetime.now()
    return render(request, "TestApp/homePage.html", {"time": time})

def homePage2(request):
    return render(request, "TestApp/homePage2.html")

1 Ответ

1 голос
/ 23 мая 2019

Хорошо, теперь я пытаюсь объяснить вам, что случилось.В целом Django's Middleware созданы для эффективного управления запрос / ответ .У него есть свои фазы (process_request(), process_view(), process_response()) и так далее.Каждый раз, когда запрос поступает на сервер, вызывается Middleware (но это происходит не каждый раз при обслуживании статических файлов).Это из-за поведения кеширования.Django кэши статические / медиа файлы в кэше браузера (с использованием заголовка Cache-Control).Когда ресурс кэшируется, при следующем запросе ресурс считывается из кэша браузера, и запрос не достигает сервера.Django использует from django.views.static import serve метод для обслуживания статических / мультимедийных файлов.(Этот метод устанавливает правильные HTTP заголовки для кэширования).

В вашем urls.py добавьте эти строки.Здесь это самое важное.

from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve
from django.views.decorators.cache import never_cache

nocache_serve = never_cache(serve) # never_cache is view decorator. we can use here, also. This will set correct HTTP headers to avoid caching behaviour.
urlpatterns = [
    #
    # your path goes here
    #
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT, view=nocache_serve)

settings.py

# I think you already have this configuration in settings.
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'media')
]

Теперь вы можете регистрировать все входящие запросы (но не забывайте, чтобы избежать кэширования ).static / media файлы - плохая идея).

Не забудьте очистить кеш браузера и перезапустить сервер после добавления этого кода.

Надеюсь, это поможет.

...