小编mar*_*rue的帖子

什么时候应该使用@classmethod和def方法(自我)?

在集成我之前没有使用的Django应用程序时,我发现了两种不同的方法来定义类中的函数.作者似乎非常故意地使用它们.第一个是我自己经常使用的一个:

class Dummy(object):

    def some_function(self,*args,**kwargs):
        do something here
        self is the class instance
Run Code Online (Sandbox Code Playgroud)

另一个是我不使用的,主要是因为我不明白何时使用它,以及为什么:

class Dummy(object):

    @classmethod
    def some_function(cls,*args,**kwargs):
        do something here
        cls refers to what?
Run Code Online (Sandbox Code Playgroud)

在Python文档中,classmethod装饰器用这句话解释:

类方法接收类作为隐式的第一个参数,就像实例方法接收实例一样.

所以我猜cls是指Dummy自己(class不是实例).我不完全理解为什么会这样,因为我总能做到这一点:

type(self).do_something_with_the_class
Run Code Online (Sandbox Code Playgroud)

这只是为了清楚起见,还是我错过了最重要的部分:如果没有它,那些怪异而迷人的东西是无法完成的?

python language-details method-dispatch class-method language-lawyer

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

是否可以从具有多个处理程序的事件中删除一个特定的事件处理程序?

当我搜索我现在遇到的问题的解决方案时,我发现了这个线程:jQuery:同一事件的多个处理程序.现在我想知道是否有可能只删除这些处理程序中的一个?

jquery

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

奇怪的IPython ipdb行为

我有一些非常奇怪的行为,我只是不明白,因此无法解释,所以我希望有人可以帮助我.我注意到的第一件事是ipdb不再让我定义变量:

ipdb> what=5
ipdb> what
*** NameError: name 'what' is not defined
whatelse=6
Run Code Online (Sandbox Code Playgroud)

稍后我发现ipdb在我的输入上返回了这个(在再次运行代码之后):

dir()
ipdb> ['args', 'content_type', 'function', 'ipdb', 'item_code', 'kwargs', 'object_id', 'request', 'ud_dict', 'update_querydict', 'what', 'whatelse']
what=5
ipdb> what
5
ipdb> whatelse=7
ipdb> whatelse
ipdb> 6
whatelse
ipdb> 7
whatelse
ipdb> 6
whatelse
ipdb> 7
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来像我有两个交错调试会话,我可以访问一些奇怪的交替模式.我怎么能摆脱它呢?

编辑: 杀死所有python进程并重新运行代码确实有帮助.现在一切都恢复正常了.但是由于我不明白发生了什么,我会对发生的事情以及如何重现行为非常感兴趣.

python ipython pdb

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

如何在Django中测试一个空的查询集?

我正在测试Django中的一个视图,该视图应该从对象中删除所有标记.为此,我使用这个断言:

self.assertEqual(list(Tag.objects.get_for_object(Animal.objects.get(pk=1))),[])
Run Code Online (Sandbox Code Playgroud)

这很有效,因为我得到一个空列表作为回报.我将Django查询集包装在列表中以避免这种情况:

AssertionError: [] != []
Run Code Online (Sandbox Code Playgroud)

将空Django查询集与空列表进行比较.

但由于这不是我喜欢的东西,我想知道是否有更好的方法来进行测试.

django unit-testing

13
推荐指数
2
解决办法
8075
查看次数

ajax视图上的login_required装饰器返回401而不是302

在编写一些视图来响应ajax请求时,我发现有点奇怪的是,login_required装饰器总是为未经过身份验证的用户返回302状态代码.由于这些视图是ajax视图,这似乎有些不合适.我不希望用户在这种情况下登录,但我希望Django告诉客户端访问这样的视图需要身份验证(我认为401应该是正确的状态代码).

为了实现这一点,我开始编写自己的装饰器login_required_ajax,但不知怎的,这超出了我的技能.这是我到目前为止所提出的:

def login_required_ajax(function=None,redirect_field_name=None):
    """
    Just make sure the user is authenticated to access a certain ajax view

    Otherwise return a HttpResponse 401 - authentication required
    instead of the 302 redirect of the original Django decorator
    """
    def _decorator(view_func):
        def _wrapped_view(request, *args, **kwargs):
            if request.user.is_authenticated():
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse(status=401)

        if function is None:
            return _decorator
        else:
            return _decorator(function)
Run Code Online (Sandbox Code Playgroud)

在视图上使用此装饰器时,一旦我尝试访问该站点上的任何页面,我就会收到ViewDoesNotExist异常.

我首先想到的问题可能是当用户未经过身份验证时直接返回HttpResponse,因为响应对象不是可调用的.但是,只要我不尝试访问有问题的视图,装饰者应该工作,不应该吗?如果这真的是关键,我怎么能写一个返回状态代码为401的HttpResponse的装饰器?

django ajax

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

Django-Tagging仍然保持?

对github的最后贡献是2010_01_22,现在已超过2年.标记仍然有效,但它会继续吗?是不是这么好写了它不需要保持这么长时间?或者我只是通过https://github.com/brosner/django-tagging获得了错误的来源?

django django-tagging

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

如何在Django中自定义小部件的html输出?

我在文档中找不到这个,但认为它一定是可能的.我正在谈论ClearableFileInput小部件.从django 1.2.6中的项目我有这样的形式:

# the profile picture upload form
class ProfileImageUploadForm(forms.ModelForm):
    """
    simple form for uploading an image. only a filefield is provided
    """
    delete = forms.BooleanField(required=False,widget=forms.CheckboxInput())

    def save(self):
        # some stuff here to check if "delete" is checked
        # and then delete the file
        # 8 lines

    def is_valid(self):
        # some more stuff here to make the form valid
        # allthough the file input field is empty
        # another 8 lines

    class Meta:
        model = SocialUserProfile
        fields = ('image',)
Run Code Online (Sandbox Code Playgroud)

然后我使用此模板代码呈现: …

django django-forms

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

使用PASSWORD_HASHERS为unittest用户创建一个简单的密码

直到django 1.2.5我可以使用以下代码创建用户进行测试,然后将其登录:

class TestSomeLoginRequiredView(TestCase):
    urls = 'sonloop.tests.test_urls'

    def setUp(self):
        self.user = User.objects.create(username='testuser',password='some_password')


    def test_the_view(self):
        response = self.client.get('/test_view_url/')
        self.assertEqual(response.status_code,401)

        self.client.login(username='testuser',password='some_password')
        response = self.client.get('/test_view_url/')
        self.assertEqual(response.status_code,200)
Run Code Online (Sandbox Code Playgroud)

现在使用与django 1.4相同的代码不再起作用了:

ValueError:未知密码哈希算法'some_password'.您是否在PASSWORD_HASHERS设置中指定了它?

我理解这与新密码哈希系统有关.我没有使用PASSWORD_HASHERS设置,所以Django应该使用一些默认值.

关于如何实现类似的东西,Django文档非常稀少.在测试部分没有任何改变.从关于创建密码以及如何散列它们的部分,我可以看到我可能会创建这样的密码:

self.user = User.objects.create(username='testuser')
self.user.set_password('some_password')
Run Code Online (Sandbox Code Playgroud)

但是这只会在第一行引发这种情况(创建用户时,而不是在分配密码时):

ValueError:未知的密码哈希算法''.您是否在PASSWORD_HASHERS设置中指定了它?

这是django不接受空密码的一些问题,所以我改为:

self.user = User.objects.create(username='testuser',password='!')
self.user.set_password('some_password')
Run Code Online (Sandbox Code Playgroud)

然后尝试以这样的方式记录用户:

login = self.client.login(username='testuser',password='some_password')
self.assertTrue(login)
Run Code Online (Sandbox Code Playgroud)

现在引起了AssertionError: False is not True一声叹息 - 我几乎期待......

我现在的问题是:如何使用密码创建用户,并使用django测试客户端登录此用户?

python django django-testing

11
推荐指数
2
解决办法
4355
查看次数

在什么情况下CSRF豁免是危险的?

这个问题比直接关于如何编码的问题更像是一种再保险.作为一个autodidact我没有很多可能性问专业人士这样的事情,所以我在这里尝试.

我已经阅读了django-docs(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/)中的文档以及该页面上的一些信息:http://cwe.mitre.org/top25 /#CWE-352

据我所知,django向用户提供了一个令牌(某种代码).为了验证它真的是他,他必须在下次提出请求时将其归还.谷歌的一些人发现,甚至可以通过ajax请求实现这一点,这就是为什么我们自1.2.6以来也有保护它们的新政策.CSRF是关于某人给我一些东西(坏的,危险的代码,腐败的文件或类似的东西)假装成其他人.

所以如果我有这样的代码:

@csrf_exempt    
def grab(request):
    """
    view to download an item
    POST because it stores that a user has downloaded this item
    """
    item_id = request.POST.get('item', None)
    if not loop: return HttpResponseBadRequest('no item id provided')
    item = Item.objects.get(pk=int(item_id))
Run Code Online (Sandbox Code Playgroud)

应该保存,因为在尝试将给定值转换为整数之前,我没有访问数据库或应用程序的任何部分.如果我对某人下载文件的记录错误(在这种情况下几乎没有),则没有太多损害.假设我会根据这个观点编写账单,CSRF豁免会有不同的想法(是吗?).

我也不明白为什么有人不能从用户那里窃取CSRF令牌并使用它来欺骗我(或用户).所以我对这个主题有一些疑问:

1)我的假设来自上面吗?

2)有人可以告诉我,有些不那么好的家伙可以使用上面的观点来做肮脏的伎俩(也可能是怎样),他们会是什么?

3)CSRF是中间人攻击的一个例子,它只与它有关,还是完全不同的东西?

4)有关这些危险的进一步阅读的任何有价值的链接?

也许其中一些问题听起来并不太明确,但我正试图克服这个问题.如果有人可以帮助我,我会很高兴.

django csrf django-csrf csrf-protection

10
推荐指数
2
解决办法
3105
查看次数

我可以在没有测试客户端的情况下访问测试视图的响应上下文吗?

我有一个函数,我从unittest调用.从设置一些调试跟踪,我知道该功能像魅力一样工作,并具有正确准备返回的所有值.

这就是我的testcode的样子(请参阅我的ipdb.set_trace()所在的位置):

@override_settings(REGISTRATION_OPEN=True)
def test_confirm_account(self):
    """ view that let's a user confirm account creation and username
        when loggin in with social_auth """    
    request = self.factory.get('')
    request.user = AnonymousUser()
    request.session={}
    request.session.update({self.pipename:{'backend':'facebook',
                                           'kwargs':{'username':'Chuck Norris','response':{'id':1}}}})

    # this is the function of which i need the context:
    response = confirm_account(request)
    self.assertEqual(response.context['keytotest'],'valuetotest')
Run Code Online (Sandbox Code Playgroud)

根据我从Django文档的这一部分所知,当我使用测试客户端时,我将能够访问response.context.但是当我尝试访问response.context就像我做的那样,我得到了这个:

AttributeError:'HttpResponse'对象没有属性'context'

有没有办法在不使用客户端的情况下获取客户端的特殊HttpResponse对象?

django django-views django-testing

9
推荐指数
3
解决办法
8623
查看次数