• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak stworzyć sesję w widoku klasowym? Django

Object Storage Arubacloud
0 głosów
213 wizyt
pytanie zadane 8 marca 2023 w Python przez tonn204 Mądrala (7,440 p.)

Chce aby użytkownik po dodaniu posta na blog i przeniesieniu na stronę gdzie wyświetla się treść  nie miał możliwości z powrotem wrócić do strony tworzenia. Wiem że mogę taki efek osiągnąć używając sesji. Umiem zrobić sesję w zwykłm widoku tworzonym z funkcji ale ja używam widoków klasowych.  Zwykłe request.sessions nawet osadzone w funkcji dispatch czy get nie działa. Próbowałem też użyć api do zarządzanie sesjami poza widokiem , ale tutaj z kolei dostaje błąd taki jak poniżej. Co mam zrobić żeby to działało?

Błąd

DoesNotExist at /post/10/
Session matching query does not exist.
Request Method:	GET
Request URL:	http://127.0.0.1:8000/post/10/
Django Version:	4.1.7
Exception Type:	DoesNotExist
Exception Value:	
Session matching query does not exist.
Exception Location:	D:\Python\lib\site-packages\django\db\models\query.py, line 650, in get
Raised during:	blog.views.PostDetailView
Python Executable:	D:\Python\python.exe
Python Version:	3.9.13

Kod

class PostDetailView(DetailView):
    model = Post

    def dispatch(self, request, *args, **kwargs):
        session = Session.objects.get(pk='my_key')
        return super(DetailView, self).dispatch(request, *args, **kwargs)


class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content']

    def dispatch(self, request, *args, **kwargs):
        s = SessionStore(session_key='my_key')
        s['filled'] = True
        s.create()
        return super(CreateView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

 

1 odpowiedź

+1 głos
odpowiedź 8 marca 2023 przez adrian17 Ekspert (344,860 p.)

Zwykłe request.sessions nawet osadzone w funkcji dispatch czy get nie działa

W widokach klasowych, `request` jest polem klasy. Więc z tego co wiem, wystarczy `self.request.session[...] = ...`.

komentarz 8 marca 2023 przez tonn204 Mądrala (7,440 p.)

Faktycznie działa ja zamiast używać 'session' pisałem 'sessions'. Napotkałem tylko kolejny problem odośnie implementacje tego co opisałem w pytaniu. Po stworzeniu nowego postu autor przekierowany jest na stronę, któa wyświetal post w formie dla widzianej dla przeciętnego użytkownika. Teraz gdy klika przycisk w przeglądarce aby cofnąć się ma możliwośc żeby znowu zobaczyć formę wypełnioną tymi samymi danymi których przed chwilą użył do stworzenia postu. Co mogę zrobić żeby temu zapobiec. Próbowałem to zrobić za pomocą sesji tak jak ale gdy użytkownik się cofa przeglodarka nie wykonuje już rządania get więc moja sesja jest bezużyteczna. Co mogę jeszcze zrobić?

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content']

    def get(self, request, *args, **kwargs):
        print(self.request.session['filled'])
        if self.request.session['filled']:
            return redirect('blog-home')

        return super().get(self, request, *args, **kwargs)

    def form_valid(self, form):
        form.instance.author = self.request.user
        self.request.session['filled'] = True
        print('after subbmiting ' + str(self.request.session['filled']))
        return super().form_valid(form)


def home(request):
    context = {
        'posts': Post.objects.all()
    }
    request.session['filled'] = False
    print(request.session['filled'])
    return render(request, 'blog/home.html', context)

 

1
komentarz 8 marca 2023 przez adrian17 Ekspert (344,860 p.)

Teraz gdy klika przycisk w przeglądarce aby cofnąć się ma możliwośc żeby znowu zobaczyć formę wypełnioną tymi samymi danymi których przed chwilą użył do stworzenia postu. Co mogę zrobić żeby temu zapobiec

Z tego co kojarzę to nie trzeba do tego się bawić z sesjami, wystarczy ustawić nagłówek żeby przeglądarka nie cache'owała tamtej zawartości.

Na przykład dodając dekorator `@cache_control(no_cache=True, must_revalidate=True, no_store=True)` na metodzie dispatch().

komentarz 9 marca 2023 przez tonn204 Mądrala (7,440 p.)

Faktycznie nie wiedziałem, że jest taka opcja w Django. Mam tylko problem z włączeniem casche'a. Mam ustawiony plik setting.py tak jak poniżej i włączoany program memcasched a dostaję bład taki jak niżej. Poprawnie łąduje mi się tylko strona logowania. O co może chodzić?

Kod

"""
Django settings for django_blog project.

Generated by 'django-admin startproject' using Django 4.1.7.

For more information on this file, see
https://docs.djangoproject.com/en/4.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.1/ref/settings/
"""
import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-tuam6d*(d-o%$ap3*tw44a@g#@$!l&l#+qtm65qptpnsk^gfv6'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'blog.apps.BlogConfig',
    'users.apps.UsersConfig',
    'crispy_forms',
    'crispy_bootstrap5',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ckeditor',
]

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',
    'users.middleware.SimpleMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]

ROOT_URLCONF = 'django_blog.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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 = 'django_blog.wsgi.application'


# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators

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',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/

STATIC_URL = 'static/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap5'
CRISPY_TEMPLATE_PACK = 'bootstrap5'

LOGIN_REDIRECT_URL = 'blog-home'
LOGIN_URL = 'login'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASSWORD')
EMAIL_PORT = 587
EMAIL_USE_TLS = True

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHE_MIDDLEWARE_ALIAS = 'default'  # The cache alias to use for storage and 'default' is **local-memory cache**.
CACHE_MIDDLEWARE_SECONDS = '600'    # number of seconds before each page is cached
CACHE_MIDDLEWARE_KEY_PREFIX = ''

Błąd który wyświetla się w przeglądarce:

TypeError at /
'<' not supported between instances of 'str' and 'int'
Request Method:	GET
Request URL:	http://127.0.0.1:8000/
Django Version:	4.1.7
Exception Type:	TypeError
Exception Value:	
'<' not supported between instances of 'str' and 'int'
Exception Location:	D:\Python\lib\site-packages\django\utils\cache.py, line 280, in patch_response_headers
Raised during:	blog.views.home
Python Executable:	D:\Python\python.exe
Python Version:	3.9.13
Python Path:	
['D:\\django learning\\django_blog',
 'D:\\Python\\python39.zip',
 'D:\\Python\\DLLs',
 'D:\\Python\\lib',
 'D:\\Python',
 'C:\\Users\\usr\\AppData\\Roaming\\Python\\Python39\\site-packages',
 'D:\\Python\\lib\\site-packages']
Server time:	Thu, 09 Mar 2023 21:20:30 +0000

 

komentarz 9 marca 2023 przez adrian17 Ekspert (344,860 p.)

Mam tylko problem z włączeniem casche'a.

Chwila, ale ja nie mówiłem o włączaniu jakiegokolwiek cache'a po stronie serwera.

komentarz 10 marca 2023 przez tonn204 Mądrala (7,440 p.)
Ale żeby używał tych dekoratorów to muszę go włączyć bo inaczej one nie działają tj. mogę ich użyć w kodzie ale nia mają żadnego wpływu na to co się dzieje na stronie.
komentarz 10 marca 2023 przez adrian17 Ekspert (344,860 p.)
AFAIK ten dekorator po prostu dodaje nagłówki do odpowiedzi, żeby to _przeglądarka_ wiedziała żeby nie cahce'ować. To nie ma związku z cachem po stronie serwera.
komentarz 12 marca 2023 przez tonn204 Mądrala (7,440 p.)
Rozuemiem, ale własnie u mnie to na nic nie wpływa jak się cofam do strony gdzie była forma  z danymi to one dalej tam są.

Podobne pytania

0 głosów
2 odpowiedzi 243 wizyt
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 16 kwietnia 2023 w Python przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 162 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...