小编Clo*_*ans的帖子

django rest framework - 令牌认证注销

我已经根据django rest框架Docs实现了令牌认证.

从我读到的形式来看,DRF的令牌认证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我是对的吗?).

我知道有更好的做法,但是现在DRF令牌认证对我来说很好.

我的问题是 -使用普通DRF令牌身份验证注销的最佳做法什么?

我的意思是,当用户注销时,我应该从客户端删除令牌吗?然后登录再次获取令牌?我应该删除令牌并生成一个新令牌吗?

有经验的人吗?

login token logout django-rest-framework http-token-authentication

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

在Django 1.9中,使用JSONField(本机postgres jsonb)的惯例是什么?

Django 强烈建议 不要使用null=TrueCharField和TextField基于字符串的字段,以便不为"无数据"提供两个可能的值(假设您允许使用空字符串blank=True).这对我来说很有意义,我在所有项目中都这样做.

Django 1.9引入了JSONField,它使用底层的Postgres jsonb数据类型.上面的建议是否会延续到JSONField(即blank=True应该用于代替null=True)?或者,应该null=True使用?或者,应该default=dict使用?要么, ..?为什么?

换句话说,当您只想允许一个"无数据"值时,新的本机JSONField的约定是什么?请支持你的答案,因为我做了很多研究,找不到任何正式的.提前致谢.

python django postgresql json jsonb

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

如何在Django admin home中加载自定义JS文件?

我有一个大量定制的Django管理员,为我的每个ModelAdmins加载一个自定义JS文件非常简单:

class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/mymodel.js',)
Run Code Online (Sandbox Code Playgroud)

但是我如何为管理"主页"执行此操作,其中列出了我的所有管理模型?

更新#1:修改我的问题,因为如果我不能有效地包含Django的jQuery,下面的解决方案就不那么有用了.那么,我如何在JS文件中包含Django的jQuery?如果我用我的代码包装(就像我在其他的ModelAdmin JS文件中那样):

(function ($) { //... })(django.jQuery);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ReferenceError:未定义django.

谢谢.

更新#2:我能够通过以下答案成功地包含Django的jQuery:https://stackoverflow.com/a/10584539/585783

javascript python django

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

Django Rest Framework:使用令牌身份验证时,重定向到Amazon S3失败

我在DRF中使用令牌身份验证,对于某个API调用,想要重定向到S3(使用类似的URL https://my_bucket.s3.amazonaws.com/my/file/path/my_file.jpg?Signature=MY_AWS_SIGNATURE&AWSAccessKeyId=MY_AWS_ACCESS_KEY_ID).但是,我从AWS收到以下错误:

<Error>
  <Code>InvalidArgument</Code>
  <Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message>
  <ArgumentName>Authorization</ArgumentName>
  <ArgumentValue>Token a3f61c10592272399099882eb178bd4b755af5bf</ArgumentValue>
  <RequestId>E4038228DD1E6330</RequestId>
  <HostId>9c2xX59cugrR0CHjxQJR8IBE4MXBbNMX+wX2JdPJEuerkAftc32rufotM7COKLIavakByuRUXOo=</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

很清楚为什么会发生这种情况 - Authorization带有DRF令牌的标头会随着重定向传播而S3不喜欢它.

在研究并尝试了一百万种方法来摆脱那个标题之后,我放弃了并决定尝试用S3值覆盖标题:AWS MY_AWS_SIGNATURE:MY_AWS_ACCESS_KEY_ID之后我得到了一个不同的错误:

<Error>
  <Code>InvalidArgument</Code>
  <Message>Unsupported Authorization Type</Message>
  <ArgumentName>Authorization</ArgumentName>
  <ArgumentValue>Token a3f61c10592272399099882eb178bd4b755af5bf</ArgumentValue>
  <RequestId>94D5ADA28C6A5BFB</RequestId>
  <HostId>1YznL6UC3V0+nCvilsriHDAnP2/h3MoDlIJ/L+0V6w7nbHbf2bSxoQflujGmQ5PrUZpNiH7GywI=</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

如您所见,最终结果是相同的 - 即使我Authorization在响应中覆盖标头,它仍保留原始DRF令牌身份验证值.

# relevant portion of my response construction
headers = {'Location': 'https://my_bucket.s3.amazonaws.com/my/file/path/my_file.jpg',
           'Authorization': 'AWS %s:%s' % (params['AWSAccessKeyId'], params['Signature'])}
return Response(status=status.HTTP_302_FOUND, headers=headers)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,如何Authorization删除或覆盖DRF响应中的标头?

python django amazon-s3 http-headers django-rest-framework

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

我可以连续迭代几个dicts而不合并它们吗?

在python中,假设我有三个词:

d1, d2, d3 = {...}, {...}, {...}
Run Code Online (Sandbox Code Playgroud)

我需要迭代它们中的每一个并执行相同的操作:

for k, v in d1.iteritems():
    do_some_stuff(k, v)
for k, v in d3.iteritems():
    do_some_stuff(k, v)
for k, v in d3.iteritems():
    do_some_stuff(k, v)
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个循环中执行此操作,以便每个字典连续迭代?像这样的东西,但语法明显不正确:

for k, v in d1.iteritems(), d2.iteritems(), d3.iteritems():
    do_some_stuff(k, v)
Run Code Online (Sandbox Code Playgroud)

并不想合并的字典.我能想到的最好的是下面的嵌套循环,但似乎应该有"更多的pythonic,单循环方式".

for d in (d1, d2, d3):
    for k, v in d.iteritems():
        do_some_stuff(k, v)
Run Code Online (Sandbox Code Playgroud)

python dictionary for-loop

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

正确导入单个Django设置常量以避免完全设置导入开销?

Django - 导入django.conf.settings和导入设置之间的区别,我理解导入设置文件的可接受方式:

from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

我还读过Python中的好或坏练习:在文件中间导入.其中一个答案将您带到http://mail.python.org/pipermail/python-list/2001-July/699176.html,其中第2点和第4点与我的问题相关.

假设我有一个巨大的settings.py,在我的Django代码中,我只需要在一个很少调用的方法中使用像MEDIA_ROOT这样的"低"常量.因此,导入整个settings.py似乎非常浪费:

from django.conf import settings
...
def foo():
    my_media_root = settings.MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)

当我可以导入一个所需的常量:

from settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)

因此,如果my_media_root仅用于该文件中的多个方法中的一个,则避免导入巨大的settings.py,尤其是因为它甚至可能永远不会被使用.当然,这是不好的做法,但这种"良好做法版本"不起作用:

from django.conf.settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)

因为,按照设计,它会导致预期的ImportError: No module named settings例外.

所以,我的问题是,从大的settings.py导入一个常量的正确方法是什么?提前致谢.

python django import

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