在我们的项目中,我们使用 djangoSessionMiddleware来处理用户会话,并且运行良好。这里唯一的问题是当PermissionDenied异常发生时,错误及其回溯将在控制台中打印出来!然而,正如预期的那样,通过引发该异常,403页面将显示给用户,但我认为这似乎不合理,因为这里的中间件正在处理异常!就像未找到异常一样,我希望控制台中不会出现错误。有什么不对的吗?!
这是中间件设置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_otp.middleware.OTPMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'axes.middleware.AxesMiddleware',
]
Run Code Online (Sandbox Code Playgroud)
这是打印的错误:
Forbidden (Permission denied): /the/not_allowed/page
Traceback (most recent call last):
File "/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3.8/contextlib.py", line 75, in inner
return func(*args, **kwds)
File "/our_project/base/decorators.py", line 88, in wrapper
return view_func(request, *args, **kwargs)
File …Run Code Online (Sandbox Code Playgroud) 问题:我已经为一个模型实现了一个自定义管理器,只有一个命名的自定义查询集get_by_tag,如果我这样使用它,它就可以正常工作:
ViewStatistic.objects.get_by_tag('some-tag-name').filter(user=user_id)
Run Code Online (Sandbox Code Playgroud)
但是当我改变查询的顺序时,以这种方式:
ViewStatistic.objects.filter(user=user_id).get_by_tag('some-tag-name')
Run Code Online (Sandbox Code Playgroud)
它不起作用!并引发此错误:
AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud)
我是不是错过了什么?!我怎样才能按照这样的顺序做到这一点?
PS:自定义管理器是这样的:
AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud) 我有一个模型,有一个用于显示其创建时间的字段,名为created_time. 我不想created_time在创建模型时被要求,但我希望它位于从模型检索的数据中!
这是它的序列化器:
class MyModelSerializer(ModelSerializer):
class Meta:
model = Model
fields = ['name', 'created_time']
Run Code Online (Sandbox Code Playgroud)
这是它的视图集:
class ModelApiView(ModelViewSet):
serializer_class = MyModelSerializer
def get_queryset(self):
return Model.objects.filter(user=self.request.user.id)
def perform_create(self, serializer):
serializer.save(user=self.request.user, created_time=datetime.now())
Run Code Online (Sandbox Code Playgroud)
现在,根据get请求,它发送一个模型对象列表,其中name和created_time是完美的。但是,当我发布要创建的新模型(仅包含其)时name,它会向我发送以下错误消息:
{
"datetime": [
"This field is required."
]
}
Run Code Online (Sandbox Code Playgroud) python django datetime django-serializer django-rest-framework
在settings.py文件中我写了这个设置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
Run Code Online (Sandbox Code Playgroud)
当我使用password grant应用程序中的令牌调用任何 API 时,它工作正常,但是当我尝试使用client credential grant应用程序中的令牌调用相同的 API 时,它不起作用并且它响应 403 错误:
{ "detail": "You do not have permission to perform this action." }.
Run Code Online (Sandbox Code Playgroud)
是因为默认权限吗?我不知道我必须使用什么权限来代替!?