小编Bac*_*con的帖子

Django中基于令牌的身份验证

我试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法.一个外部的非django应用程序正在设置一个带有令牌的cookie,我有一个可以根据该令牌检索用户信息的web服务.如果用户设置了cookie,则他们不需要在我的站点上进行身份验证,并且应该根据Web服务传回的信息自动登录.在我看来,有几个不同的选项来执行实际检查,我不确定哪个是最好的:

  1. 编写一个自定义装饰器,就像这个片段中的那个一样,而不是使用它 login_required.
  2. 通过ajax调用在base_site中调用自定义身份验证方法.在每个页面上,都会进行检查,如果cookie存在且有效,则用户将自动登录.
  3. 将一些javascript添加到LOGIN_REDIRECT_URL将在ajax调用中检查/验证cookie 的页面,并在cookie经过身份验证时自动重定向回引用者.

我有遗失的选择吗?理想情况下,有一种方法可以将其构建login_required,而无需编写自定义装饰器.

django

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

在一个键上加入两个词典列表

鉴于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中执行此操作的最有效方法是什么?

python

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

可怕的"不同的对象错误"腌制queryset.query对象

我有一个查询集,我需要懒惰地腌制,我有一些严重的麻烦.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.DecimalDjango 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)

python django serialization pickle

23
推荐指数
2
解决办法
6314
查看次数

检索mptt查询集的祖先的查询集的高效函数

有没有人有一个有效的算法来检索一个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)

这种方法存在两个问题:

  1. 如果存在彼此不相邻的分支(即它确实不起作用),它将失败
  2. 这是非常低效的,因为它最终number_of_trees*number_of_levels在最终查询中有条款,它可以非常快地变得非常大

我愿意在其他地方缓存祖先,但我想不出有效的方法.我考虑添加一个字段,用逗号分隔的祖先id的列表,然后GROUP_CONCAT在一个额外的内部做一个(我在MySQL中),但我认为这可能会变得很大/很慢.

python django mptt django-mptt hierarchical-data

15
推荐指数
2
解决办法
2981
查看次数

用于公钥认证的bash/ssh测试

有没有办法以编程方式测试ssh是否可以使用公钥进行身份验证?我想做这样的事情(最好是在bash,但我对python解决方案开放):

ssh-test-thingy user@host || echo "could not authenticate using publickey"
Run Code Online (Sandbox Code Playgroud)

其中ssh-test-thingy返回非零退出状态,如果在远程主机上不公钥匹配.

ssh bash public-key-encryption

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

旋转rabbitmq日志文件的最佳方法

我的兔子日志变得非常大,我想知道是否有更好的方法来控制旋转.我希望日志根据大小进行旋转,并且一次最多保留10个日志.到目前为止我发现的最好的是你可以通过放入SERVER_START_ARGS="-kernel error_logger silent"rabbitmq.conf文件来关闭日志记录.有没有更好的办法?我想避免使用crontab.

logging rabbitmq

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

在不暂停服务的情况下将新代码部署到生产芹菜集群的可靠方法

我有几个芹菜节点在使用rabbitmq生产中运行,我一直在处理服务中断的部署.我必须取下整个网站,以便将新代码部署到芹菜中.我将每个子项的最大任务设置为1,所以理论上,如果我对现有任务进行更改,它们应该在下次运行时生效,但是注册新任务呢?我知道重新启动守护进程不会杀死正在运行的工作程序,而是让它们自己死掉,但它仍然看起来很危险.这个问题有优雅的解决方案吗?

python django celery

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

rabbitmq +芹菜内存泄漏?

我一直很乐意在生产中运行芹菜+ 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.

我不知道如何调试这个.对于新消息等,似乎没有任何可疑的事情发生.有没有人在此之前遇到过这种情况?有任何想法吗?我应该关注哪些其他信息?

django rabbitmq celery

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

芹菜记忆管理

我有3个芹菜节点,每个节点运行6到8个工人,我的任务往往会占用大量内存.似乎当任务完成时,它们不会释放内存.有没有办法告诉工作进程死亡并在执行完成后重新启动,或者改进芹菜的垃圾收集?

python celery

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

celery .delay挂起(最近,不是auth问题)

我正在运行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)

python django rabbitmq celery

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

django/innodb - 旧会话和交易的问题

我们刚刚将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,即使我可以看到该对象是在数据库中创建的.

mysql django innodb celery

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

发布没有tableau桌面的tableau工作簿(twb或twbx)

有没有人找到一种方法来欺骗桌面桌面在发布报告时所做的请求?我显然知道他们没有提供API,但似乎只需要进行身份验证,然后POST工作簿就可以了.有没有人找到办法做到这一点?我经常发布一些工作簿(我可以使用sed/awk进行微小的更改),我想设置一个脚本来自动化该过程.

http tableau-api

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