【问题标题】:Django redis connection backend or how to implement oneDjango redis 连接后端或如何实现一个
【发布时间】:2011-05-31 12:48:51
【问题描述】:

是否有任何插件或 3rd 方后端来管理 Django 中的 redis 连接,因此 view.py 中的方法不必为每个请求显式连接到 redis?

如果没有,您将如何开始实施?新插件?一个新的后端?一个新的 django 中间件?

谢谢。

【问题讨论】:

    标签: python django redis


    【解决方案1】:

    我认为非 rel 数据库的新兴标准是 django-nonrel 。我不知道 django-nonrel 是否已准备好生产或是否支持 redis,但他们在 writing a custom no-sql backend 上有一个指南。

    不幸的是,我认为在标准 django 上编写对 redis 的支持并不像编写 DatabaseBackend 那样容易。 django 模型机制和工作流程中有很多只是假设一个 ACID 数据库。 syncdb 呢?关于Querysets

    但是,您可以尝试使用models.Manager 编写一个穷人方法,并对您的模型进行大量调整。例如:

    # helper   
    def fill_model_instance(instance, values):
        """ Fills an model instance with the values from dict values """                                    
        attributes = filter(lambda x: not x.startswith('_'), instance.__dict__.keys())
    
        for a in attributes:
            try:
                setattr(instance, a, values[a.upper()])
                del values[a.upper()]
            except:
                pass
    
        for v in values.keys():
            setattr(instance, v, values[v])
    
        return instance
    
    
    
    
    class AuthorManager( models.Manager ):
    
        # You may try to use the default methods.
        # But should be freaking hard...
        def get_query_set(self):
            raise NotImplementedError("Maybe you can write a Non relational Queryset()! ")
    
        def latest(self, *args, **kwargs):
            # redis Latest query
            pass
    
        def filter(self, *args, **kwargs):
           # redis filter query
           pass
    
        # Custom methods that you may use, instead of rewriting
        # the defaults ones.
        def open_connection(self):
            # Open a redis connection
            pass
    
        def search_author( self, *args, **kwargs ):
            self.open_connection()
    
            # Write your query. I don't know how this shiny non-sql works.
            # Assumes it returns a dict for every matched author.
            authors_list = [{'name': 'Leibniz',   'email': 'iinventedcalculus@gmail.com'},
                             'name': 'Kurt Godel','email': 'self.consistent.error@gmail.com'}]
    
            return [fill_instance(Author(), author) for author in authors_list]
    
    
    
    class Author( models.Model ):
        name      = models.CharField( max_length = 255 )
        email     = models.EmailField( max_length = 255 )
    
         def save(self):
             raise NotImplementedError("TODO: write a redis save")
    
         def delete(self):
             raise NotImplementedError(""TODO: write a delete save")
    
         class Meta:
              managed = False
    

    请注意,我只是对如何调整 django 模型进行了草图绘制。我还没有 测试并运行此代码。我首先建议你调查 django-nonrel。

    【讨论】:

    • 感谢您的回答。我不需要将我的模型存储在 redis 实例中,所以我认为我不需要 django-nonrel。那我自己实现一个连接管理模块吧。
    猜你喜欢
    • 2012-10-02
    • 2011-05-04
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多