我已经根据django rest框架Docs实现了令牌认证.
从我读到的形式来看,DRF的令牌认证非常简单 - 每个用户一个令牌,令牌不会过期并且始终有效(我是对的吗?).
我知道有更好的做法,但是现在DRF令牌认证对我来说很好.
我的问题是 -使用普通DRF令牌身份验证注销的最佳做法是什么?
我的意思是,当用户注销时,我应该从客户端删除令牌吗?然后登录再次获取令牌?我应该删除令牌并生成一个新令牌吗?
有经验的人吗?
login token logout django-rest-framework http-token-authentication
Django 强烈建议 不要使用null=True
CharField和TextField基于字符串的字段,以便不为"无数据"提供两个可能的值(假设您允许使用空字符串blank=True
).这对我来说很有意义,我在所有项目中都这样做.
Django 1.9引入了JSONField,它使用底层的Postgres jsonb
数据类型.上面的建议是否会延续到JSONField(即blank=True
应该用于代替null=True
)?或者,应该null=True
使用?或者,应该default=dict
使用?要么, ..?为什么?
换句话说,当您只想允许一个"无数据"值时,新的本机JSONField的约定是什么?请支持你的答案,因为我做了很多研究,找不到任何正式的.提前致谢.
我有一个大量定制的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
我在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中,假设我有三个词:
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) 从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 ×5
django ×4
amazon-s3 ×1
dictionary ×1
for-loop ×1
http-headers ×1
import ×1
javascript ×1
json ×1
jsonb ×1
login ×1
logout ×1
postgresql ×1
token ×1