将redis与django集成

时间:2018-01-16 06:41:17

标签: python django redis

我是Django的新手。我的任务是设计一个后端,其中将有登录系统(使用django提供的默认用户表)。还有另外两个表,一个是图像表,其中包含imgvalue列,其中包含来自redis数据库的密钥。另一个表(imgacl)是为用户提供访问控制,以查看所需用户有权访问的特定图像。 redis数据库实际上是使用键值对存储图像,并且该键存储在imgvalue列中。这是我的代码:

models.py:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Image(models.Model):
    imgvalue = models.Charfield(max_length =250)

class Imageacl(models.Model):
    id = models.ForeignKey(Image,on_delete =models.CASCADE)
    userlist= models.Textfield(null=True)

用户列表包含可以查看特定图像的用户列表。 一个单独的python程序,用于在Redis db中存储50个图像。假设有5个用户,user1可以查看10个图像,user2可以查看15个图像...

import redis
from PIL import Image
rd =  redis.StrictRedis()
for x in range(1,51):
    img = open("{}.jpg".format(x),"rb").read()
    rd.set("key{}".format(x),img)

我有两个问题:
1)我如何将redis与django&
集成 2)我将如何为用户提供访问控制?

1 个答案:

答案 0 :(得分:0)

您可以使用redis存储对图像的引用,并存储实际图像:

  1. 在服务器中,如果您允许系统以有效的方式提供静态文件(请记住,如果文件共存于同一服务器中,提供文件的确也会降低应用程序的性能)

  2. 像S3这样的对象存储服务,可以为您提供出色的性能,以提供这些图像。

在redis中,存储图片的网址字符串:

import boto3

s3 = boto3.resource('s3')
buck = s3.Bucket('name')
for object in buck.objects.all():
  # print(object)
  rd.set("key{}".format(x), object.key)

或者如果您将图像存储在文件系统中:

import os

folder=os.listdir("path/to/img/")
for file in folder:
  rd.set("key{}".format(x), "path/to/img/%s"%file )

要实现用户访问控制,请看一个this问题,有几个django模块可用于获得粒度访问控制。