小编nem*_*ign的帖子

Django:确定在使用post_delete信号时哪个用户正在删除

我希望管理员在删除某些对象时收到通知,但我也想确定哪个用户正在执行删除.

可能吗?

这是代码:

# models.py
# signal to notify admins when nodes are deleted
from django.db.models.signals import post_delete
from settings import DEBUG

def notify_on_delete(sender, instance, using, **kwargs):
    ''' Notify admins when nodes are deleted. Only for production use '''
    if DEBUG:
        #return False
        pass
    # prepare context
    context = {
        'node': instance,
        'site': SITE
    }
    # notify admins that want to receive notifications
    notify_admins(instance, 'email_notifications/node-deleted-admin_subject.txt', 'email_notifications/node-deleted-admin_body.txt', context, skip=False)

post_delete.connect(notify_on_delete, sender=Node)
Run Code Online (Sandbox Code Playgroud)

python django django-signals django-models django-sessions

6
推荐指数
1
解决办法
1553
查看次数

Django REST框架:有关对象级权限的帮助

遵循本教程:

http://django-rest-framework.org/tutorial/1-serialization.html

通过http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html

我有这个代码:

# models.py
class Message(BaseDate):
    """
    Private Message Model
    Handles private messages between users
    """
    status = models.SmallIntegerField(_('status'), choices=choicify(MESSAGE_STATUS))
    from_user = models.ForeignKey(User, verbose_name=_('from'), related_name='messages_sent')
    to_user = models.ForeignKey(User, verbose_name=_('to'), related_name='messages_received')
    text = models.TextField(_('text'))
    viewed_on = models.DateTimeField(_('viewed on'), blank=True, null=True)


# serialisers.py
class MessageSerializer(serializers.ModelSerializer):
    from_user = serializers.Field(source='from_user.username')
    to_user = serializers.Field(source='to_user.username')

    class Meta:
        model = Message
        fields = ('id', 'status', 'from_user', 'to_user', 'text', 'viewed_on')


# views.py
from permissions import IsOwner

class MessageDetail(generics.RetrieveUpdateDestroyAPIView):
    model = Message
    serializer_class = MessageSerializer
    authentication_classes …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

6
推荐指数
2
解决办法
7895
查看次数

Supervisord:如何获取rvm,并捆绑exec来启动rails脚本?

我正在尝试用supervisord管理一个ruby脚本但因为我还没有完全理解RVM是如何工作的,所以我无法正确地完成它.

通常我会做以下事情:

# sourcing of rvm done automatically on ssh login
cd /var/rails/myapp
RAILS_ENV="production" bundle exec ./script/backgroundrb
Run Code Online (Sandbox Code Playgroud)

但是使用以下配置文件我无法做到:

[program:owgm]
directory=/var/rails/owgm
command=bundle exec ./script/backgroundrb
environment=RAILS_ENV="production"
PATH="/usr/local/rvm/gems/ree-1.8.7-2012.02@global/bin/bundle:$PATH"
autostart=true
autorestart=true
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

无法加载OpenSSL.您必须使用OpenSSL支持重新编译Ruby,或者将Gemfile中的源从"https"更改为"http".有关使用RVM使用OpenSSL进行编译的说明,请访问rvm.io/packages/openssl.

看起来我无法获得正确的红宝石环境.

我认为设置路径会起作用,因为如果我这样做:

which bundle
Run Code Online (Sandbox Code Playgroud)

我得到:/usr/local/rvm/gems/ree-1.8.7-2012.02@global/bin/bundle

但我甚至不确定发生了什么.

使用Python我会做类似的事情:

command=/path/to/virtualenv/bin/python /path/to/script.py
Run Code Online (Sandbox Code Playgroud)

我可以用红宝石做类似的事吗?

rvm信息的输出是:

ree-1.8.7-2012.02:

  system:
    uname:       "Linux owtb2 3.2.0-44-generic #69-Ubuntu SMP Thu May 16 17:35:01 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux"
    system:      "ubuntu/12.04/x86_64"
    bash:        "/bin/bash => GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)"
    zsh:         " => not installed"

  rvm:
    version: …
Run Code Online (Sandbox Code Playgroud)

ruby bundler rvm supervisord

6
推荐指数
1
解决办法
3849
查看次数

是否有一个在django中生成settings.SECRET_KEY的函数?

为openwisp2编写了一个ansible-role来简化其部署,它是一系列django应用程序.为了尽可能地简化部署,我写了一个简单的(可能是微不足道的)SECRET_KEY生成器脚本,由ansible调用,在第一次运行ansible playbook时生成密钥.

现在,这工作正常,但我认为它击败了Django生成一个很难猜的强键的内置安全措施.

当时我查看其他方法,但没有找到太多,现在我想知道:是否有一个函数用于生成django中的settings.SECRET_KEY?

这将避免这种家庭烘焙解决方案,即使它们工作,它们在安全性方面也无效.

django django-settings

6
推荐指数
5
解决办法
1381
查看次数

如果DEBUG为True,也启用Django日志记录

通过阅读官方的django文档,我对此并不了解. https://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging

如果将settings.py中的DEBUG设置为True,我也想启用日志记录.我希望将错误记录在文件中.

怎么做?

这些是我现在拥有的日志记录的默认django设置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

PS: 我在我的开发环境中使用Apache + mod_wsgi,因为我使用的是我在局域网上远程访问的开发机器,这意味着我没有使用django开发服务器,我看不到控制台日志消息.

django django-settings

5
推荐指数
1
解决办法
5350
查看次数

Django虚拟字段:从虚拟字段设置属性的值

我正在尝试理解django ModelFields的内部,以在django-hstore上实现一个新功能.

基本上我想从具有预定义模式的HStore Dictionary创建虚拟字段.

作为第一步,我想隐藏实际的HStore Dictionary字段,而是使用虚拟字段中的值来组成最终的HStore Dictionary.

我已经能够使管理工作正常用于除了保存操作之外的所有操作,保存操作不会将虚拟字段的值保存到HStore字典中.

这是我的实际VirtualField代码:

# virtual.py
from django.db.models.fields import Field


class VirtualField(Field):
    """ Virtual Field """

    def __init__(self, *args, **kwargs):
        try:
            self.hstore_field_name = kwargs.pop('hstore_field_name')
        except KeyError:
            raise ValueError('missing hstore_field_name keyword argument')
        super(VirtualField, self).__init__(*args, **kwargs)

    def contribute_to_class(self, cls, name, virtual_only=True):
        super(VirtualField, self).contribute_to_class(cls, name, virtual_only)

    def value_from_object(self, obj):
        """
        Returns the value of this field in the given model instance.
        """
        hstore_field = getattr(obj, self.hstore_field_name)
        return hstore_field[self.attname]

    def save_form_data(self, instance, data):
        hstore_field = getattr(instance, self.hstore_field_name) …
Run Code Online (Sandbox Code Playgroud)

python django django-models

5
推荐指数
1
解决办法
3105
查看次数

如何使用 setup.py 和 extra_requires 指定可选依赖项?

有没有办法在使用时指定可选依赖项python setup.py develop

例如,假设我有这个包:

pip install openwisp-utils[users]
Run Code Online (Sandbox Code Playgroud)

如何通过告诉 setuptools 安装 中列出的可选依赖项来安装openwisp-utilsextra_requires['users']进行开发?

python setuptools python-packaging openwisp

5
推荐指数
1
解决办法
1283
查看次数

在QuerySets中翻译关键字参数时比eval()更好的方法(Python/Django)

我正在使用django-transmeta(无法通过django 1.2.5获得更好的工作),它在表中创建了几个列,如:content_en,content_es,content_it

在实施i18n之前,我有:

items = Items.objects.filter(categories__slug=slug)
Run Code Online (Sandbox Code Playgroud)

现在category.slug已国际化,因此我有"category.slug_en","category.slug_es","category.slug_it"等.

所以我虽然做了:

from django.db.models import Q
from django.utils.translation import get_language

current_lang = get_language()

queryset = {
    'en': Q(categories__slug_en__contains=slug),
    'es': Q(categories__slug_es__contains=slug),
    'it': Q(categories__slug_it__contains=slug),
}

items = Items.objects.filter(queryset[current_lang])
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,每当我需要添加一种新语言时,我将不得不更改代码,当然我不想这样做.

所以我做了:

from django.db.models import Q
from django.utils.translation import get_language

current_lang = get_language()

var = 'Q(categories__slug_%s=slug)' % current_lang
queryset = eval(var)
items = Items.objects.filter(queryset)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我使用的是eval(),它当然与evil()同义,最好避免它.

所以我想知道:有更好的方法吗?

非常感谢!

python django eval

4
推荐指数
1
解决办法
462
查看次数

Python相当于Ruby的表达式:"puts x + = value"

出于好奇心的缘故......

在Ruby中:

=>$ irb
1.8.7 :001 > puts x = 2
2
 => nil 
1.8.7 :002 > puts x += 2 while x < 40
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
Run Code Online (Sandbox Code Playgroud)

这很方便.

是否可以在Python中以单行执行此操作,如果是,如何?

ruby python language-comparisons

4
推荐指数
1
解决办法
9297
查看次数

默认django模板系统的替代方案

django默认模板系统最常用的替代方法是什么?

有没有人尝试过?

编辑:性能怎么样?

python django django-templates

3
推荐指数
1
解决办法
1531
查看次数