質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

9001閲覧

Django views.pyに記述される変数について

a-zu

総合スコア13

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2017/07/07 06:30

編集2017/07/07 08:36

###vews.pyの変数について
大変失礼致します。

現在、勉強も兼ねてDjangoを使ってwebサイトを構築しているのですが、リクエストで呼び出されている度にviews.pyのグローバル変数が再定義されているのですが、永続的な変数を定義したい場合等はsetting.py等に記述すればよろしいのでしょうか。

駄文で申し訳ありませんが、どなたかご回答のほどよろしくお願い致します。


追記

大変失礼致しました。

views.py

# -*- coding:utf-8 -*- from shop.models import Product from django.shortcuts import render productList = Product.object.all() accessCount = 0; def viewProductList(request): accessCount += 1 return render(request, "viewProductList.html", productList)

viewProductList.html

<html> <head> <title>Product List Page</title> </head> <body> {% for d in data %} <h1>{{ d.name }}</h1> <h1>{{ d.detailText }}</h1> {% endfor %} </body> </html>

models.py

# -*- coding:utf-8 -*- from django.db import models class Product(models.Model): name = models.CharField(max_length=255) detailText = models.CharField(max_length=1000)

上記がコードになります。

ご指摘等があれば、何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimizukawa

2017/07/07 08:00

場合に依ります。コードを提示してください
guest

回答1

0

ベストアンサー

Webサーバーのプロセスは任意のタイミングで再起動します。このため、グローバル変数になにかを記録しておいて使い回すというやり方は出来ません。

提示されたコードであれば以下の様に書きます(accessCountは使ってないようなので一旦無視)。

Python

1from shop.models import Product 2from django.shortcuts import render 3 4 5def viewProductList(request): 6 7 productList = Product.object.all() 8 return render(request, "viewProductList.html", productList)

このページがすぐには更新されないのでproductListを何度も再取得したくない、ということであれば、以下のようにview関数の結果自体をcacheします。

Python

1from django.views.decorators.cache import cache_page 2from shop.models import Product 3from django.shortcuts import render 4 5 6def get_products(): 7 8@cache_page(60 * 15) # cache in 15 minutes 9def viewProductList(request): 10 productList = Product.object.all() 11 return render(request, "viewProductList.html", productList)

いやいや、ページ自体は再描画が必要で、productListの再取得だけ減らしたい、ということであれば、cacheを以下のように利用します。

Python

1import functools 2 3from shop.models import Product 4from django.shortcuts import render 5 6 7@functools.lru_cache() 8def get_products(): 9 return list(Product.object.all()) 10 11 12def viewProductList(request): 13 return render(request, "viewProductList.html", productList)

ただし、このキャッシュは時間で破棄されず、プロセスが生きている間ずっと効いてしまいます。最初に提示されていたコードと同じ挙動なので、これもありなのかもしれません。

時間でキャッシュしたければ、Djangoのキャッシュ機構を使えます。

Python

1from django.core.cache import cache 2 3from shop.models import Product 4from django.shortcuts import render 5 6 7def viewProductList(request): 8 productList = cache.get('productList') 9 if productList is None: 10 productList = list(Product.object.all()) 11 cache.set('productList', productList, 60 * 15) # cache in 15 minutes 12 13 return render(request, "viewProductList.html", productList)

Djangoのcacheはプロセスのメモリ内だったり、外部のデータストアだったり、設定次第でデータを置く場所を決められます。このため、memcachedなどの外部データストアにキャッシュを置けば、Webサービスが複数のプロセスで動作している場合にもキャッシュを共有できます。

最初に除外した、accessCountもcacheに置いてアクセス毎に1つ値を上げる、という使い方ができるようになります。

ここまで紹介したcacheというものは、どれも「一時的なもの」でしかないので、何かのタイミングで消えてしまいます。productListは時間で消えてくれないと永遠に最初に取得した商品一覧しか表示出来ないので時間で消したいですが、accessCountは増加し続けて欲しいので消えられると困る、といったデータの特性によってキャッシュが良いのかDBが良いのかを判断して置き場所を決めることになります。

使い方が楽そうなのは、cacheバックエンドをRedisにして、productListは時間でキャッシュを消す設定で使い、accessCountは永続データとしてキャッシュタイムアウトなしで保存する、という方法でしょう。ただし、外部データストアのサーバーを起動する必要があるので、準備の手間はちょっと増えます。

参考:

投稿2017/07/07 13:28

shimizukawa

総合スコア1847

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問