Djangoプロフィール画面とFastDFSカスタムストレージの実装

プロフィール画面に必要なデータ

マイページには「ユーザー名」「住所」「最近見た商品」が必要です。

  • 住所は Address モデルから request.user.address_set.latest('create_time') で取得
  • 閲覧履歴は Redis のリスト型で保存し、ログアウト後も保持

Redis キー設計

history_<user_id> = [sku_id, sku_id, ...]

ビュー実装

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
from django.shortcuts import render
from django_redis import get_redis_connection
from goods.models import GoodsSKU, Address

class ProfileView(LoginRequiredMixin, View):
    def get(self, request):
        user = request.user
        try:
            latest_addr = user.address_set.latest('create_time')
        except Address.DoesNotExist:
            latest_addr = None

        r = get_redis_connection('default')
        sku_ids = r.lrange(f'history_{user.id}', 0, 4)

        viewed = []
        for sku_id in sku_ids:
            try:
                viewed.append(GoodsSKU.objects.get(id=sku_id))
            except GoodsSKU.DoesNotExist:
                continue

        return render(request, 'user_center_info.html', {
            'address': latest_addr,
            'skus': viewed,
        })

URL 設定

url(r'^profile$', views.ProfileView.as_view(), name='profile')

テンプレート例

{% for sku in skus %}
<li>
  <a href="{{ sku.get_absolute_url }}">
    <img src="{{ sku.default_image.url }}" alt="{{ sku.name }}">
  </a>
  <h4>{{ sku.name }}</h4>
  <span>¥{{ sku.price }}</span>
</li>
{% endfor %}

FastDFS カスタムストレージ

Django のデフォルトストレージを FastDFS に差し替える手順。

依存パッケージ

pip install fdfs_client-py-master.zip

カスタムストレージクラス

# utils/fastdfs/storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings

class FastDFSStorage(Storage):
    def __init__(self, conf_path=None, base_url=None):
        self.conf_path = conf_path or settings.FASTDFS_CLIENT_CONF
        self.base_url = base_url or settings.FASTDFS_BASE_URL

    def _save(self, name, content):
        client = Fdfs_client(self.conf_path)
        ret = client.upload_by_buffer(content.read())
        if ret.get('Status') != 'Upload successed.':
            raise IOError('FastDFS upload failed')
        return ret['Remote file_id']

    def _open(self, name, mode='rb'):
        # ファイルの読み出しは URL で行うため pass
        pass

    def exists(self, name):
        # FastDFS では同名ファイルは自動リネームされるため常に False
        return False

    def url(self, name):
        return self.base_url + name

設定値追加

# settings.py
DEFAULT_FILE_STORAGE = 'utils.fastdfs.storage.FastDFSStorage'
FASTDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')
FASTDFS_BASE_URL = 'http://192.168.228.135:8888/'

動作確認

>>> from goods.models import GoodsCategory
>>> c = GoodsCategory.objects.get(id=1)
>>> c.image.url
'http://192.168.228.135:8888/group1/M00/00/00/CtM3BVnkILGACHh0AAAmv27pX4k2790330'

tinymce 導入(リッチテキスト)

pip install django-tinymce==2.6.0
# settings.py
INSTALLED_APPS += ['tinymce']
TINYMCE_DEFAULT_CONFIG = {
    'theme': 'advanced',
    'width': 600,
    'height': 400,
}
# urls.py
urlpatterns += [url(r'^tinymce/', include('tinymce.urls'))]

タグ: Django redis FastDFS TinyMCE custom-storage

8月5日 10:58 投稿