• 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

Hosting forpsi easy 1 pln
0 głosów
159 wizyt
pytanie zadane 8 marca w Python przez tonn204 Mądrala (7,420 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 przez adrian17 Ekspert (337,400 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 przez tonn204 Mądrala (7,420 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 przez adrian17 Ekspert (337,400 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 przez tonn204 Mądrala (7,420 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 przez adrian17 Ekspert (337,400 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 przez tonn204 Mądrala (7,420 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 przez adrian17 Ekspert (337,400 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 przez tonn204 Mądrala (7,420 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 158 wizyt
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 16 kwietnia w Python przez tonn204 Mądrala (7,420 p.)
0 głosów
1 odpowiedź 152 wizyt

92,113 zapytań

140,777 odpowiedzi

317,757 komentarzy

61,435 pasjonatów

Advent of Code 2023

Top 15 użytkowników

  1. 1004p. - Łukasz Eckert
  2. 941p. - Mikbac
  3. 923p. - rucin93
  4. 893p. - Dawid128
  5. 878p. - CC PL
  6. 860p. - TheLukaszNs
  7. 856p. - Eryk Andrzejewski
  8. 841p. - nidomika
  9. 818p. - sefirek
  10. 785p. - the Bielsky
  11. 755p. - ikarek-one
  12. 749p. - Michal Drewniak
  13. 726p. - Arkadiusz Waluk
  14. 715p. - adrian17
  15. 713p. - Henry Saele
Szczegóły i pełne wyniki

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.

Uwaga - w dniach od 02.12 do 08.12 trwają Mikołajki (książki drukowane mają rabat -35%, ebooki do -45%). Zaś dodatkowy, specjalny kod zniżkowy: HELMIKOLAJ-10 dla naszych Widzów zapewni Wam oszczędność -10zł dla zamówień powyżej 70zł! Warto korzystać!

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...