我试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法.一个外部的非django应用程序正在设置一个带有令牌的cookie,我有一个可以根据该令牌检索用户信息的web服务.如果用户设置了cookie,则他们不需要在我的站点上进行身份验证,并且应该根据Web服务传回的信息自动登录.在我看来,有几个不同的选项来执行实际检查,我不确定哪个是最好的:
login_required.LOGIN_REDIRECT_URL将在ajax调用中检查/验证cookie 的页面,并在cookie经过身份验证时自动重定向回引用者.我有遗失的选择吗?理想情况下,有一种方法可以将其构建login_required,而无需编写自定义装饰器.
鉴于n列表中包含m字典作为元素,我想生成一个新列表,其中包含一组连接的字典.每个字典都保证有一个名为"索引"的键,但除此之外可以有一组任意键.非索引键永远不会在列表中重叠.例如,想象以下两个列表:
l1 = [{"index":1, "b":2}, {"index":2, "b":3}, {"index":3, "green":"eggs"}]
l2 = [{"index":1, "c":4}, {"index":2, "c":5}]
Run Code Online (Sandbox Code Playgroud)
("b"永远不会出现l2,因为它出现了l1,同样地,它"c"永远不会出现l1,因为它出现在l2)
我想制作一个联合列表:
l3 = [{"index":1, "b":2, "c":4},
{"index":2, "b":3, "c":5},
{"index":3, "green":"eggs"}]
Run Code Online (Sandbox Code Playgroud)
在Python中执行此操作的最有效方法是什么?
我有一个查询集,我需要懒惰地腌制,我有一些严重的麻烦.cPickle.dumps(queryset.query)抛出以下错误:
Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it's not the same object as myproject.myapp.models.myfile.QuerySet
Run Code Online (Sandbox Code Playgroud)
奇怪的是(或者可能不那么奇怪),当我cPcikle从另一个方法或视图调用时,我只会得到那个错误,但是当我从命令行调用它时却没有.
我在阅读了PicklingError之后做了下面的方法:不能pickle <class'minimal.Decimal'>:它与decimal.Decimal和Django mod_wsgi在保存对象时不是同一个对象:
def dump_queryset(queryset, model):
from segment.segmentengine.models.segment import QuerySet
memo = {}
new_queryset = deepcopy(queryset, memo)
memo = {}
new_query = deepcopy(new_queryset.query, memo)
queryset = QuerySet(model=model, query=new_query)
return cPickle.dumps(queryset.query)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我变得非常绝望 - 该方法仍会产生相同的错误.是否有一个已知的,非hacky解决这个问题的方法?
编辑:尝试使用--noreloaddjango开发服务器上的运行,但无济于事.
编辑2:我在上面显示的错误中输了一个错误 - 它models.QuerySet不是models.mymodel.QuerySet在抱怨.这里还有另一个细微差别,就是我的模型文件分为多个模块,因此错误实际上是:
Can't pickle <class 'myproject.myapp.models.myfile.QuerySet'>: it's not the same object as …Run Code Online (Sandbox Code Playgroud) 有没有人有一个有效的算法来检索一个mptt查询集的所有祖先?到目前为止我能想到的最好的是这样的:
def qs_ancestors(queryset):
if isinstance(queryset, EmptyQuerySet):
return queryset
queryset_aggs = queryset.values_list('tree_id', 'level').annotate(max_lft=Max('lft'), min_rght=Min('rght'))
new_queryset = queryset.none()
for tree_id, level, max_lft, min_rght in queryset_aggs:
ancestors = MyModel.objects.filter(
tree_id=tree_id,
level__lt=level,
lft__lte=max_lft,
rght__gte=min_rght,
)
new_queryset = ancestors | new_queryset
return new_queryset
Run Code Online (Sandbox Code Playgroud)
这种方法存在两个问题:
number_of_trees*number_of_levels在最终查询中有条款,它可以非常快地变得非常大我愿意在其他地方缓存祖先,但我想不出有效的方法.我考虑添加一个字段,用逗号分隔的祖先id的列表,然后GROUP_CONCAT在一个额外的内部做一个(我在MySQL中),但我认为这可能会变得很大/很慢.
有没有办法以编程方式测试ssh是否可以使用公钥进行身份验证?我想做这样的事情(最好是在bash,但我对python解决方案开放):
ssh-test-thingy user@host || echo "could not authenticate using publickey"
Run Code Online (Sandbox Code Playgroud)
其中ssh-test-thingy返回非零退出状态,如果在远程主机上不公钥匹配.
我的兔子日志变得非常大,我想知道是否有更好的方法来控制旋转.我希望日志根据大小进行旋转,并且一次最多保留10个日志.到目前为止我发现的最好的是你可以通过放入SERVER_START_ARGS="-kernel error_logger silent"rabbitmq.conf文件来关闭日志记录.有没有更好的办法?我想避免使用crontab.
我有几个芹菜节点在使用rabbitmq生产中运行,我一直在处理服务中断的部署.我必须取下整个网站,以便将新代码部署到芹菜中.我将每个子项的最大任务设置为1,所以理论上,如果我对现有任务进行更改,它们应该在下次运行时生效,但是注册新任务呢?我知道重新启动守护进程不会杀死正在运行的工作程序,而是让它们自己死掉,但它仍然看起来很危险.这个问题有优雅的解决方案吗?
我一直很乐意在生产中运行芹菜+ rabbitmq + django一个月左右.昨天,我决定从芹菜2.1.4升级到2.2.4,现在rabbitmq正在失去控制.运行一段时间后,我的节点不再被evcam识别,并且beam.smp的内存消耗开始增加......缓慢(100 +%CPU使用率).
我可以运行rabbitmqctl list_connections,看到没有什么不寻常的(只是我的一个测试节点).我可以看到rabbitmqctl list_queues -p <VHOST>除了测试节点的心跳之外没有其他消息.如果我让这个过程持续运行几个小时,它会使机器最大化.
我尝试使用camqadm无效的清除各种队列,stop_app只是挂起.我找到"修复"它的唯一方法是kill -9在我的rabbitmq服务器上使用beam.smp(以及所有相关进程)和force_reset.
我不知道如何调试这个.对于新消息等,似乎没有任何可疑的事情发生.有没有人在此之前遇到过这种情况?有任何想法吗?我应该关注哪些其他信息?
我有3个芹菜节点,每个节点运行6到8个工人,我的任务往往会占用大量内存.似乎当任务完成时,它们不会释放内存.有没有办法告诉工作进程死亡并在执行完成后重新启动,或者改进芹菜的垃圾收集?
我正在运行Celery 2.2.4/djCelery 2.2.4,使用RabbitMQ 2.1.1作为后端.我最近在网上带来了两台新的芹菜服务器 - 我在两台机器上运行了2名工作人员,总共有18个线程,在我的新加工盒子上(36g RAM +双超线程四核),我正在运行10每个都有8个线程的工作者,总共180个线程 - 我的任务都很小,所以这应该没问题.
过去几天节点一直运行良好,但今天我注意到它.delaay()正在悬挂.当我打断它时,我看到一个指向这里的追溯:
File "/home/django/deployed/releases/20110608183345/virtual-env/lib/python2.5/site-packages/celery/task/base.py", line 324, in delay
return self.apply_async(args, kwargs)
File "/home/django/deployed/releases/20110608183345/virtual-env/lib/python2.5/site-packages/celery/task/base.py", line 449, in apply_async
publish.close()
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/kombu/compat.py", line 108, in close
self.backend.close()
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/amqplib/client_0_8/channel.py", line 194, in close
(20, 41), # Channel.close_ok
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/amqplib/client_0_8/abstract_channel.py", line 89, in wait
self.channel_id, allowed_methods)
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/amqplib/client_0_8/connection.py", line 198, in _wait_method
self.method_reader.read_method()
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/amqplib/client_0_8/method_framing.py", line 212, in read_method
self._next_method()
File "/home/django/deployed/virtual-env/lib/python2.5/site-packages/amqplib/client_0_8/method_framing.py", line 127, in _next_method
frame_type, channel, payload = self.source.read_frame()
File …Run Code Online (Sandbox Code Playgroud) 我们刚刚将MySQL数据库从MyIsam切换到Innodb,我们看到Django出现了一个奇怪的问题.每当我们进行数据库事务时,现有的会话都不会捡起它...... 我们可以从mysql终端看到数据库中的新记录,但是现有的django会话(即已经打开的shell)不会注册更改.例如:
壳牌1:
>>> my_obj = MyObj.objects.create(foo="bar")
>>> my_obj.pk
1
Run Code Online (Sandbox Code Playgroud)
壳牌2(在上述之前开放)
>>> my_obj = MyObj.objects.filter(pk=1)
[]
Run Code Online (Sandbox Code Playgroud)
Shell 3(MySQL):
mysql> select id from myapp_my_obj where id = 1;
id
1
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会发生这种情况?
编辑:为了澄清,Shell 2在Shell 1之前打开,然后我创建了Shell 1,然后我尝试查看我在Shell 2中创建的对象.
编辑2:总的来说,我有一个芹菜任务正在从创建的对象传递主键.当我使用MyISAM时,它每次都找到它,现在它会抛出ObjectDoesNotExist,即使我可以看到该对象是在数据库中创建的.
有没有人找到一种方法来欺骗桌面桌面在发布报告时所做的请求?我显然知道他们没有提供API,但似乎只需要进行身份验证,然后POST工作簿就可以了.有没有人找到办法做到这一点?我经常发布一些工作簿(我可以使用sed/awk进行微小的更改),我想设置一个脚本来自动化该过程.