c67*_*754 4 python django django-rest-framework
我有一个简单的 DRF 列表视图,想要编写一些与POST请求相关的权限。GET这导致发出请求时出现错误。这让我意识到我的权限类在未提交的请求上被多次调用。这是我的文件。
权限.py:
class IsDummy(permissions.BasePermission):
def has_permission(self, request, view):
print("\n{}\n".format(request.method))
if request.method in permissions.SAFE_METHODS:
return True
return False
Run Code Online (Sandbox Code Playgroud)
视图.py:
class UserListView(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsDummy]
Run Code Online (Sandbox Code Playgroud)
仅当我从浏览器向可浏览 api 提交请求时,才会出现此问题。当我在列表 url 提交 GET 请求时,我会从IsDummy权限类中的打印语句将以下内容打印到终端:
GET
POST
POST
OPTIONS
Run Code Online (Sandbox Code Playgroud)
当我通过邮递员提交GET或OPTIONS请求时,我会看到我实际使用的单一、适当的请求方法。
似乎列出的第一个方法始终是我使用的实际方法,我不知道额外的POSTs 和 theOPTION来自哪里。更奇怪的是,即使请求POST显然应该IsDummy.has_permission返回一个False.
chrome 开发工具只显示一个GET正在提交的请求,因为它似乎只发生在可浏览的 api 中,我确信它与此有关,但我不知道我搞砸了什么才能实现这种情况。
浏览器API是一个可以添加\更新\删除实例的单页。当你询问这个页面时,DRF会检查所有需要的权限,看看相应的模块是否允许显示。
在 DRF 源代码深处,您可以在以下位置看到这一点renderers.py:
class BrowsableAPIRenderer(BaseRenderer):
"""
HTML renderer used to self-document the API.
"""
media_type = 'text/html'
format = 'api'
template = 'rest_framework/api.html'
filter_template = 'rest_framework/filters/base.html'
code_style = 'emacs'
charset = 'utf-8'
form_renderer_class = HTMLFormRenderer
...
def get_context(self, data, accepted_media_type, renderer_context):
....
context = {
....
'put_form': self.get_rendered_html_form(data, view, 'PUT', request),
'post_form': self.get_rendered_html_form(data, view, 'POST', request),
'delete_form': self.get_rendered_html_form(data, view, 'DELETE', request),
'options_form': self.get_rendered_html_form(data, view, 'OPTIONS', request),
}
return context
def get_rendered_html_form(self, data, view, method, request):
....
if not self.show_form_for_method(view, method, request, instance):
....
def show_form_for_method(self, view, method, request, obj):
"""
Returns True if a form should be shown for this method.
"""
if method not in view.allowed_methods:
return # Not a valid method
try:
view.check_permissions(request)
if obj is not None:
view.check_object_permissions(request, obj)
except exceptions.APIException:
return False # Doesn't have permissions
return True
Run Code Online (Sandbox Code Playgroud)
view.check_permissions(request)这show_form_for_method就是为什么 DRF 可浏览 API 对每个实际请求的多个请求类型运行权限检查。
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |