小编shy*_*ent的帖子

python中的链调用父构造函数

考虑一下 - 基类A,继承自A的类B,继承自B的类C.什么是在构造函数中调用父类构造函数的通用方法?如果这仍然听起来太模糊,这里有一些代码.

class A(object):
    def __init__(self):
        print "Initialiser A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Initialiser B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Initialiser C was called"

c = C()
Run Code Online (Sandbox Code Playgroud)

这就是我现在这样做的方式.但它仍然看起来有点过于非泛型 - 您仍然必须手动传递正确的类型.

现在,我尝试使用self.__class__作为super()的第一个参数,但是,显然它不起作用 - 如果你把它放在C的构造函数中 - 公平,B的构造函数被调用.如果你在B中做同样的事情,"self"仍然指向一个C的实例,所以你最终再次调用B的构造函数(这以无限递归结束).

现在没有必要考虑钻石继承,我只想解决这个具体问题.

python oop inheritance constructor

279
推荐指数
3
解决办法
16万
查看次数

Django模型字段验证

模型字段的验证应该在哪里进行django?

我可以命名至少两个可能的选择:在模型的重载.save()方法或models.Field子类的.to_python()方法中(显然,为了工作,你必须编写自定义字段).

可能的用例:

  • 当绝对需要确保时,空字符串不会写入数据库(空白= False关键字参数在此处不起作用,仅用于表单验证)
  • 当需要确保时,"choices"关键字参数在数据库级别上得到尊重,而不仅仅在管理接口中(仿真枚举数据类型)

empty_strings_allowedmodels.Field基类定义和派生类中还有一个类级别属性,它可以很好地覆盖它,但它似乎不会对数据库级别产生任何影响,这意味着我仍然可以使用空字符串字段构建模型并将其保存到数据库中.我想避免(是的,这是必要的).

可能的实现是

在现场一级:

class CustomField(models.CharField):
    __metaclass__ = models.SubfieldBase
    def to_python(self, value):
        if not value:
            raise IntegrityError(_('Empty string not allowed'))
        return models.CharField.to_python(self, value)
Run Code Online (Sandbox Code Playgroud)

在模型级别:

class MyModel(models.Model)
    FIELD1_CHOICES = ['foo', 'bar', 'baz']
    field1 = models.CharField(max_length=255, 
               choices=[(item,item) for item in FIELD1_CHOICES])

    def save(self, force_insert=False, force_update=False):
        if self.field1 not in MyModel.FIELD1_CHOICES:
            raise IntegrityError(_('Invalid value of field1'))
        # this can, of course, be made more generic
        models.Model.save(self, force_insert, force_update)
Run Code Online (Sandbox Code Playgroud)

也许,我错过了一些东西,这可以做得更容易(也更清洁)?

python django django-models

59
推荐指数
2
解决办法
4万
查看次数

使用python检查文件夹/文件ntfs权限

正如问题标题所暗示的那样,我非常想知道检查给定文件或文件夹的ntfs权限的方法(提示:这些是您在"安全性"选项卡中看到的那些).基本上,我需要的是获取文件或目录的路径(在本地计算机上,或者,最好是在远程计算机上的共享上)并获取用户/组的列表以及此文件/文件夹的相应权限.最终,应用程序将遍历目录树,读取每个对象的权限并相应地处理它们.

现在,我可以想到许多方法:

  • 解析cacls.exe输出 - 轻松完成,但是,除非我遗漏了什么,cacls.exe只给出了R | W | C | F(读/写/更改/完整)形式的权限,这是不够的(我需要获取"列出文件夹内容",扩展权限等权限
  • xcacls.exe或xcacls.vbs输出 - 是的,它们给了我所需的所有权限,但它们的工作速度非常慢,需要xcacls.vbs关于ONE SECOND来获取本地系统文件的权限.这样的速度是不可接受的
  • win32security(它包裹着winapi,对吗?) - 我确信它可以像这样处理,但我宁愿不重新发明轮子

还有什么我在这里失踪的吗?

python permissions winapi acl ntfs

9
推荐指数
1
解决办法
8796
查看次数

记录自django模型上次保存以来的变化

有几次我遇到了这种情况,在节省时间我需要知道哪些模型字段将被更新并采取相应的行动.

对此最明显的解决方案是获取主键字段并从数据库中检索模型的副本:

class MyModel(models.Model):

    def save(self, force_insert=False, force_update=False, using=None):
        if self.id is not None:
            unsaved_copy = MyModel.objects.get(id=self.id)
            # Do your comparisons here
        super(MyModel, self).save(force_insert, force_update, using)
Run Code Online (Sandbox Code Playgroud)

这样可以很好地工作,但是,它会为您正在保存的模型的每个实例访问数据库(如果您正在进行大量此类保存,则可能非常不方便).

很明显,如果可以在模型实例的lifetime(__init__)开头"记住"旧字段值,则不需要从数据库中检索模型的副本.所以我想出了这个小小的黑客:

class MyModel(models.Model):

    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self.unsaved = {}
        for field in self._meta.fields:
            self.unsaved[field.name] = getattr(self, field.name, None)

    def save(self, force_insert=False, force_update=False, using=None):
        for name, value in self.unsaved.iteritems():
            print "Field:%s Old:%s New:%s" % (name, value, getattr(self, name, None))
        # old values can be accessed through the self.unsaved …
Run Code Online (Sandbox Code Playgroud)

python django django-models

9
推荐指数
1
解决办法
2057
查看次数

预签名的URL和x-amz-acl

我想创建一个所谓的"预签名"URL,用于将特定对象(PUT)上传到Amazon S3存储桶.

到现在为止还挺好.我正在使用python库boto创建一个URL,其中包含所有必需的东西(过期,签名等).URL如下所示:

https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read

注意最后一个参数.

至少,正如我所理解的那样,这限制了使用此URL将对象上载到特定存储桶中的特定键的人,并且还将将在对象上设置的固定ACL限制为"公共读取".

我的最后一句话是非常不正确的.

事实证明,如果您使用此URL,则可以使用x-amz-acl 标头执行以下操作(与具有相同名称的查询字符串参数相反,您必须为签名检查设置成功):

  1. 将其设置为"公共阅读".对象的权限将包含两个条目:"读取"表示"所有人","完全控制"表示存储桶拥有者.这是非常期待的.
  2. 省略x-amz-acl标头.对象的权限将与每个桶的默认值相同(存储桶拥有者具有完全控制权).为什么?
  3. 将其设置为"公共读写".结果与(1)完全相同.
  4. 将其设置为"authenticated-read"."经过身份验证的用户"获得"读取"权限,存储桶拥有者可以完全控制.
  5. 将其设置为"bucket-owner-read".结果与(2)完全相同.存储桶拥有者具有完全控制权,未定义任何其他权限.
  6. 将其设置为"bucket-owner-full-control".不出所料,斗主将拥有完全控制权.
  7. 将其设置为不存在的固定ACL名称并获取错误.

所以看来,那样

  1. x-amz-acl 标头不参与签名检查,因为您可以随意更改它并且请求成功.但是,在签名检查期间肯定考虑查询字符串参数.
  2. x-amz-acl 查询字符串参数不会直接影响对象的权限,因为它本身不执行任何操作.
  3. 如果您发送x-amz-acl标头,则生成的权限永远不会
    • 对于存储桶拥有者而言,它们比默认情况下更具限制性.
    • 对非桶主人的限制较少.
  4. 但是,对于非桶主人来说,它们可能更具限制性.也就是说,如果x-amz-acl=public-read在查询字符串中指定,则可以将x-amz-acl标头设置为authenticated-read而不是公共可读对象获取对象,该对象只能由经过身份验证的用户读取.

x-amz-acl QS参数与标题之间的真实关系是什么?有没有办法限制对象的权限,即通过PUT请求上传到所谓的"预签名"URL?

python amazon-s3 boto amazon-web-services

9
推荐指数
1
解决办法
4550
查看次数

Django形式:在验证之间保持禁用字段

在某些时候,我需要显示类型的"disabled"(灰色disabled="disabled"属性)输入"select".如标准(xhtml和html4)中所指定的,类型的输入"select"不能具有该"readonly"属性.请注意,这仅用于演示目的,实际值必须以POST结尾.所以这就是我所做的(引用django中表单声明的一部分):

from django import forms

_choices = ['to be', 'not to be']
class SomeForm(forms.Form):
    field = forms.ChoiceField(choices=[(item, item) for item in _choices],
                   widget=forms.HiddenInput()) # the real field

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted
                        choices=[(item, item) for item in _choices],
                        label="The question",
                        widget=forms.Select(attrs={'disabled':'disabled'}))
Run Code Online (Sandbox Code Playgroud)

然后它被初始化为:

initial_val = 'to be'
form = SomeForm(ititial={'field':initial_val,
                         'mock_field':initial_val})
Run Code Online (Sandbox Code Playgroud)

一切都很好.好吧,直到表单得到验证并且其中一个字段未通过验证.发生这种情况时,重新加载表单并保留值,但不保留"mock_field"之一 - 它永远不会被提交(它被禁用).所以它没有保留.虽然这不会影响数据完整性,但它仍然不是很好的表示方式.

有没有办法保留这个领域,尽可能少的hackery?表单是a的一部分,django.contrib.formtools.FormWizard初始值(和某些字段)是动态生成的.基本上,已经有很多东西在进行,如果有可能不会使事情过于复杂,那就太棒了.

python django django-forms

7
推荐指数
1
解决办法
3567
查看次数

确定是否继承了ntfs权限的可靠方法

我这里有一个有点模糊的问题.

我需要的:确定是否继承了文件/文件夹的权限(或严格来说,DACL的特定ACE).

我是如何解决这个问题的:使用winapi绑定python(确切地说是win32security模块).这是精简版本,它就是这样做的 - 它只是将文件的路径作为参数并逐个打印出ACE,指示设置了哪些标志.

#!/usr/bin/env python
from win32security import *
import sys

def decode_flags(flags):
    _flags = {
        SE_DACL_PROTECTED:"SE_DACL_PROTECTED",
        SE_DACL_AUTO_INHERITED:"SE_DACL_AUTO_INHERITED",
        OBJECT_INHERIT_ACE:"OBJECT_INHERIT_ACE",
        CONTAINER_INHERIT_ACE:"CONTAINER_INHERIT_ACE",
        INHERIT_ONLY_ACE:"INHERIT_ONLY_ACE",
        NO_INHERITANCE:"NO_INHERITANCE",
        NO_PROPAGATE_INHERIT_ACE:"NO_PROPAGATE_INHERIT_ACE",
        INHERITED_ACE:"INHERITED_ACE"
    }
    for key in _flags.keys():
        if (flags & key):
            print '\t','\t',_flags[key],"is set!"


def main(argv):
    target = argv[0]
    print target

    security_descriptor = GetFileSecurity(target,DACL_SECURITY_INFORMATION)

    dacl = security_descriptor.GetSecurityDescriptorDacl()

    for ace_index in range(dacl.GetAceCount()):
        (ace_type,ace_flags),access_mask,sid = dacl.GetAce(ace_index)
        name,domain,account_type = LookupAccountSid(None,sid)
        print '\t',domain+'\\'+name,hex(ace_flags)
        decode_flags(ace_flags)


if __name__ == '__main__':
    main(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

足够简单 - 获取安全描述符,从中获取DACL,然后遍历DACL中的ACE.这里真正重要的是INHERITED_ACE访问标志.它应该在继承ACE时设置,而不是显式设置.

创建文件夹/文件时,其ACL将根据父对象(文件夹)的ACE进行填充,这些ACE设置为传播给子项.但是,除非您对访问列表进行任何更改,否则将不会设置INHERITED_ACE标志!但继承的权限在那里,他们可以工作.

如果你做了任何微小的改变(比如,在访问列表中添加一个条目,应用更改并将其删除),那么标志就会神奇地出现(行为不会以任何方式改变,不过,它之前有效,之后有效)!我想要的是找到INHERITED_ACE标志的这种行为的来源,并且可能找到另一种可靠的方法来确定ACE是否被继承.

如何重现:

  1. 创建一个对象(文件或文件夹)
  2. 检查Windows资源管理器中的权限,查看它们是否已从父对象传播(例如,使用Windows资源管理器的文件属性对话框的安全选项卡).
  3. 例如,使用我正在使用的脚本检查标志(不会在任何ACE上设置INHERITED_ACE). …

python winapi acl file-permissions ntfs

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

Django ORM:优化涉及多对多关系的查询

我有以下模型结构:

class Container(models.Model):
    pass

class Generic(models.Model):
    name = models.CharacterField(unique=True)
    cont = models.ManyToManyField(Container, null=True)
    # It is possible to have a Generic object not associated with any container, 
    # thats why null=True

class Specific1(Generic):
    ...

class Specific2(Generic):
    ...

...

class SpecificN(Generic):
    ...
Run Code Online (Sandbox Code Playgroud)

比如说,我需要检索Specific与特定Container有关系的所有类型的模型.

用于此的SQL或多或少是微不足道的,但这不是问题.不幸的是,我在使用ORM(特别是Django的ORM)方面不是很有经验,所以我可能在这里错过了一个模式.

当以蛮力的方式完成时, -

c = Container.objects.get(name='somename') # this gets me the container
items = c.generic_set.all() 
# this gets me all Generic objects, that are related to the container
# Now what? I need to get to …
Run Code Online (Sandbox Code Playgroud)

django orm many-to-many django-models django-queryset

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

为什么在它按名称引用const结构时,不存在.rodata中的const结构数组?

我有以下结构安排:

typedef struct { 
    int a;       
} Foo;

const Foo END = {0};   

const Foo table_1[] = {
    {2}, {0}           
};                     

const Foo table_2[] = {         
    {2}, END                    
};                              
Run Code Online (Sandbox Code Playgroud)

基本上,我有一个结构,以及该结构的几个数组.现在,这些数组的内容永远不会改变:它们是一些查找表,在运行时使用,因此,在嵌入式环境中,我希望数据驻留在ROM中(我非常受 RAM约束,真的为每对夫妻而战字节).可以想象,没有什么能阻止所有这些表驻留在ROM中(一切都是const).

实际上,table_1最终.rodata(因此它不会在启动期间复制到RAM中)和table_2- .data(消耗ROM和RAM).在反汇编目标文件时,我也可以看到一些初始化的代码table_2.

我希望所有前面提到的数组最终进入.rodata,但似乎只有在我"完全"写出结构初始化时才会发生(对不起,不确定,这是什么是正确的术语).

这些初始化有什么区别?因为只有初始化是不同的 - 类型是相同的,实际数据也是相同的.它是否正在进行某种优化(想知道这里有什么优化)?有没有办法禁用它?我的意思是,我可以#define离开所有常见的表成员并完成它,但它似乎是一个黑客,此外,我真的想了解这里发生了什么.

我使用gcc-arm-none-eabi工具链,搭建-Os,gcc版本是4.8.1.

c++ arrays gcc struct

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

查询ColdFusion外部的查询

我使用Adobe ColdFusion的经验,即使仍然有些限制,也是非常愉快和愉快的.

在我对ColdFusion所说的所有好事中,有一个功能让我完全不知所措.它可能既不是非常有效,也不适用于制作,但无论如何,我所说的是所谓的"查询查询"功能,或者是dbtype="query"属性cfquery.它允许您针对任意数据集运行SQL语句,而不仅仅是数据库连接.例如,您可以加入一个结果集,即刚从数据库中检索到的结果集和内存结构(当然,受某些限制).它提供了一种快速而肮脏的方式来对数据进行"后处理",这有时比循环中的数据集迭代更具可读性(也更灵活!).

但是,ColdFusion并不是一个非常受欢迎的产品,我不会回答它为什么会这样的原因.我要问的是,这种技术在其他语言中是否有任何支持(如图书馆,或多或少相同)?蟒蛇?Perl的?红宝石?PHP?什么?因为,对我来说,似乎这个功能的潜力很大,可能不是在生产代码中,但如果你需要快速测试一下,它绝对可以节省生命.毋庸置疑,根据我的知识,SQL ColdFusion的用途有点受限,但是,这个想法仍然很棒.

sql coldfusion qoq

2
推荐指数
1
解决办法
1966
查看次数

用另一个函数包装tornado.gen.engine包装函数

说,我有一个函数,用gen.engine包装来"理顺"回调链,也就是说,代码看起来是同步/线性/无论如何.

该功能,然后看起来像这样

@gen.engine
def func():
     ...
     yield gen.Task(...)
     ...
     yield gen.Task(...)
Run Code Online (Sandbox Code Playgroud)

等等.我明白,我绝对可以使用try/except yields来捕获函数中出现的异常,包括在内gen.Task.如果我需要将函数func本身包装在另一个函数中(这是实际的用例),func如果不引入"丑陋"(右..)try/except,那将会涵盖所有"未捕获"异常,这将跨越整个func

我想出来了:

@gen.engine
def func(..., callback):
     ...
     callback()

@gen.engine
def outer():
    try:
        yield gen.Task(func)
    except Exception as e:
        # Log the exception
    # Stop ioloop (or something)
Run Code Online (Sandbox Code Playgroud)

这增加了一些通用性func,但引入了额外的参数和一些人工逻辑func.

有没有其他方法这样做?请注意,"紧急异常捕获"或多或少是出于此问题的目的的人工用例(这可能以其他方式完成),我正在寻找的是调用那些tornado.gen的正确方法.来自其他功能的引擎包装函数.

编辑:傻我,我应该提到我被限制在龙卷风2.x!

python asynchronous generator tornado

2
推荐指数
1
解决办法
3300
查看次数

SQL返回额外数据

嘿那里,想知道是否有人可以帮助SQL和Python的新手.我以为自己对它有了相当不错的把握,但最近发生了一些奇怪的事情.

以下是从较大部分剪切的以下代码:

  try:
      self.db.query("SELECT * FROM account WHERE email = '{0}' AND pass = '{1}'".format(self.mail.strip(self.bchars),self.pw.strip(self.bchars)))
  except MySQLdb.Error, e:
      print "Error %d: %s" % (e.args[0], e.args[1])

  exists = self.db.store_result().fetch_row()
  print "EXISTS",exists
Run Code Online (Sandbox Code Playgroud)

它用来打印这个:

EXISTS ((2, 'test@test.com', '1234', 1, 0, 2161, '192.168.1.47', 0),)
Run Code Online (Sandbox Code Playgroud)

现在,它打印出来:它用来打印这个:

EXISTS ((2L, 'test@test.com', '1234', 1L, 0L, 2161, '192.168.1.47', 0L),)
Run Code Online (Sandbox Code Playgroud)

我不知道这些L's来自哪里.我检查了SQL数据库,甚至重新加载它以确保.我已经恢复了最后一天的所有代码(所有代码都在运行),但仍无法找到解决方案.我也尝试过搜索,但我甚至不确定这个问题是什么,所以很难搜索.感谢任何人提供的任何帮助或信息.

python mysql sql

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

子状态控制器永远不会执行

我试图绕过ui-router,我试图实现以下逻辑:

  • 如果没有州,请转到州/项目
  • 处理时/items,从服务器检索"项目"列表
  • 当收到"items"时,转到state /items/:item,其中"item"是服务器返回的item列表中的第一个
  • 在状态下/items/:item呈现一个项目列表,相应的"项目"被"突出显示"(突出显示部分不包含在我的代码中)

但是,不执行子状态的"控制器"功能.我打赌这是非常明显的事情.

这是js(我也在plunkr上有附带的模板).

angular.module('uiproblem', ['ui.router'])
.config(['$stateProvider', '$urlRouterProvider',
         function ($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/items');
    $stateProvider
    .state('items', {
        url: '/items',
        resolve: {
            items: function($q, $timeout){
              var deferred = $q.defer();
              $timeout(function() {
                deferred.resolve([5, 3, 6]);
              }, 1000);
              return deferred.promise;
            }
        },
        controller: function($state, items) {
            // We get to this point successfully
            console.log(items);
            if (items.length) {
                // Attempt to transfer to child state
                return $state.go('items.current', {id: items[0]});
            }
        }
    })
    .state('items.current', { …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-ui-router

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