在集成我之前没有使用的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
当我搜索我现在遇到的问题的解决方案时,我发现了这个线程:jQuery:同一事件的多个处理程序.现在我想知道是否有可能只删除这些处理程序中的一个?
我有一些非常奇怪的行为,我只是不明白,因此无法解释,所以我希望有人可以帮助我.我注意到的第一件事是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进程并重新运行代码确实有帮助.现在一切都恢复正常了.但是由于我不明白发生了什么,我会对发生的事情以及如何重现行为非常感兴趣.
我正在测试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查询集与空列表进行比较.
但由于这不是我喜欢的东西,我想知道是否有更好的方法来进行测试.
在编写一些视图来响应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的装饰器?
对github的最后贡献是2010_01_22,现在已超过2年.标记仍然有效,但它会继续吗?是不是这么好写了它不需要保持这么长时间?或者我只是通过https://github.com/brosner/django-tagging获得了错误的来源?
我在文档中找不到这个,但认为它一定是可能的.我正在谈论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 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测试客户端登录此用户?
这个问题比直接关于如何编码的问题更像是一种再保险.作为一个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)有关这些危险的进一步阅读的任何有价值的链接?
也许其中一些问题听起来并不太明确,但我正试图克服这个问题.如果有人可以帮助我,我会很高兴.
我有一个函数,我从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 ×7
python ×3
ajax ×1
class-method ×1
csrf ×1
django-csrf ×1
django-forms ×1
django-views ×1
ipython ×1
jquery ×1
pdb ×1
unit-testing ×1